diff --git a/project/api/management/commands/actualiza_GTFS.sql b/project/api/management/commands/actualiza_GTFS.sql index 0e3ee9b..69329ff 100644 --- a/project/api/management/commands/actualiza_GTFS.sql +++ b/project/api/management/commands/actualiza_GTFS.sql @@ -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) - from z_routes zr - inner join z_trips zt - on zr.route_id =zt.route_id - - ); +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 +); ----- 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) - from z_routes zr - inner join z_trips zt - on zr.route_id =zt.route_id - - ); +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 +); ----- @@ -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,9 +197,13 @@ 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); + ----- ALTER TABLE rol_linea ADD CONSTRAINT rol_linea_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_linea); @@ -202,4 +212,12 @@ 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; + ----- \ No newline at end of file diff --git a/project/api/management/commands/procesa_zip.py b/project/api/management/commands/procesa_zip.py index e01833c..5fc5f5f 100644 --- a/project/api/management/commands/procesa_zip.py +++ b/project/api/management/commands/procesa_zip.py @@ -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) - registro_anterior.vigente = False - registro_anterior.save() + 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() diff --git a/project/api/views/linea.py b/project/api/views/linea.py index a58ec49..682fa5b 100755 --- a/project/api/views/linea.py +++ b/project/api/views/linea.py @@ -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'] diff --git a/project/api/views/operador.py b/project/api/views/operador.py index 40a350e..4388cdb 100755 --- a/project/api/views/operador.py +++ b/project/api/views/operador.py @@ -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