se procesa archivo gtfs

francisco/photos
Francisco Sandoval 2024-02-04 17:22:21 -03:00
parent e2b5e7aadd
commit 90d4d9d223
4 changed files with 61 additions and 31 deletions

View File

@ -7,7 +7,15 @@ ALTER TABLE linea_paradero drop CONSTRAINT IF EXISTS linea_paradero_id_linea_fke
-----
delete from gtfs_calendar ;
ALTER TABLE gtfs_stop_times drop CONSTRAINT IF EXISTS fk_gtfs_sto_reference_gtfs_tri;
-----
ALTER TABLE gtfs_frequencie drop CONSTRAINT IF EXISTS fk_gtfs_fre_reference_gtfs_tri;
-----
DELETE FROM gtfs_calendar;
-----
@ -46,24 +54,22 @@ delete from linea_paradero;
update linea
set vigente = false
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
and id_linea not in (select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
and id_linea not in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
);
inner join z_trips zt on zr.route_id =zt.route_id
);
-----
update linea
set vigente = true
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
and id_linea in (select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
and id_linea in (
select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
from z_routes zr
inner join z_trips zt
on zr.route_id =zt.route_id
);
inner join z_trips zt on zr.route_id =zt.route_id
);
-----
@ -128,7 +134,7 @@ order by 1;
-----
delete from gtfs_shape;
truncate table gtfs_shape;
-----
@ -139,15 +145,15 @@ from z_shapes zs;
-----
delete from gtfs_stop_times;
truncate table gtfs_stop_times;
-----
delete from gtfs_frequencie;
truncate table gtfs_frequencie;
-----
delete from gtfs_trips;
truncate table gtfs_trips;
-----
@ -156,7 +162,7 @@ select
trip_id,
trim(route_id)||'-'||trim(direction_id::varchar) as route_id,
shape_id::numeric ,null as regreso, trip_headsign,trip_short_name,direction_id::numeric,service_id::varchar,block_id
from z_trips zt ;
from z_trips zt;
-----
@ -191,8 +197,12 @@ SET stop_name = REGEXP_REPLACE(
);
-----
update paradero
set id_comuna = (select id_comuna from comuna_georeferencia as c where ST_Contains(c.geom, ST_SetSRID(ST_MakePoint(paradero.stop_lon, paradero.stop_lat), 4326)) limit 1);
update paradero
set id_comuna = (select id_comuna from comuna_georeferencia as c where ST_Contains(c.geom, ST_SetSRID(ST_MakePoint(paradero.stop_lon, paradero.stop_lat), 4326)) limit 1)
where id_comuna is not null;
-----
delete from rol_linea where id_linea not in (select id_linea from linea);
-----
@ -203,3 +213,11 @@ ALTER TABLE rol_linea ADD CONSTRAINT rol_linea_id_linea_fkey FOREIGN KEY (id_lin
ALTER TABLE linea_paradero ADD CONSTRAINT linea_paradero_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_linea);
-----
ALTER TABLE gtfs_stop_times ADD CONSTRAINT fk_gtfs_sto_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT;
-----
ALTER TABLE gtfs_frequencie ADD CONSTRAINT fk_gtfs_fre_reference_gtfs_tri FOREIGN KEY (id_trip) REFERENCES gtfs_trips(id_trip) ON DELETE RESTRICT ON UPDATE RESTRICT;
-----

View File

@ -1,4 +1,5 @@
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.db import connection
from api.models import GtfsArchivo, RedTransporte
from decouple import config
@ -7,6 +8,7 @@ import csv
import zipfile
import tempfile
import threading
import datetime
class Command(BaseCommand):
help = 'Procesa los archivos gtfs en formato comprimido (zip)'
@ -14,25 +16,31 @@ class Command(BaseCommand):
def handle(self, *args, **options):
# Lógica de tu comando aquí
folder = config('GTFS_UPLOADS','/tmp')
fecha_hoy = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
redes = RedTransporte.objects.filter(vigente=True)
for red in redes:
print(f'nombre red: {red.nombre_red}')
self.stdout.write(self.style.SUCCESS(f'nombre red: {red.nombre_red}'))
gtfs_archivo = GtfsArchivo.objects \
.filter(vigente=False, id_red = red.id_red, status = 'PENDIENTE') \
.order_by('-created').first()
.filter(vigente=False, id_red = red.id_red, status = 'PENDIENTE', created__gte = fecha_hoy) \
.order_by('-created') \
.first()
if gtfs_archivo != None:
gtfs_archivo.status = 'PROCESANDO'
gtfs_archivo.save()
filepath = os.path.join(folder, gtfs_archivo.ruta_archivo)
print(f'procesa: {filepath}')
procesa_zip(filepath)
registro_anterior = GtfsArchivo.objects.filter(vigente=True, id_red = red.id_red)
if registro_anterior:
registro_anterior.vigente = False
registro_anterior.save()
gtfs_archivo.status = 'PROCESADO'
gtfs_archivo.status = 'GTFS CARGADO'
gtfs_archivo.vigente = True
gtfs_archivo.save()

View File

@ -2,9 +2,10 @@
from rest_framework import viewsets
# from rest_framework.response import Response
from rest_framework.decorators import action, api_view
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from django.db import connection
from .. import models, serializers
from api import models, serializers
from django.http import JsonResponse, HttpResponse
from django.forms.models import model_to_dict
from os import getenv
@ -16,8 +17,9 @@ import logging
class LineaViewSet(viewsets.ModelViewSet):
queryset = models.Linea.objects.all()
serializer_class = serializers.LineaSerializer
filter_backends = [DjangoFilterBackend]
filter_backends = [DjangoFilterBackend, OrderingFilter]
filterset_fields = ['id_operador', 'route_short_name', 'route_long_name', 'vigente', 'rollinea__id_rol']
ordering_fields = '__all__'
def list(self, request, pk=None, *args, **kwargs):
login = request.jwt_info['login']

View File

@ -3,14 +3,16 @@ from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework import status
from .. import models, serializers
from api import models, serializers
class OperadorViewSet(viewsets.ModelViewSet):
queryset = models.Operador.objects.all()
serializer_class = serializers.OperadorSerializer
filter_backends = [DjangoFilterBackend]
filter_backends = [DjangoFilterBackend, OrderingFilter]
filterset_fields = ['id_region', 'nombre_operador', 'vigente']
ordering_fields = '__all__'
def create(self, request, *args, **kwargs):
# Comprueba si 'id_operador' está presente en la petición y no está vacío