- Created model for timetable-data management
- Updated infoscreen hsl command - Fixed all depending code
This commit is contained in:
@@ -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))
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user