From 892e2b525221f212df25f5a25b3e5ce0e2fcf797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juuso=20K=C3=A4enm=C3=A4ki?= Date: Wed, 18 Jan 2017 17:26:47 +0200 Subject: [PATCH] - Created model for timetable-data management - Updated infoscreen hsl command - Fixed all depending code --- infoscreen/management/commands/hsl.py | 6 +- infoscreen/models.py | 10 +++ infoscreen/static/html/hsl_create.html | 10 +++ infoscreen/static/js/infoadmin_controllers.js | 6 ++ .../static/js/infoscreen_controllers.js | 74 +++++++++++-------- infoscreen/views.py | 12 ++- sikweb/urls.py | 4 + 7 files changed, 87 insertions(+), 35 deletions(-) create mode 100644 infoscreen/static/html/hsl_create.html 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),