- Created model for timetable-data management

- Updated infoscreen hsl command
- Fixed all depending code
This commit is contained in:
Juuso Käenmäki
2017-01-18 17:26:47 +02:00
parent 869de82c5c
commit 892e2b5252
7 changed files with 87 additions and 35 deletions
+3 -3
View File
@@ -2,6 +2,7 @@ import json
import urllib.request import urllib.request
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from infoscreen.models import HSLDataModel
class Command(BaseCommand): class Command(BaseCommand):
help = 'Loads HSL timetables and save to json file.' help = 'Loads HSL timetables and save to json file.'
@@ -11,8 +12,7 @@ class Command(BaseCommand):
data = json.loads(src); data = json.loads(src);
arr=[] arr=[]
for element in data: 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] parsed = json.loads(src)[0]
arr.append({"name":parsed['name_fi'],"lines":parsed['lines'],"dist":element['dist'],"departures":parsed['departures']}) 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: HSLDataModel.objects.create(data = json.dumps(arr))
file.write(json.dumps(arr))
+10
View File
@@ -95,6 +95,13 @@ class ImageInfoItem(InfoItem):
d["options"] = {'img': self.img.url} d["options"] = {'img': self.img.url}
return d 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): class ExternalImageInfoItem(InfoItem):
url = models.TextField() url = models.TextField()
@@ -201,3 +208,6 @@ class ImageUploadForm(forms.Form):
name = forms.CharField() name = forms.CharField()
image = forms.ImageField() image = forms.ImageField()
class HSLDataModel(models.Model):
data = models.TextField(default="", editable=False)
+10
View File
@@ -0,0 +1,10 @@
<div ng-controller="infoadmin_hslitem_create" style="margin-top:20px;">
<div>
Create new item to show hsl ttimetables. Name is used only as identifier
</div>
<div class="form-group">
<label>Name:</label>
<input type="text" ng-model="item.name"></input>
</div>
<input type="button" class="btn btn-success" ng-click="send()" value="create"></input>
</div>
@@ -136,6 +136,12 @@ app.controller('infoadmin_sossoitem_create', function($scope, $http,ItemList){
$http.post("/infoscreen/create_sossoitem", $scope.item).then(ItemList.loadItems) $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) { app.controller('infoadmin_image_create', ['$scope', 'Upload', '$timeout',"ItemList", function ($scope, Upload, $timeout,ItemList) {
$scope.send = function(file) { $scope.send = function(file) {
+44 -30
View File
@@ -1,4 +1,4 @@
var activescope;
var app = angular.module('infoApp', ['ngAnimate', 'ngRoute', 'monospaced.qrcode']); var app = angular.module('infoApp', ['ngAnimate', 'ngRoute', 'monospaced.qrcode']);
app.controller('infoscreen_main', function($scope,$http,$timeout){ app.controller('infoscreen_main', function($scope,$http,$timeout){
var templates = []; var templates = [];
@@ -66,56 +66,69 @@ app.controller('SossoController', function($scope, $http) {
$scope.data = response.data; $scope.data = response.data;
}) })
}); });
app.controller('timetableCtrl', app.controller('timetableCtrl',
function($scope, $http, $interval) { function($scope, $http, $interval) {
function load(){ function load(){
$http.get('/static/js/hsl.json') $http.get('/infoscreen/hsl_data')
.then(function(data, status, headers, config) { .then(function(data, status, headers, config) {
$scope.arr=[]; $scope.arr=[];
parse(data); parse(data);
}); });
}; };
var obj; $scope.$on('$destroy', function() {
$interval.cancel(inter1);
$interval.cancel(inter2);
});
var objects;
$scope.arr=[]; $scope.arr=[];
var dict=[]; var dict=[];
function parse(data){ function parse(data){
obj=data['data']; objects=data['data'];
for(var a in obj){ for(var objectIndex in objects){
for(var b in obj[a]['lines']){ var stop = objects[objectIndex];
var elem=obj[a]['lines'][b].split(":"); for(var lineIndex in stop['lines']){
var elem=stop['lines'][lineIndex].split(":");
dict[elem[0]]=elem[1]; dict[elem[0]]=elem[1];
} }
for(var b in obj[a]['departures']){ for(var lineIndex in stop['departures']){
var e=true; var line = stop['departures'][lineIndex];
var time=obj[a]['departures'][b]['time']; var time=line['time'];
date=obj[a]['departures'][b]['date']; date=line['date'];
if(time<1000) if(time<1000)
var unit = 1; var unit = 1;
else else
var unit = 2; var unit = 2;
var hh= Math.floor(obj[a]['departures'][b]['time']/100); var hours= Math.floor(line['time']/100);
if(hh>=24){ if(hours>=24){
hh-=24; hours-=24;
date++; date++;
} }
var mm= obj[a]['departures'][b]['time']%100; var minutes= line['time']%100;
var c= obj[a]['departures'][b]['code'].substring(1,5); var code= line['code'].substring(1,5);
if(c.charAt(0)=='0') if(code.charAt(0)=='0')
c=c.substring(1,4); code=code.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]}; temp={"stop":stop['name'].split(",")[0],
for(var i= $scope.arr.length-1;i>=0;i--) "dist":stop['dist'],
if( $scope.arr[i]['bus']==z['bus'] && $scope.arr[i]['laststop']==z['laststop']){ "bus":code,
if( $scope.arr[i]['dist']==z['dist']){ "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; break;
} }
else if( $scope.arr[i]['dist'] > z['dist']){ else if( $scope.arr[objectIndex]['dist'] > temp['dist']){
$scope.arr.splice(i,1); $scope.arr.splice(objectIndex,1);
} }
else else
e=false; trigger=false;
} }
if(e){ if(trigger){
$scope.arr.push(z); $scope.arr.push(temp);
} }
} }
@@ -146,7 +159,8 @@ app.controller('timetableCtrl',
} }
} }
load(); load();
var t=$interval(delOld,2000); var inter1=$interval(delOld,2000);
var z=$interval(load,60000); var inter2=$interval(load,10000);
} }
); );
+10 -2
View File
@@ -7,9 +7,9 @@ from django.contrib.auth.decorators import permission_required
from django.utils import timezone from django.utils import timezone
from infoscreen.models import Rotation, InfoItem, InfoInstance 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 ImageUploadForm
from infoscreen.models import HSLDataModel
from datetime import datetime, timedelta from datetime import datetime, timedelta
import json import json
import logging import logging
@@ -170,8 +170,16 @@ def deleteRotation(request, *args, **kwargs):
return resp 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) createInstance = itemCreator(InfoInstance)
deleteInstance = itemDeletor(InfoInstance) deleteInstance = itemDeletor(InfoInstance)
createABBItem = itemCreator(ABBInfoItem) createABBItem = itemCreator(ABBInfoItem)
createSossoItem = itemCreator(SossoInfoItem) createSossoItem = itemCreator(SossoInfoItem)
createHslItem = itemCreator(HslInfoItem)
createExternalImageInfoItem = itemCreator(ExternalImageInfoItem) createExternalImageInfoItem = itemCreator(ExternalImageInfoItem)
+4
View File
@@ -44,8 +44,10 @@ from infoscreen.views import createExternalImageInfoItem
from infoscreen.views import createImageItem from infoscreen.views import createImageItem
from infoscreen.views import createABBItem from infoscreen.views import createABBItem
from infoscreen.views import createSossoItem from infoscreen.views import createSossoItem
from infoscreen.views import createHslItem
from infoscreen.views import createRotation from infoscreen.views import createRotation
from infoscreen.views import deleteRotation from infoscreen.views import deleteRotation
from infoscreen.views import CurrentHSLView
from infoscreen.views import admin as infoscreen_admin from infoscreen.views import admin as infoscreen_admin
#application #application
from members.views import applicationindex from members.views import applicationindex
@@ -83,9 +85,11 @@ urlpatterns = [
url(r'^infoscreen/create_image$', createImageItem), url(r'^infoscreen/create_image$', createImageItem),
url(r'^infoscreen/create_abbitem$', createABBItem), url(r'^infoscreen/create_abbitem$', createABBItem),
url(r'^infoscreen/create_sossoitem$', createSossoItem), url(r'^infoscreen/create_sossoitem$', createSossoItem),
url(r'^infoscreen/create_hslitem$', createHslItem),
url(r'^infoscreen/admin$', infoscreen_admin), url(r'^infoscreen/admin$', infoscreen_admin),
url(r'^infoscreen/create_rotation$', createRotation), url(r'^infoscreen/create_rotation$', createRotation),
url(r'^infoscreen/delete_rotation/(?P<id>\d+)$', deleteRotation), url(r'^infoscreen/delete_rotation/(?P<id>\d+)$', deleteRotation),
url(r'^infoscreen/hsl_data$',CurrentHSLView),
#application #application
url(r'^application/$', applicationindex), url(r'^application/$', applicationindex),
url(r'^application/success$', applicationSuccessIndex), url(r'^application/success$', applicationSuccessIndex),