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
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)))
+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 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)
-6
View File
@@ -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`