Clean old infoscreen code and statics
This commit is contained in:
@@ -5,7 +5,6 @@ sikweb/settings.py
|
|||||||
*.sqlite3
|
*.sqlite3
|
||||||
uwsgi.ini
|
uwsgi.ini
|
||||||
uwsgi.log
|
uwsgi.log
|
||||||
infoscreen/static/js/hsl.json
|
|
||||||
members/logs/*
|
members/logs/*
|
||||||
.idea/
|
.idea/
|
||||||
logs/
|
logs/
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
"""File containing Infoscreen HSL data fetcher classes."""
|
|
||||||
|
|
||||||
import requests
|
|
||||||
import json
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
import pytz
|
|
||||||
|
|
||||||
from datetime import timedelta, datetime
|
|
||||||
from django.utils import timezone, dateparse
|
|
||||||
from django.utils.dateformat import format
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
|
|
||||||
with open(os.path.join(settings.BASE_DIR, 'infoscreen', 'hsl_stops.graphql')) as stops_file:
|
|
||||||
STOPS_QUERY = stops_file.read()
|
|
||||||
|
|
||||||
with open(os.path.join(settings.BASE_DIR, 'infoscreen', 'hsl_stops_variables.json')) as vars_file:
|
|
||||||
STOPS_VARS = json.loads(vars_file.read())
|
|
||||||
|
|
||||||
API_URL = 'https://api.digitransit.fi/routing/v1/routers/hsl/index/graphql'
|
|
||||||
API_HEADERS = {'Content-Type': 'application/json'}
|
|
||||||
|
|
||||||
|
|
||||||
def fetch():
|
|
||||||
"""Fetch data from HSL API."""
|
|
||||||
|
|
||||||
query_vars = STOPS_VARS.copy()
|
|
||||||
query_vars['startTime_6'] = format(timezone.now(), 'U')
|
|
||||||
|
|
||||||
post_data = json.dumps({
|
|
||||||
'operationName': 'NearestRoutesContainer',
|
|
||||||
'query': STOPS_QUERY,
|
|
||||||
'variables': query_vars,
|
|
||||||
})
|
|
||||||
|
|
||||||
resp = requests.post(API_URL, data=post_data, headers=API_HEADERS)
|
|
||||||
|
|
||||||
data = resp.json()
|
|
||||||
|
|
||||||
items = data['data']['viewer']['_nearest']['edges']
|
|
||||||
places = map(lambda item: item['node']['place'], items)
|
|
||||||
|
|
||||||
schedule = []
|
|
||||||
for place in places:
|
|
||||||
route = place['pattern']['route']['shortName']
|
|
||||||
stop_times = place['_stoptimes']
|
|
||||||
for stop_time in stop_times:
|
|
||||||
timestamp = time_utc = stop_time['serviceDay'] + stop_time['realtimeArrival']
|
|
||||||
headsign = stop_time['stopHeadsign']
|
|
||||||
stop_name = stop_time['stop']['name']
|
|
||||||
time_diff = (timestamp - timezone.now().timestamp()) / 60 # minutes
|
|
||||||
|
|
||||||
if time_diff < settings.HSL_DEPARTURE_THRESHOLD:
|
|
||||||
continue
|
|
||||||
elif time_diff < settings.HSL_HURRY_THRESHOLD:
|
|
||||||
time = '{} min'.format(int(time_diff))
|
|
||||||
else:
|
|
||||||
time = pytz.utc.localize(datetime.fromtimestamp(timestamp)).strftime('%H:%M')
|
|
||||||
|
|
||||||
schedule.append({
|
|
||||||
'route': route,
|
|
||||||
'headsign': headsign,
|
|
||||||
'timestamp': time,
|
|
||||||
'stop': stop_name,
|
|
||||||
'utc': time_utc,
|
|
||||||
})
|
|
||||||
|
|
||||||
return schedule
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
query NearestRoutesContainer($lat_0: Float!, $lon_1: Float!, $maxDistance_2: Int!, $maxResults_3: Int!, $timeRange_7: Int!, $numberOfDepartures_8: Int!, $filterByModes_4: [Mode]!, $filterByPlaceTypes_5: [FilterPlaceType]!, $startTime_6: Long!) {
|
|
||||||
viewer {
|
|
||||||
...F5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment F0 on DepartureRow {
|
|
||||||
_stoptimes4caEfh: stoptimes(startTime: $startTime_6, timeRange: $timeRange_7, numberOfDepartures: $numberOfDepartures_8) {
|
|
||||||
pickupType
|
|
||||||
serviceDay
|
|
||||||
realtimeDeparture
|
|
||||||
}
|
|
||||||
id
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment F1 on DepartureRow {
|
|
||||||
pattern {
|
|
||||||
route {
|
|
||||||
shortName
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_stoptimes: stoptimes(startTime: $startTime_6, timeRange: $timeRange_7, numberOfDepartures: $numberOfDepartures_8) {
|
|
||||||
realtimeArrival
|
|
||||||
serviceDay
|
|
||||||
stopHeadsign
|
|
||||||
stop {
|
|
||||||
name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment F2 on BikeRentalStation {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment F3 on placeAtDistance {
|
|
||||||
distance
|
|
||||||
place {
|
|
||||||
id
|
|
||||||
__typename
|
|
||||||
...F1
|
|
||||||
...F2
|
|
||||||
}
|
|
||||||
id
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment F4 on placeAtDistanceConnection {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
distance
|
|
||||||
place {
|
|
||||||
id
|
|
||||||
__typename
|
|
||||||
...F0
|
|
||||||
}
|
|
||||||
id
|
|
||||||
...F3
|
|
||||||
}
|
|
||||||
cursor
|
|
||||||
}
|
|
||||||
pageInfo {
|
|
||||||
hasNextPage
|
|
||||||
hasPreviousPage
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment F5 on QueryType {
|
|
||||||
_nearest: nearest(lat: $lat_0, lon: $lon_1, maxDistance: $maxDistance_2, maxResults: $maxResults_3, first: $maxResults_3, filterByModes: $filterByModes_4, filterByPlaceTypes: $filterByPlaceTypes_5) {
|
|
||||||
...F4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"lat_0": 60.190480099999995,
|
|
||||||
"lon_1": 24.8275665,
|
|
||||||
"maxDistance_2": 1000,
|
|
||||||
"maxResults_3": 50,
|
|
||||||
"numberOfDepartures_8": 2,
|
|
||||||
"timeRange_7": 7200,
|
|
||||||
"filterByModes_4": ["BUS"],
|
|
||||||
"filterByPlaceTypes_5": ["DEPARTURE_ROW"]
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
from django.core.management.base import BaseCommand
|
|
||||||
from infoscreen.hsl_fetcher import HSLFetcher
|
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = 'Loads HSL timetables and save to json file.'
|
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
|
||||||
fetcher = HSLFetcher()
|
|
||||||
fetcher.fetch()
|
|
||||||
@@ -15,4 +15,11 @@ class Migration(migrations.Migration):
|
|||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='HSLDataModel',
|
name='HSLDataModel',
|
||||||
),
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='hslinfoitem',
|
||||||
|
name='infoitem_ptr',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='HslInfoItem',
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -254,21 +254,6 @@ class VideoInfoItem(InfoItem):
|
|||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
class HslInfoItem(InfoItem):
|
|
||||||
"""Class for HSL Infoscreen item."""
|
|
||||||
|
|
||||||
display_name = _("HSL timetables")
|
|
||||||
|
|
||||||
def get_template_url(self):
|
|
||||||
"""Return HSL infoitem template url."""
|
|
||||||
return "/static/infoscreen/html/hsl.html"
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_create_template_url():
|
|
||||||
"""Call create HSL infoitem template url command."""
|
|
||||||
return "/static/infoscreen/html/hsl_create.html"
|
|
||||||
|
|
||||||
|
|
||||||
class ExternalImageInfoItem(InfoItem):
|
class ExternalImageInfoItem(InfoItem):
|
||||||
"""Class for External Image Infoscreen item."""
|
"""Class for External Image Infoscreen item."""
|
||||||
|
|
||||||
|
|||||||
@@ -1,74 +0,0 @@
|
|||||||
table {
|
|
||||||
font-size: 4vh;
|
|
||||||
font-family: 'Droid Sans Mono', monospace;
|
|
||||||
}
|
|
||||||
.red {
|
|
||||||
color: red;
|
|
||||||
-webkit-animation-name: blinker;
|
|
||||||
-webkit-animation-duration: 2s;
|
|
||||||
-webkit-animation-timing-function: linear;
|
|
||||||
-webkit-animation-iteration-count: infinite;
|
|
||||||
|
|
||||||
-moz-animation-name: blinker;
|
|
||||||
-moz-animation-duration: 2s;
|
|
||||||
-moz-animation-timing-function: linear;
|
|
||||||
-moz-animation-iteration-count: infinite;
|
|
||||||
|
|
||||||
animation-name: blinker;
|
|
||||||
animation-duration: 2s;
|
|
||||||
animation-timing-function: linear;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
}
|
|
||||||
.black {
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
@-moz-keyframes blinker {
|
|
||||||
0% { opacity: 1.0; }
|
|
||||||
50% { opacity: 0.1; }
|
|
||||||
100% { opacity: 1.0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@-webkit-keyframes blinker {
|
|
||||||
0% { opacity: 1.0; }
|
|
||||||
50% { opacity: 0.1; }
|
|
||||||
100% { opacity: 1.0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes blinker {
|
|
||||||
0% { opacity: 1.0; }
|
|
||||||
50% { opacity: 0.1; }
|
|
||||||
100% { opacity: 1.0; }
|
|
||||||
}
|
|
||||||
thead{
|
|
||||||
background: #f0f0f0;
|
|
||||||
}
|
|
||||||
.header-row{
|
|
||||||
background: #f0f0f0;
|
|
||||||
font-size: 7vh;
|
|
||||||
font-family: 'Droid Sans Mono', monospace;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
width: 100vw;
|
|
||||||
padding: 0 0 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container .table {
|
|
||||||
margin-left: 0;
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.repeat-item.ng-leave {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.repeat-item.ng-leave.ng-leave-active {
|
|
||||||
opacity: 0;
|
|
||||||
font-size: 0vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.repeat-item.ng-leave{
|
|
||||||
opacity: 1;
|
|
||||||
font-size: 5vh;
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<link rel="stylesheet" href="/static/infoscreen/css/coffee.css">
|
|
||||||
<iframe src="https://host2.kilta.aalto.fi/kahvi/cups" allowfullscreen=true sandbox="allow-scripts allow-pointer-lock allow-same-origin">
|
|
||||||
<p>Your browser does not support iframes.</p>
|
|
||||||
</iframe>
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
<link rel="stylesheet" href="/static/infoscreen/css/hsl.css">
|
|
||||||
<link href="https://fonts.googleapis.com/css?family=Droid+Sans+Mono" rel="stylesheet">
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/locale/fi.js"></script>
|
|
||||||
<div class="container" ng-app="myApp" ng-controller="timetableCtrl">
|
|
||||||
<div class="header-row row">
|
|
||||||
<div class="col-sm-2"><p>{{clock | date:'HH:mm'}}</p></div>
|
|
||||||
<div class="col-sm-8">HSL-Aikataulut</div>
|
|
||||||
<div class="col-sm-2 time"></div>
|
|
||||||
</div>
|
|
||||||
<h1 style="font-size: 10vh; text-align: center" ng-if="error">
|
|
||||||
{{error}}
|
|
||||||
</h1>
|
|
||||||
<table ng-if="!error" class="table table-striped row">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
Aika
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
Linja
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
Pysäkki
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr class="repeat-item" ng-repeat="x in stoptimes | orderBy: ['utc'] | limitTo: 11">
|
|
||||||
<td style="min-width: 300px">
|
|
||||||
{{x.timestamp}}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<strong>{{x.route}}</strong>, {{x.headsign}}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{x.stop}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
<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" class="form-control" ng-model="item.name"></input>
|
|
||||||
</div>
|
|
||||||
<input type="button" class="btn btn-success" ng-click="send()" value="create"></input>
|
|
||||||
</div>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<h1>testi2</h1>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<h1>testi3</h1>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 101 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 56 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 163 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 736 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB |
@@ -183,7 +183,6 @@ var simple_controllers = [
|
|||||||
"abbitem",
|
"abbitem",
|
||||||
"sossoitem",
|
"sossoitem",
|
||||||
"eventitem",
|
"eventitem",
|
||||||
"hslitem",
|
|
||||||
"websiteitem",
|
"websiteitem",
|
||||||
"apyitem",
|
"apyitem",
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -119,35 +119,3 @@ app.filter('unixTimeToDifference', function() {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.controller('timetableCtrl',
|
|
||||||
function($scope, $http, $interval) {
|
|
||||||
function load() {
|
|
||||||
$http.get('/infoscreen/hsl_data')
|
|
||||||
.then(function(data, status, headers, config) { //eslint-disable-line no-unused-vars
|
|
||||||
$scope.stoptimes = data.data;
|
|
||||||
$scope.error = data.data.error || null;
|
|
||||||
});
|
|
||||||
$http.get('/infoscreen/hsl_data/settings')
|
|
||||||
.then(function(data, status, headers, config) { //eslint-disable-line no-unused-vars
|
|
||||||
$scope.departureThreshold = data.data['departure_threshold'];
|
|
||||||
$scope.hurryThreshold = data.data['hurry_threshold'];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_clock() {
|
|
||||||
$scope.clock = Date.now();
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.$on('$destroy', function() {
|
|
||||||
$interval.cancel(load_interval);
|
|
||||||
$interval.cancel(clock_interval);
|
|
||||||
});
|
|
||||||
|
|
||||||
var load_interval = $interval(load, 5000);
|
|
||||||
var clock_interval = $interval(update_clock, 1000);
|
|
||||||
|
|
||||||
update_clock();
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|||||||
@@ -18,14 +18,11 @@ from infoscreen.views import create_image_item
|
|||||||
from infoscreen.views import create_video_item
|
from infoscreen.views import create_video_item
|
||||||
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 createEventItem
|
from infoscreen.views import createEventItem
|
||||||
from infoscreen.views import createExternalWebsiteItem
|
from infoscreen.views import createExternalWebsiteItem
|
||||||
from infoscreen.views import create_rotation
|
from infoscreen.views import create_rotation
|
||||||
from infoscreen.views import delete_rotation
|
from infoscreen.views import delete_rotation
|
||||||
from infoscreen.views import CurrentHSLView
|
|
||||||
from infoscreen.views import createApyItem
|
from infoscreen.views import createApyItem
|
||||||
from infoscreen.views import hsl_timetable_settings
|
|
||||||
from infoscreen.views import get_apy_json
|
from infoscreen.views import get_apy_json
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -45,13 +42,10 @@ urlpatterns = [
|
|||||||
url(r'^create_abbitem$', createABBItem),
|
url(r'^create_abbitem$', createABBItem),
|
||||||
url(r'^create_sossoitem$', createSossoItem),
|
url(r'^create_sossoitem$', createSossoItem),
|
||||||
url(r'^create_eventitem$', createEventItem),
|
url(r'^create_eventitem$', createEventItem),
|
||||||
url(r'^create_hslitem$', createHslItem),
|
|
||||||
url(r'^create_apyitem$', createApyItem),
|
url(r'^create_apyitem$', createApyItem),
|
||||||
url(r'^create_websiteitem$', createExternalWebsiteItem),
|
url(r'^create_websiteitem$', createExternalWebsiteItem),
|
||||||
url(r'^create_rotation$', create_rotation),
|
url(r'^create_rotation$', create_rotation),
|
||||||
url(r'^delete_rotation/(?P<id>\d+)$', delete_rotation),
|
url(r'^delete_rotation/(?P<id>\d+)$', delete_rotation),
|
||||||
url(r'^hsl_data$', CurrentHSLView),
|
|
||||||
url(r'^hsl_data/settings$', hsl_timetable_settings),
|
|
||||||
url(r'^apyjson', get_apy_json),
|
url(r'^apyjson', get_apy_json),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import requests
|
|||||||
|
|
||||||
from infoscreen.models import (
|
from infoscreen.models import (
|
||||||
Rotation, InfoItem, InfoInstance, ABBInfoItem, ExternalImageInfoItem,
|
Rotation, InfoItem, InfoInstance, ABBInfoItem, ExternalImageInfoItem,
|
||||||
ImageInfoItem, SossoInfoItem, HslInfoItem, EventInfoItem,
|
ImageInfoItem, SossoInfoItem, EventInfoItem,
|
||||||
ExternalWebsiteInfoItem, ImageUploadForm, ApyInfoItem, VideoInfoItem)
|
ExternalWebsiteInfoItem, ImageUploadForm, ApyInfoItem, VideoInfoItem)
|
||||||
|
|
||||||
|
|
||||||
@@ -179,7 +179,6 @@ createInstance = create_item_generator(InfoInstance)
|
|||||||
deleteInstance = delete_item_generator(InfoInstance)
|
deleteInstance = delete_item_generator(InfoInstance)
|
||||||
createABBItem = create_item_generator(ABBInfoItem)
|
createABBItem = create_item_generator(ABBInfoItem)
|
||||||
createSossoItem = create_item_generator(SossoInfoItem)
|
createSossoItem = create_item_generator(SossoInfoItem)
|
||||||
createHslItem = create_item_generator(HslInfoItem)
|
|
||||||
createExternalImageInfoItem = create_item_generator(ExternalImageInfoItem)
|
createExternalImageInfoItem = create_item_generator(ExternalImageInfoItem)
|
||||||
createExternalWebsiteItem = create_item_generator(ExternalWebsiteInfoItem)
|
createExternalWebsiteItem = create_item_generator(ExternalWebsiteInfoItem)
|
||||||
createEventItem = create_item_generator(EventInfoItem)
|
createEventItem = create_item_generator(EventInfoItem)
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ from django.conf import settings
|
|||||||
from django.db import DatabaseError
|
from django.db import DatabaseError
|
||||||
|
|
||||||
from infoscreen.models import Rotation, InfoItem, InfoInstance
|
from infoscreen.models import Rotation, InfoItem, InfoInstance
|
||||||
from infoscreen.hsl_fetcher import fetch as hsl_fetch
|
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
@@ -79,25 +78,3 @@ def info_items(request, *args, **kwargs):
|
|||||||
items.append(i.get_dict())
|
items.append(i.get_dict())
|
||||||
|
|
||||||
return JsonResponse(items, safe=False)
|
return JsonResponse(items, safe=False)
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
|
||||||
def hsl_timetable_settings(request, *args, **kwargs):
|
|
||||||
"""Set HSL timetable settings."""
|
|
||||||
d = {"departure_threshold": settings.HSL_DEPARTURE_THRESHOLD,
|
|
||||||
"hurry_threshold": settings.HSL_HURRY_THRESHOLD}
|
|
||||||
|
|
||||||
return JsonResponse(d, status=200)
|
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
|
||||||
def CurrentHSLView(request, *args, **kwargs):
|
|
||||||
"""Get HSL data and return it."""
|
|
||||||
try:
|
|
||||||
api_resp = hsl_fetch()
|
|
||||||
except Exception as ex:
|
|
||||||
logging.exception('Failed to fetch HSL timetables.')
|
|
||||||
error = {'error': 'Aikataulujen haku epäonnistui.'}
|
|
||||||
return JsonResponse(error, status=200)
|
|
||||||
|
|
||||||
return JsonResponse(api_resp, status=200, safe=False)
|
|
||||||
|
|||||||
@@ -21,11 +21,6 @@ DEBUG = True
|
|||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
SECRET_KEY = '7p$85^4ibb^p4-=vs44b7!y0e-zemugze18@a#30&71=a8)dp('
|
SECRET_KEY = '7p$85^4ibb^p4-=vs44b7!y0e-zemugze18@a#30&71=a8)dp('
|
||||||
|
|
||||||
# HSL API settings
|
|
||||||
HSL_USERHASH = 'YOUR HSL USERHASH HERE'
|
|
||||||
HSL_DEPARTURE_THRESHOLD = 8 # minutes
|
|
||||||
HSL_HURRY_THRESHOLD = 13 # minutes
|
|
||||||
|
|
||||||
# MQTT settings
|
# MQTT settings
|
||||||
MQTT_SETTINGS = {
|
MQTT_SETTINGS = {
|
||||||
'HOST': 'mqtt.sik.party',
|
'HOST': 'mqtt.sik.party',
|
||||||
|
|||||||
Reference in New Issue
Block a user