Fetch HSL timetables with threads instead of cron

This commit is contained in:
Jan Tuomi
2017-01-21 19:55:14 +02:00
parent 81a7f0a4a4
commit a16c9f4f78
4 changed files with 25 additions and 19 deletions
-11
View File
@@ -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'."
+16 -1
View File
@@ -2,10 +2,20 @@ from infoscreen.models import HSLDataModel
from django.conf import settings from django.conf import settings
import urllib.request import urllib.request
import json import json
import logging
from datetime import datetime, timedelta
class HSLFetcher: 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): def fetch(self):
location_coords = (2545565, 6675319) location_coords = (2545565, 6675319)
src = urllib.request.urlopen( src = urllib.request.urlopen(
@@ -26,3 +36,8 @@ class HSLFetcher:
"dist": element['dist'], "departures": parsed['departures']}) "dist": element['dist'], "departures": parsed['departures']})
HSLDataModel.objects.create(data=json.dumps(arr)) 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)))
+9 -1
View File
@@ -9,8 +9,10 @@ from infoscreen.models import Rotation, InfoItem, InfoInstance
from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem
from infoscreen.models import ImageUploadForm from infoscreen.models import ImageUploadForm
from infoscreen.models import HSLDataModel from infoscreen.models import HSLDataModel
from infoscreen.hsl_fetcher import HSLFetcher
import json import json
import logging import logging
import threading
def index(request, idx, *args, **kwargs): def index(request, idx, *args, **kwargs):
@@ -184,11 +186,17 @@ def delete_rotation(request, *args, **kwargs):
@require_http_methods(["GET"]) @require_http_methods(["GET"])
def CurrentHSLView(request, *args, **kwargs): 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() data = HSLDataModel.objects.all()
if len(data) < 1: if len(data) < 1:
return HttpResponse('{"error" : "Could not find timetables from database."}', status=500) 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) createInstance = create_item_generator(InfoInstance)
deleteInstance = delete_item_generator(InfoInstance) deleteInstance = delete_item_generator(InfoInstance)
-6
View File
@@ -56,12 +56,6 @@ pip install --upgrade pip
pip install -r requirements.txt pip install -r requirements.txt
``` ```
### Register cron jobs
```
./add_cronjob.sh
```
## Configure Django settings ## Configure Django settings
`cp sikweb/settings-sample.py sikweb/settings.py` `cp sikweb/settings-sample.py sikweb/settings.py`