From a16c9f4f783ec29bf874c3ce35ce0be0522b0c57 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sat, 21 Jan 2017 19:55:14 +0200 Subject: [PATCH] Fetch HSL timetables with threads instead of cron --- add_cronjob.sh | 11 ----------- infoscreen/hsl_fetcher.py | 17 ++++++++++++++++- infoscreen/views.py | 10 +++++++++- readme.md | 6 ------ 4 files changed, 25 insertions(+), 19 deletions(-) delete mode 100755 add_cronjob.sh diff --git a/add_cronjob.sh b/add_cronjob.sh deleted file mode 100755 index f6ecd20..0000000 --- a/add_cronjob.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -echo "Adding cron entries..." -# write out current crontab -crontab -l > temp_crontab -# echo new cron into cron file -printf "*/5 * * * * source $PWD/../virtualenv.sikweb/bin/activate && python $PWD/manage.py hsl &>$PWD/logs/fetch_hsl.log\n\n" >> temp_crontab -# install new cron file -crontab temp_crontab -rm temp_crontab -echo "Done. View your crontab with 'crontab -l' and edit it with 'crontab -e'." diff --git a/infoscreen/hsl_fetcher.py b/infoscreen/hsl_fetcher.py index 8ba1351..c85e239 100644 --- a/infoscreen/hsl_fetcher.py +++ b/infoscreen/hsl_fetcher.py @@ -2,10 +2,20 @@ from infoscreen.models import HSLDataModel from django.conf import settings import urllib.request import json - +import logging +from datetime import datetime, timedelta class HSLFetcher: + last_fetched = datetime.fromtimestamp(0) # epoch + INTERVAL = 1 # minutes + + logging.info("Set up scheduled HSL API fetch every {} minutes".format(INTERVAL)) + + def fetch_if_needed(self): + if datetime.now() - HSLFetcher.last_fetched > timedelta(minutes=HSLFetcher.INTERVAL): + self.fetch() + def fetch(self): location_coords = (2545565, 6675319) src = urllib.request.urlopen( @@ -26,3 +36,8 @@ class HSLFetcher: "dist": element['dist'], "departures": parsed['departures']}) HSLDataModel.objects.create(data=json.dumps(arr)) + + now = datetime.now() + HSLFetcher.last_fetched = now + + logging.info("Fetched HSL timetable data with size {} bytes.".format(len(src))) diff --git a/infoscreen/views.py b/infoscreen/views.py index 2d7bd8f..4b7d9c7 100644 --- a/infoscreen/views.py +++ b/infoscreen/views.py @@ -9,8 +9,10 @@ from infoscreen.models import Rotation, InfoItem, InfoInstance from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem from infoscreen.models import ImageUploadForm from infoscreen.models import HSLDataModel +from infoscreen.hsl_fetcher import HSLFetcher import json import logging +import threading def index(request, idx, *args, **kwargs): @@ -184,11 +186,17 @@ def delete_rotation(request, *args, **kwargs): @require_http_methods(["GET"]) def CurrentHSLView(request, *args, **kwargs): + + fetcher = HSLFetcher() + fetcherThread = threading.Thread(target=fetcher.fetch_if_needed, args=[]) + fetcherThread.setDaemon(False) + fetcherThread.start() + data = HSLDataModel.objects.all() if len(data) < 1: return HttpResponse('{"error" : "Could not find timetables from database."}', status=500) - return HttpResponse(data[len(data)-1].data, status=200) + return HttpResponse(data[len(data) - 1].data, status=200) createInstance = create_item_generator(InfoInstance) deleteInstance = delete_item_generator(InfoInstance) diff --git a/readme.md b/readme.md index 91242c1..926e5ae 100644 --- a/readme.md +++ b/readme.md @@ -56,12 +56,6 @@ pip install --upgrade pip pip install -r requirements.txt ``` -### Register cron jobs - -``` -./add_cronjob.sh -``` - ## Configure Django settings `cp sikweb/settings-sample.py sikweb/settings.py`