gtfsrt_concepcion/fetcher/main.py

55 lines
2.5 KiB
Python
Raw Normal View History

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