"""File containing Infoscreen HSL data fetcher classes.""" import requests import json import logging import os import pytz from datetime import timedelta, datetime from django.utils import timezone, dateparse from django.utils.dateformat import format from django.conf import settings with open(os.path.join(settings.BASE_DIR, 'infoscreen', 'hsl_stops.graphql')) as stops_file: STOPS_QUERY = stops_file.read() with open(os.path.join(settings.BASE_DIR, 'infoscreen', 'hsl_stops_variables.json')) as vars_file: STOPS_VARS = json.loads(vars_file.read()) API_URL = 'https://api.digitransit.fi/routing/v1/routers/hsl/index/graphql' API_HEADERS = {'Content-Type': 'application/json'} def fetch(): """Fetch data from HSL API.""" query_vars = STOPS_VARS.copy() query_vars['startTime_6'] = format(timezone.now(), 'U') post_data = json.dumps({ 'operationName': 'NearestRoutesContainer', 'query': STOPS_QUERY, 'variables': query_vars, }) resp = requests.post(API_URL, data=post_data, headers=API_HEADERS) data = resp.json() items = data['data']['viewer']['_nearest']['edges'] places = map(lambda item: item['node']['place'], items) schedule = [] for place in places: route = place['pattern']['route']['shortName'] stop_times = place['_stoptimes'] for stop_time in stop_times: timestamp = time_utc = stop_time['serviceDay'] + stop_time['realtimeArrival'] headsign = stop_time['stopHeadsign'] stop_name = stop_time['stop']['name'] time_diff = (timestamp - timezone.now().timestamp()) / 60 # minutes if time_diff < settings.HSL_DEPARTURE_THRESHOLD: continue elif time_diff < settings.HSL_HURRY_THRESHOLD: time = '{} min'.format(int(time_diff)) else: time = pytz.utc.localize(datetime.fromtimestamp(timestamp)).strftime('%H:%M') schedule.append({ 'route': route, 'headsign': headsign, 'timestamp': time, 'stop': stop_name, 'utc': time_utc, }) return schedule