Fetch HSL timetables with threads instead of cron
This commit is contained in:
@@ -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'."
|
|
||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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`
|
||||||
|
|||||||
Reference in New Issue
Block a user