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 update linea
set vigente = false set vigente = false
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' ) 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 (
from z_routes zr select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
inner join z_trips zt from z_routes zr
on zr.route_id =zt.route_id inner join z_trips zt on zr.route_id =zt.route_id
);
);
----- -----
update linea update linea
set vigente = true set vigente = true
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' ) 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 (
from z_routes zr select trim(zr.route_id)||'-'||trim(zt.direction_id::varchar)
inner join z_trips zt from z_routes zr
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, trip_id,
trim(route_id)||'-'||trim(direction_id::varchar) as route_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 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 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); 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); 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 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.core.management.base import BaseCommand
from django.utils import timezone
from django.db import connection from django.db import connection
from api.models import GtfsArchivo, RedTransporte from api.models import GtfsArchivo, RedTransporte
from decouple import config from decouple import config
@ -7,6 +8,7 @@ import csv
import zipfile import zipfile
import tempfile import tempfile
import threading import threading
import datetime
class Command(BaseCommand): class Command(BaseCommand):
help = 'Procesa los archivos gtfs en formato comprimido (zip)' help = 'Procesa los archivos gtfs en formato comprimido (zip)'
@ -14,25 +16,31 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
# Lógica de tu comando aquí # Lógica de tu comando aquí
folder = config('GTFS_UPLOADS','/tmp') folder = config('GTFS_UPLOADS','/tmp')
fecha_hoy = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
redes = RedTransporte.objects.filter(vigente=True) redes = RedTransporte.objects.filter(vigente=True)
for red in redes: 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 \ gtfs_archivo = GtfsArchivo.objects \
.filter(vigente=False, id_red = red.id_red, status = 'PENDIENTE') \ .filter(vigente=False, id_red = red.id_red, status = 'PENDIENTE', created__gte = fecha_hoy) \
.order_by('-created').first() .order_by('-created') \
.first()
if gtfs_archivo != None: if gtfs_archivo != None:
gtfs_archivo.status = 'PROCESANDO'
gtfs_archivo.save()
filepath = os.path.join(folder, gtfs_archivo.ruta_archivo) filepath = os.path.join(folder, gtfs_archivo.ruta_archivo)
print(f'procesa: {filepath}') print(f'procesa: {filepath}')
procesa_zip(filepath) procesa_zip(filepath)
registro_anterior = GtfsArchivo.objects.filter(vigente=True, id_red = red.id_red) registro_anterior = GtfsArchivo.objects.filter(vigente=True, id_red = red.id_red)
registro_anterior.vigente = False if registro_anterior:
registro_anterior.save() registro_anterior.vigente = False
registro_anterior.save()
gtfs_archivo.status = 'PROCESADO' gtfs_archivo.status = 'GTFS CARGADO'
gtfs_archivo.vigente = True gtfs_archivo.vigente = True
gtfs_archivo.save() gtfs_archivo.save()

View File

@ -2,9 +2,10 @@
from rest_framework import viewsets from rest_framework import viewsets
# from rest_framework.response import Response # from rest_framework.response import Response
from rest_framework.decorators import action, api_view from rest_framework.decorators import action, api_view
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from django.db import connection from django.db import connection
from .. import models, serializers from api import models, serializers
from django.http import JsonResponse, HttpResponse from django.http import JsonResponse, HttpResponse
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
from os import getenv from os import getenv
@ -16,8 +17,9 @@ import logging
class LineaViewSet(viewsets.ModelViewSet): class LineaViewSet(viewsets.ModelViewSet):
queryset = models.Linea.objects.all() queryset = models.Linea.objects.all()
serializer_class = serializers.LineaSerializer 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'] 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): def list(self, request, pk=None, *args, **kwargs):
login = request.jwt_info['login'] 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.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework import status from rest_framework import status
from .. import models, serializers from api import models, serializers
class OperadorViewSet(viewsets.ModelViewSet): class OperadorViewSet(viewsets.ModelViewSet):
queryset = models.Operador.objects.all() queryset = models.Operador.objects.all()
serializer_class = serializers.OperadorSerializer serializer_class = serializers.OperadorSerializer
filter_backends = [DjangoFilterBackend] filter_backends = [DjangoFilterBackend, OrderingFilter]
filterset_fields = ['id_region', 'nombre_operador', 'vigente'] filterset_fields = ['id_region', 'nombre_operador', 'vigente']
ordering_fields = '__all__'
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
# Comprueba si 'id_operador' está presente en la petición y no está vacío # Comprueba si 'id_operador' está presente en la petición y no está vacío