2023-09-16 12:07:33 -03:00
from apscheduler . schedulers . background import BlockingScheduler
from fetcher . model . feed import db , Registros
from tempfile import NamedTemporaryFile
from shutil import copyfile
from datetime import datetime
2023-09-29 18:46:55 -03:00
from zoneinfo import ZoneInfo
2023-11-14 16:19:49 -03:00
from sqlalchemy . exc import SQLAlchemyError
2023-09-16 12:07:33 -03:00
import requests
import logging
import time
import sys
import os
log = logging . getLogger ( ' Fetcher ' )
log . setLevel ( logging . DEBUG )
handler = logging . StreamHandler ( sys . stdout )
handler . setLevel ( logging . INFO )
formatter = logging . Formatter ( ' %(asctime)s - %(levelname)s - %(message)s ' )
handler . setFormatter ( formatter )
log . addHandler ( handler )
def load_proto ( ) :
2023-09-29 18:46:55 -03:00
inicio = datetime . now ( tz = ZoneInfo ( " America/Santiago " ) )
2023-09-16 12:07:33 -03:00
final_dir = " static/ccp/ {} / {} / {} " . format ( inicio . strftime ( " % Y " ) , inicio . strftime ( " % m " ) , inicio . strftime ( " %d " ) )
final_name = " static/ccp/ {} / {} / {} /ccp_gtfs_ {} .proto " . format ( inicio . strftime ( " % Y " ) , inicio . strftime ( " % m " ) , inicio . strftime ( " %d " ) , inicio . strftime ( " % Y % m %d _ % H % M_ % S " ) )
try :
2023-10-23 18:17:23 -03:00
response = requests . get ( " {} ?apikey= {} " . format ( os . environ . get ( ' GTFS_RT_ENDPOINT ' ) , os . environ . get ( ' GTFS_RT_KEY ' ) ) , timeout = 15 )
2023-09-16 12:07:33 -03:00
response . raise_for_status ( )
with NamedTemporaryFile ( ) as tmp :
tmp . write ( response . content )
os . makedirs ( os . path . abspath ( final_dir ) , exist_ok = True )
copyfile ( tmp . name , os . path . abspath ( final_name ) )
nuevo_registro = Registros ( filename = final_name , status = 0 )
db . add ( nuevo_registro )
db . commit ( )
2023-09-29 18:46:55 -03:00
log . info ( " Fetched GTFS-RT Record {} in {} s " . format ( inicio . strftime ( " % Y % m %d _ % H % M_ % S " ) , ( datetime . now ( tz = ZoneInfo ( " America/Santiago " ) ) - inicio ) . total_seconds ( ) ) )
2023-11-14 16:19:49 -03:00
except PendingRollbackError :
db . rollback ( )
except SQLAlchemyError as e :
import traceback
log . error ( " Failed to fetch GTFS-RT Record {} in {} s " . format ( inicio . strftime ( " % Y % m %d _ % H % M_ % S " ) , ( datetime . now ( tz = ZoneInfo ( " America/Santiago " ) ) - inicio ) . total_seconds ( ) ) )
log . info ( ' Traceback {} ' . format ( traceback . format_exc ( ) ) )
raise ( e )
2023-09-16 12:07:33 -03:00
except :
import traceback
2023-09-29 18:46:55 -03:00
log . error ( " Failed to fetch GTFS-RT Record {} in {} s " . format ( inicio . strftime ( " % Y % m %d _ % H % M_ % S " ) , ( datetime . now ( tz = ZoneInfo ( " America/Santiago " ) ) - inicio ) . total_seconds ( ) ) )
2023-09-16 12:07:33 -03:00
log . info ( ' Traceback {} ' . format ( traceback . format_exc ( ) ) )
nuevo_registro = Registros ( filename = final_name , status = 100 )
db . add ( nuevo_registro )
db . commit ( )
sched = BlockingScheduler ( )
sched . add_job ( load_proto , ' interval ' , seconds = int ( os . environ . get ( ' GTFS_RT_INTERVAL ' ) ) ) #will do the print_t work for every 30 seconds