diff --git a/infoscreen/management/commands/hsl.py b/infoscreen/management/commands/hsl.py
index a38b1d2..e789e13 100644
--- a/infoscreen/management/commands/hsl.py
+++ b/infoscreen/management/commands/hsl.py
@@ -2,6 +2,7 @@ import json
import urllib.request
from django.conf import settings
from django.core.management.base import BaseCommand
+from infoscreen.models import HSLDataModel
class Command(BaseCommand):
help = 'Loads HSL timetables and save to json file.'
@@ -11,8 +12,7 @@ class Command(BaseCommand):
data = json.loads(src);
arr=[]
for element in data:
- src = urllib.request.urlopen("http://api.reittiopas.fi/hsl/prod/?userhash="+userhash+"&request=stop&code="+element['code']).read().decode("utf-8")
+ src = urllib.request.urlopen("http://api.reittiopas.fi/hsl/prod/?userhash="+settings.HSL_USERHASH+"&request=stop&code="+element['code']).read().decode("utf-8")
parsed = json.loads(src)[0]
arr.append({"name":parsed['name_fi'],"lines":parsed['lines'],"dist":element['dist'],"departures":parsed['departures']})
- with open('{}/hsl.json'.format(settings.MEDIA_ROOT),'w') as file:
- file.write(json.dumps(arr))
+ HSLDataModel.objects.create(data = json.dumps(arr))
diff --git a/infoscreen/models.py b/infoscreen/models.py
index cb87252..e118537 100644
--- a/infoscreen/models.py
+++ b/infoscreen/models.py
@@ -95,6 +95,13 @@ class ImageInfoItem(InfoItem):
d["options"] = {'img': self.img.url}
return d
+class HslInfoItem(InfoItem):
+ def get_template_url(self):
+ return "/static/html/hsl.html"
+ @staticmethod
+ def get_create_template_url():
+ return "/static/html/hsl_create.html"
+
class ExternalImageInfoItem(InfoItem):
url = models.TextField()
@@ -201,3 +208,6 @@ class ImageUploadForm(forms.Form):
name = forms.CharField()
image = forms.ImageField()
+class HSLDataModel(models.Model):
+ data = models.TextField(default="", editable=False)
+
diff --git a/infoscreen/static/html/hsl_create.html b/infoscreen/static/html/hsl_create.html
new file mode 100644
index 0000000..724fe72
--- /dev/null
+++ b/infoscreen/static/html/hsl_create.html
@@ -0,0 +1,10 @@
+
+
+ Create new item to show hsl ttimetables. Name is used only as identifier
+
+
+
+
+
+
+
diff --git a/infoscreen/static/js/infoadmin_controllers.js b/infoscreen/static/js/infoadmin_controllers.js
index 1e0ca2a..d1959aa 100644
--- a/infoscreen/static/js/infoadmin_controllers.js
+++ b/infoscreen/static/js/infoadmin_controllers.js
@@ -136,6 +136,12 @@ app.controller('infoadmin_sossoitem_create', function($scope, $http,ItemList){
$http.post("/infoscreen/create_sossoitem", $scope.item).then(ItemList.loadItems)
}
});
+app.controller('infoadmin_hslitem_create', function($scope, $http,ItemList){
+ $scope.item = {}
+ $scope.send = function(){
+ $http.post("/infoscreen/create_hslitem", $scope.item).then(ItemList.loadItems)
+ }
+});
app.controller('infoadmin_image_create', ['$scope', 'Upload', '$timeout',"ItemList", function ($scope, Upload, $timeout,ItemList) {
$scope.send = function(file) {
diff --git a/infoscreen/static/js/infoscreen_controllers.js b/infoscreen/static/js/infoscreen_controllers.js
index 60246ea..f06d634 100644
--- a/infoscreen/static/js/infoscreen_controllers.js
+++ b/infoscreen/static/js/infoscreen_controllers.js
@@ -1,4 +1,4 @@
-
+var activescope;
var app = angular.module('infoApp', ['ngAnimate', 'ngRoute', 'monospaced.qrcode']);
app.controller('infoscreen_main', function($scope,$http,$timeout){
var templates = [];
@@ -66,56 +66,69 @@ app.controller('SossoController', function($scope, $http) {
$scope.data = response.data;
})
});
+
app.controller('timetableCtrl',
function($scope, $http, $interval) {
function load(){
- $http.get('/static/js/hsl.json')
+ $http.get('/infoscreen/hsl_data')
.then(function(data, status, headers, config) {
$scope.arr=[];
parse(data);
});
};
- var obj;
+ $scope.$on('$destroy', function() {
+ $interval.cancel(inter1);
+ $interval.cancel(inter2);
+ });
+ var objects;
$scope.arr=[];
var dict=[];
function parse(data){
- obj=data['data'];
- for(var a in obj){
- for(var b in obj[a]['lines']){
- var elem=obj[a]['lines'][b].split(":");
+ objects=data['data'];
+ for(var objectIndex in objects){
+ var stop = objects[objectIndex];
+ for(var lineIndex in stop['lines']){
+ var elem=stop['lines'][lineIndex].split(":");
dict[elem[0]]=elem[1];
}
- for(var b in obj[a]['departures']){
- var e=true;
- var time=obj[a]['departures'][b]['time'];
- date=obj[a]['departures'][b]['date'];
+ for(var lineIndex in stop['departures']){
+ var line = stop['departures'][lineIndex];
+ var time=line['time'];
+ date=line['date'];
if(time<1000)
var unit = 1;
else
var unit = 2;
- var hh= Math.floor(obj[a]['departures'][b]['time']/100);
- if(hh>=24){
- hh-=24;
+ var hours= Math.floor(line['time']/100);
+ if(hours>=24){
+ hours-=24;
date++;
}
- var mm= obj[a]['departures'][b]['time']%100;
- var c= obj[a]['departures'][b]['code'].substring(1,5);
- if(c.charAt(0)=='0')
- c=c.substring(1,4);
- z={"stop":obj[a]['name'].split(",")[0],"dist":obj[a]['dist'],"bus":c,"date":date,"time":pad(hh,2)+":"+pad(mm,2),"laststop":dict[obj[a]['departures'][b]['code']].split(",")[0].split(" ")[0]};
- for(var i= $scope.arr.length-1;i>=0;i--)
- if( $scope.arr[i]['bus']==z['bus'] && $scope.arr[i]['laststop']==z['laststop']){
- if( $scope.arr[i]['dist']==z['dist']){
+ var minutes= line['time']%100;
+ var code= line['code'].substring(1,5);
+ if(code.charAt(0)=='0')
+ code=code.substring(1,4);
+ temp={"stop":stop['name'].split(",")[0],
+ "dist":stop['dist'],
+ "bus":code,
+ "date":date,
+ "time":pad(hours,2)+":"+pad(minutes,2),
+ "laststop":dict[line['code']].split(",")[0].split(" ")[0]
+ };
+ var trigger=true;
+ for(var objectIndex= $scope.arr.length-1;objectIndex>=0;objectIndex--)
+ if( $scope.arr[objectIndex]['bus']==temp['bus'] && $scope.arr[objectIndex]['laststop']==temp['laststop']){
+ if( $scope.arr[objectIndex]['dist']==temp['dist']){
break;
}
- else if( $scope.arr[i]['dist'] > z['dist']){
- $scope.arr.splice(i,1);
+ else if( $scope.arr[objectIndex]['dist'] > temp['dist']){
+ $scope.arr.splice(objectIndex,1);
}
else
- e=false;
- }
- if(e){
- $scope.arr.push(z);
+ trigger=false;
+ }
+ if(trigger){
+ $scope.arr.push(temp);
}
}
@@ -146,7 +159,8 @@ app.controller('timetableCtrl',
}
}
load();
- var t=$interval(delOld,2000);
- var z=$interval(load,60000);
+ var inter1=$interval(delOld,2000);
+ var inter2=$interval(load,10000);
}
);
+
diff --git a/infoscreen/views.py b/infoscreen/views.py
index 7f3c47b..0aff4d4 100644
--- a/infoscreen/views.py
+++ b/infoscreen/views.py
@@ -7,9 +7,9 @@ from django.contrib.auth.decorators import permission_required
from django.utils import timezone
from infoscreen.models import Rotation, InfoItem, InfoInstance
-from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem
+from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem
from infoscreen.models import ImageUploadForm
-
+from infoscreen.models import HSLDataModel
from datetime import datetime, timedelta
import json
import logging
@@ -170,8 +170,16 @@ def deleteRotation(request, *args, **kwargs):
return resp
+@require_http_methods(["GET"])
+def CurrentHSLView(request, *args, **kwargs):
+ 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)
+
createInstance = itemCreator(InfoInstance)
deleteInstance = itemDeletor(InfoInstance)
createABBItem = itemCreator(ABBInfoItem)
createSossoItem = itemCreator(SossoInfoItem)
+createHslItem = itemCreator(HslInfoItem)
createExternalImageInfoItem = itemCreator(ExternalImageInfoItem)
diff --git a/sikweb/urls.py b/sikweb/urls.py
index 76e75ad..d5655ec 100644
--- a/sikweb/urls.py
+++ b/sikweb/urls.py
@@ -44,8 +44,10 @@ from infoscreen.views import createExternalImageInfoItem
from infoscreen.views import createImageItem
from infoscreen.views import createABBItem
from infoscreen.views import createSossoItem
+from infoscreen.views import createHslItem
from infoscreen.views import createRotation
from infoscreen.views import deleteRotation
+from infoscreen.views import CurrentHSLView
from infoscreen.views import admin as infoscreen_admin
#application
from members.views import applicationindex
@@ -83,9 +85,11 @@ urlpatterns = [
url(r'^infoscreen/create_image$', createImageItem),
url(r'^infoscreen/create_abbitem$', createABBItem),
url(r'^infoscreen/create_sossoitem$', createSossoItem),
+ url(r'^infoscreen/create_hslitem$', createHslItem),
url(r'^infoscreen/admin$', infoscreen_admin),
url(r'^infoscreen/create_rotation$', createRotation),
url(r'^infoscreen/delete_rotation/(?P\d+)$', deleteRotation),
+ url(r'^infoscreen/hsl_data$',CurrentHSLView),
#application
url(r'^application/$', applicationindex),
url(r'^application/success$', applicationSuccessIndex),