diff --git a/.gitignore b/.gitignore index 47003c7..b606e14 100644 --- a/.gitignore +++ b/.gitignore @@ -2,13 +2,11 @@ sikweb/settings.py *~ *.pyc +*.sqlite3 uwsgi.ini uwsgi.log infoscreen/static/js/hsl.json members/logs/* -members/migrations/* -infoscreen/migrations/* -webapp/migrations/* .idea/ logs/ /static/ diff --git a/infoscreen/hsl_fetcher.py b/infoscreen/hsl_fetcher.py index 67a2333..2f80c45 100644 --- a/infoscreen/hsl_fetcher.py +++ b/infoscreen/hsl_fetcher.py @@ -18,7 +18,7 @@ class HSLFetcher: def fetch(self): location_coords = (2545565, 6675319) src = urllib.request.urlopen( - "http://api.reittiopas.fi/hsl/prod/?userhash={}&request=stops_area¢er_coordinate={},{}" + "https://api.reittiopas.fi/hsl/prod/?userhash={}&request=stops_area¢er_coordinate={},{}" .format(settings.HSL_USERHASH, location_coords[0], location_coords[1]))\ .read().decode("utf-8") @@ -30,7 +30,7 @@ class HSLFetcher: time="{0:02d}{0:02d}".format(time.hour,time.minute) for element in data: src = urllib.request.urlopen( - "http://api.reittiopas.fi/hsl/prod/?userhash={}&request=stop&code={}&dep_limit=20&time={}" + "https://api.reittiopas.fi/hsl/prod/?userhash={}&request=stop&code={}&dep_limit=20&time={}" .format(settings.HSL_USERHASH, element['code'],time)).read().decode("utf-8") parsed = json.loads(src)[0] diff --git a/infoscreen/migrations/0001_initial.py b/infoscreen/migrations/0001_initial.py new file mode 100644 index 0000000..92b5e32 --- /dev/null +++ b/infoscreen/migrations/0001_initial.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-01-25 16:59 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='HSLDataModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.TextField(default='', editable=False)), + ], + ), + migrations.CreateModel( + name='InfoInstance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('duration', models.FloatField(default=15.0)), + ('item_id', models.PositiveIntegerField()), + ('item_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + ), + migrations.CreateModel( + name='InfoItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('expire_date', models.DateTimeField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Rotation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='ABBInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ], + bases=('infoscreen.infoitem',), + ), + migrations.CreateModel( + name='ExternalImageInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ('url', models.TextField()), + ], + bases=('infoscreen.infoitem',), + ), + migrations.CreateModel( + name='HslInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ], + bases=('infoscreen.infoitem',), + ), + migrations.CreateModel( + name='ImageInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ('img', models.ImageField(upload_to='infoimages/')), + ], + bases=('infoscreen.infoitem',), + ), + migrations.CreateModel( + name='SossoInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ], + bases=('infoscreen.infoitem',), + ), + migrations.AddField( + model_name='infoinstance', + name='rotation', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='infoscreen.Rotation'), + ), + ] diff --git a/infoscreen/migrations/0002_coffeeinfoitem.py b/infoscreen/migrations/0002_coffeeinfoitem.py new file mode 100644 index 0000000..254b344 --- /dev/null +++ b/infoscreen/migrations/0002_coffeeinfoitem.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-02-06 10:35 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('infoscreen', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CoffeeInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ], + bases=('infoscreen.infoitem',), + ), + ] diff --git a/infoscreen/migrations/0003_auto_20170329_1857.py b/infoscreen/migrations/0003_auto_20170329_1857.py new file mode 100644 index 0000000..b6cb775 --- /dev/null +++ b/infoscreen/migrations/0003_auto_20170329_1857.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-03-29 15:57 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('infoscreen', '0002_coffeeinfoitem'), + ] + + operations = [ + migrations.CreateModel( + name='ApyInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ], + bases=('infoscreen.infoitem',), + ), + migrations.CreateModel( + name='EventInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ], + bases=('infoscreen.infoitem',), + ), + migrations.CreateModel( + name='ExternalWebsiteInfoItem', + fields=[ + ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ('url', models.TextField()), + ], + bases=('infoscreen.infoitem',), + ), + migrations.DeleteModel( + name='CoffeeInfoItem', + ), + ] diff --git a/infoscreen/migrations/__init__.py b/infoscreen/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/infoscreen/models.py b/infoscreen/models.py index 8927c6d..04859f6 100644 --- a/infoscreen/models.py +++ b/infoscreen/models.py @@ -80,6 +80,16 @@ class ABBInfoItem(InfoItem): def get_create_template_url(): return "/static/html/abb_create.html" +class ApyInfoItem(InfoItem): + display_name = _("APY Item") + def get_template_url(self): + return "/static/html/apy.html" + + @staticmethod + def get_create_template_url(): + return "/static/html/apy_create.html" + + class ExternalWebsiteInfoItem(InfoItem): display_name = _("External website") @@ -136,6 +146,17 @@ class SossoInfoItem(InfoItem): def get_create_template_url(): return "/static/html/sosso_create.html" +class EventInfoItem(InfoItem): + display_name = _("Events") + + def get_template_url(self): + return "/static/html/events.html" + + @staticmethod + def get_create_template_url(): + return "/static/html/events_create.html" + + class ImageInfoItem(InfoItem): display_name = _("Image") diff --git a/infoscreen/static/css/apy.css b/infoscreen/static/css/apy.css new file mode 100644 index 0000000..fce7b61 --- /dev/null +++ b/infoscreen/static/css/apy.css @@ -0,0 +1,38 @@ +body { + background-image: url(https://diilikone.apy.fi/static/background.jpg); + background-size: cover; + width: 100%; + height: 100%; + margin: 0px; +} + +#footer { + height: 140px; +} +.event { + font-size: 100px; + font-weight: bold; + margin-left: 20px; +} +.event-col{ + padding-top:1vh; + padding-bottom:1vh; +} + +.header-row{ + margin: 30px; + margin-left: 20px; + font-size: 130px; + padding-bottom:20px; + color:#24a05f; + font-weight: bold; +} + +.container { + width: 95%; + height: 95%; + margin: 60px; + color: #24a5d4; + background-color: black; + opacity: 0.88; +} diff --git a/infoscreen/static/css/events.css b/infoscreen/static/css/events.css new file mode 100644 index 0000000..6dc51c7 --- /dev/null +++ b/infoscreen/static/css/events.css @@ -0,0 +1,42 @@ +.event { + font-size: 5vh; + font-family: 'Droid Sans Mono', monospace; +} +.event-col{ + padding-top:1vh; + padding-bottom:1vh; +}.event:nth-child(odd){ + background-color: #d4e2fd; +} + +.black { + color: black; +} +.header-row{ + background: #d4e2fd; + font-size: 7vh; + font-family: 'Droid Sans Mono', monospace; + padding-bottom:20px; +} + +.container { + width: 100vw; + padding: 0 0 0 0; + margin-left: 20px; + margin-right: 20px; +} + +.repeat-item.ng-leave { + -webkit-transition:0.5s linear all; + transition:0.5s linear all; +} + +.repeat-item.ng-leave.ng-leave-active { + opacity: 0; + font-size: 0vh; +} + +.repeat-item.ng-leave{ + opacity: 1; + font-size: 5vh; +} diff --git a/infoscreen/static/html/apy.html b/infoscreen/static/html/apy.html new file mode 100644 index 0000000..bdc1b46 --- /dev/null +++ b/infoscreen/static/html/apy.html @@ -0,0 +1,17 @@ + + +
+
+
+
Kilta
+
Lehdet
+
+
+
{{item.name}}
+
{{item.size}}
+
+ + +
+
diff --git a/infoscreen/static/html/apy_create.html b/infoscreen/static/html/apy_create.html new file mode 100644 index 0000000..1b0b2ee --- /dev/null +++ b/infoscreen/static/html/apy_create.html @@ -0,0 +1,10 @@ +
+
+ create apyitem +
+
+ + +
+ +
diff --git a/infoscreen/static/html/coffee.html b/infoscreen/static/html/coffee.html new file mode 100644 index 0000000..6568676 --- /dev/null +++ b/infoscreen/static/html/coffee.html @@ -0,0 +1,4 @@ + + diff --git a/infoscreen/static/html/events.html b/infoscreen/static/html/events.html new file mode 100644 index 0000000..30f39c6 --- /dev/null +++ b/infoscreen/static/html/events.html @@ -0,0 +1,14 @@ + + +
+
+
Tapahtuma
+
Aika
+
Paikka
+
+
+
{{event.name}}
+
{{event.event_start}}
+
{{event.location}}
+
+
diff --git a/infoscreen/static/html/events_create.html b/infoscreen/static/html/events_create.html new file mode 100644 index 0000000..d534dcb --- /dev/null +++ b/infoscreen/static/html/events_create.html @@ -0,0 +1,10 @@ +
+
+ Create new item to show events Name is used only as identifier +
+
+ + +
+ +
diff --git a/infoscreen/static/html/generic_external_image_create.html b/infoscreen/static/html/generic_external_image_create.html index eadb108..a20359c 100644 --- a/infoscreen/static/html/generic_external_image_create.html +++ b/infoscreen/static/html/generic_external_image_create.html @@ -1,6 +1,6 @@
- Create new image. Enter name and full url for any image available in internet (eg. http://i.imgur.com/XXSSqDG.gif) + Create new image. Enter name and full url for any image available in internet (eg. https://i.imgur.com/XXSSqDG.gif)
diff --git a/infoscreen/static/js/infoadmin_controllers.js b/infoscreen/static/js/infoadmin_controllers.js index 9a49e0d..d6b3515 100644 --- a/infoscreen/static/js/infoadmin_controllers.js +++ b/infoscreen/static/js/infoadmin_controllers.js @@ -141,6 +141,13 @@ app.controller('infoadmin_sossoitem_create', function($scope, $http,ItemList){ $http.post("/infoscreen/create_sossoitem", $scope.item).then(ItemList.loadItems) } }); +app.controller('infoadmin_eventitem_create', function($scope, $http,ItemList){ + $scope.item = {} + $scope.send = function(){ + $http.post("/infoscreen/create_eventitem", $scope.item).then(ItemList.loadItems) + } +}); + app.controller('infoadmin_hslitem_create', function($scope, $http,ItemList){ $scope.item = {} $scope.send = function(){ @@ -174,3 +181,10 @@ app.controller('infoadmin_image_create', ['$scope', 'Upload', '$timeout',"ItemLi }); } }]); + +app.controller('infoadmin_apyitem_create', function($scope, $http,ItemList){ + $scope.item = {} + $scope.send = function(){ + $http.post("/infoscreen/create_apyitem", $scope.item).then(ItemList.loadItems) + } +}); diff --git a/infoscreen/static/js/infoscreen_controllers.js b/infoscreen/static/js/infoscreen_controllers.js index a499fda..7af5069 100644 --- a/infoscreen/static/js/infoscreen_controllers.js +++ b/infoscreen/static/js/infoscreen_controllers.js @@ -48,7 +48,7 @@ app.filter('trusted_url', ['$sce', function ($sce) { app.controller('ABBController', function($scope, $http){ $scope.jobs = []; var min_date = moment().subtract(30,'days').format("YYYY-MM-DD%20HH:mm:ss"); - var url = "http://sahkoinsinoorikilta.fi/api/news.php"; + var url = "https://sahkoinsinoorikilta.fi/api/news.php"; var params = "?type=11&lang=fi&title_search=ABB&min_date="+min_date $http.get(url+params).then(function(response){ $scope.jobs = _.filter(response.data, function(job){ @@ -68,12 +68,41 @@ app.controller('ABBController', function($scope, $http){ app.controller('SossoController', function($scope, $http) { $scope.data = []; - $http.get("http://sosso.fi/api/get_recent_posts/?count=" + 3 ).then(function(response) + $http.get("https://sosso.fi/api/get_recent_posts/?count=" + 3 ).then(function(response) { $scope.data = response.data; }) }); +app.controller('ApyController', function($scope, $http) { + $scope.items = []; + $http.get("/infoscreen/apyjson").then(function(response) + { + $scope.items = response.data.data + }) +}); + +app.controller('EventController', function($scope, $http) { + $scope.data = []; + $http.get("https://sik.ayy.fi/api/events.php?limit=10").then(function(response) + { + $scope.events = response.data; + $scope.events = _.each($scope.events, function(ev){ + var time = moment(ev.event_start); + ev.event_start = time; + ev.event_start = time.format("ddd DD.MM."); + // lets not trust locale + ev.event_start = ev.event_start.replace("Mon", "Ma"); + ev.event_start = ev.event_start.replace("Tue", "Ti"); + ev.event_start = ev.event_start.replace("Wed", "Ke"); + ev.event_start = ev.event_start.replace("Thu", "To"); + ev.event_start = ev.event_start.replace("Fri", "Pe"); + ev.event_start = ev.event_start.replace("Sat", "La"); + ev.event_start = ev.event_start.replace("Sun", "Su"); + }); + }) +}); + app.controller('timetableCtrl', function($scope, $http, $interval) { function load(){ diff --git a/infoscreen/views.py b/infoscreen/views.py index 6f0ab36..63dd084 100644 --- a/infoscreen/views.py +++ b/infoscreen/views.py @@ -7,14 +7,17 @@ from django.contrib.auth.decorators import permission_required from infoscreen.models import Rotation, InfoItem, InfoInstance from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem +from infoscreen.models import EventInfoItem from infoscreen.models import ExternalWebsiteInfoItem from infoscreen.models import ImageUploadForm from infoscreen.models import HSLDataModel +from infoscreen.models import ApyInfoItem from infoscreen.hsl_fetcher import HSLFetcher import sikweb.settings as settings import json import logging import threading +import requests def index(request, idx, *args, **kwargs): @@ -34,6 +37,9 @@ def default(request,*args,**kwargs): return index(request,first ,*args, **kwargs) +def get_apy_json(request): + return HttpResponse(requests.get("https://api-diilikone.apy.fi/deals/top-groups").text) + @require_http_methods(["GET"]) def rotation(request, idx, *args, **kwargs): try: @@ -59,7 +65,7 @@ def create_item_generator(model): model.create_from_dict(data) return HttpResponse('{"status":"success"}') except RuntimeError as e: - return HttpResponseBadRequest('{"status":"failure","error":"{}"}'.format(str(e))) + return HttpResponseBadRequest(json.dumps({"status":"failure", "error":str(e)})) return create_item @@ -215,3 +221,5 @@ createSossoItem = create_item_generator(SossoInfoItem) createHslItem = create_item_generator(HslInfoItem) createExternalImageInfoItem = create_item_generator(ExternalImageInfoItem) createExternalWebsiteItem = create_item_generator(ExternalWebsiteInfoItem) +createEventItem = create_item_generator(EventInfoItem) +createApyItem = create_item_generator(ApyInfoItem) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 5e957e9..3bb20fb 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index e8ff6e1..0537402 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-02-22 22:36+0200\n" +"POT-Creation-Date: 2017-03-29 16:19+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,125 +17,135 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: infoscreen/models.py:74 +#: infoscreen/models.py:75 msgid "ABB jobs" msgstr "ABB jobs" -#: infoscreen/models.py:83 -msgid "Coffee display" -msgstr "Coffee display" +#: infoscreen/models.py:85 +#, fuzzy +#| msgid "External image" +msgid "External website" +msgstr "External image" -#: infoscreen/models.py:92 +#: infoscreen/models.py:131 msgid "Sössö articles" msgstr "Sössö articles" -#: infoscreen/models.py:102 -msgid "Image upload" -msgstr "Image upload" +#: infoscreen/models.py:140 +msgid "Events" +msgstr "" -#: infoscreen/models.py:120 +#: infoscreen/models.py:152 +msgid "Image" +msgstr "" + +#: infoscreen/models.py:170 msgid "HSL timetables" msgstr "HSL timetables" -#: infoscreen/models.py:130 +#: infoscreen/models.py:180 msgid "External image" msgstr "External image" -#: infoscreen/templates/infoscreen_admin.html:22 +#: infoscreen/templates/infoscreen_admin.html:23 #: members/templates/members_base.html:60 msgid "Log out" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:29 +#: infoscreen/templates/infoscreen_admin.html:30 msgid "Infoscreen Admin Pane" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:34 +#: infoscreen/templates/infoscreen_admin.html:35 msgid "Info items" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:35 +#: infoscreen/templates/infoscreen_admin.html:36 msgid "Infoitems available for rotations" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:38 +#: infoscreen/templates/infoscreen_admin.html:39 msgid "Item" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:39 -msgid "Set duration" -msgstr "" - #: infoscreen/templates/infoscreen_admin.html:40 -msgid "Add to rotation" +msgid "Type" msgstr "" #: infoscreen/templates/infoscreen_admin.html:41 -#: infoscreen/templates/infoscreen_admin.html:47 -#: infoscreen/templates/infoscreen_admin.html:74 -#: infoscreen/templates/infoscreen_admin.html:81 -#: infoscreen/templates/infoscreen_admin.html:98 -#: infoscreen/templates/infoscreen_admin.html:102 +msgid "Set duration" +msgstr "" + +#: infoscreen/templates/infoscreen_admin.html:42 +msgid "Add to rotation" +msgstr "" + +#: infoscreen/templates/infoscreen_admin.html:43 +#: infoscreen/templates/infoscreen_admin.html:50 +#: infoscreen/templates/infoscreen_admin.html:77 +#: infoscreen/templates/infoscreen_admin.html:84 +#: infoscreen/templates/infoscreen_admin.html:101 +#: infoscreen/templates/infoscreen_admin.html:105 #: members/templates/member_list.html:63 msgid "Delete" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:46 +#: infoscreen/templates/infoscreen_admin.html:49 msgid "Add" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:50 +#: infoscreen/templates/infoscreen_admin.html:53 msgid "Create new item" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:53 +#: infoscreen/templates/infoscreen_admin.html:56 msgid "Item type" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:64 +#: infoscreen/templates/infoscreen_admin.html:67 msgid "Rotations" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:66 +#: infoscreen/templates/infoscreen_admin.html:69 msgid "Select rotation to edit" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:70 -#: infoscreen/templates/infoscreen_admin.html:92 +#: infoscreen/templates/infoscreen_admin.html:73 +#: infoscreen/templates/infoscreen_admin.html:95 msgid "Rotation" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:71 +#: infoscreen/templates/infoscreen_admin.html:74 msgid "id" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:72 -#: infoscreen/templates/infoscreen_admin.html:79 +#: infoscreen/templates/infoscreen_admin.html:75 +#: infoscreen/templates/infoscreen_admin.html:82 msgid "Select" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:73 -#: infoscreen/templates/infoscreen_admin.html:80 +#: infoscreen/templates/infoscreen_admin.html:76 +#: infoscreen/templates/infoscreen_admin.html:83 msgid "Preview" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:84 +#: infoscreen/templates/infoscreen_admin.html:87 msgid "Name" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:85 +#: infoscreen/templates/infoscreen_admin.html:88 msgid "Create new" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:93 +#: infoscreen/templates/infoscreen_admin.html:96 msgid "Instances in currently selected rotation" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:96 +#: infoscreen/templates/infoscreen_admin.html:99 msgid "Instance" msgstr "" -#: infoscreen/templates/infoscreen_admin.html:97 +#: infoscreen/templates/infoscreen_admin.html:100 msgid "Duration" msgstr "" @@ -243,11 +253,13 @@ msgstr "" msgid "Member register of SIK ry" msgstr "" -#: sikweb/settings-sample.py:162 sikweb/settings.py:161 +#: sikweb/settings-docker-sample.py:170 sikweb/settings-sample.py:170 +#: sikweb/settings.py:170 msgid "English" msgstr "" -#: sikweb/settings-sample.py:163 sikweb/settings.py:162 +#: sikweb/settings-docker-sample.py:171 sikweb/settings-sample.py:171 +#: sikweb/settings.py:171 msgid "Finnish" msgstr "" @@ -286,3 +298,9 @@ msgstr "" #: webapp/templates/navigation.html:32 msgid "Contact" msgstr "" + +#~ msgid "Coffee display" +#~ msgstr "Coffee display" + +#~ msgid "Image upload" +#~ msgstr "Image upload" diff --git a/locale/fi/LC_MESSAGES/django.mo b/locale/fi/LC_MESSAGES/django.mo index ae1fa52..bbe46bf 100644 Binary files a/locale/fi/LC_MESSAGES/django.mo and b/locale/fi/LC_MESSAGES/django.mo differ diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index 5f31d7b..ba4f808 100644 --- a/locale/fi/LC_MESSAGES/django.po +++ b/locale/fi/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-02-22 22:36+0200\n" +"POT-Creation-Date: 2017-03-29 16:19+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,125 +18,133 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: infoscreen/models.py:74 +#: infoscreen/models.py:75 msgid "ABB jobs" msgstr "ABB-työpaikat" -#: infoscreen/models.py:83 -msgid "Coffee display" -msgstr "Kahvinäyttö" +#: infoscreen/models.py:85 +msgid "External website" +msgstr "Ulkoinen verkkosivu" -#: infoscreen/models.py:92 +#: infoscreen/models.py:131 msgid "Sössö articles" msgstr "Sössön artikkelit" -#: infoscreen/models.py:102 -msgid "Image upload" -msgstr "Kuvan lataus" +#: infoscreen/models.py:140 +msgid "Events" +msgstr "Tapahtumat" -#: infoscreen/models.py:120 +#: infoscreen/models.py:152 +msgid "Image" +msgstr "Kuva" + +#: infoscreen/models.py:170 msgid "HSL timetables" msgstr "HSL-aikataulut" -#: infoscreen/models.py:130 +#: infoscreen/models.py:180 msgid "External image" msgstr "Ulkoinen kuva" -#: infoscreen/templates/infoscreen_admin.html:22 +#: infoscreen/templates/infoscreen_admin.html:23 #: members/templates/members_base.html:60 msgid "Log out" msgstr "Kirjaudu ulos" -#: infoscreen/templates/infoscreen_admin.html:29 +#: infoscreen/templates/infoscreen_admin.html:30 msgid "Infoscreen Admin Pane" msgstr "Infonäyttöjen hallintapaneeli" -#: infoscreen/templates/infoscreen_admin.html:34 +#: infoscreen/templates/infoscreen_admin.html:35 msgid "Info items" msgstr "Diat" -#: infoscreen/templates/infoscreen_admin.html:35 +#: infoscreen/templates/infoscreen_admin.html:36 msgid "Infoitems available for rotations" msgstr "Rotaatioon lisättävät diat" -#: infoscreen/templates/infoscreen_admin.html:38 +#: infoscreen/templates/infoscreen_admin.html:39 msgid "Item" msgstr "Dia" -#: infoscreen/templates/infoscreen_admin.html:39 +#: infoscreen/templates/infoscreen_admin.html:40 +msgid "Type" +msgstr "Tyyppi" + +#: infoscreen/templates/infoscreen_admin.html:41 msgid "Set duration" msgstr "Aseta kesto" -#: infoscreen/templates/infoscreen_admin.html:40 +#: infoscreen/templates/infoscreen_admin.html:42 msgid "Add to rotation" msgstr "Lisää rotaatioon" -#: infoscreen/templates/infoscreen_admin.html:41 -#: infoscreen/templates/infoscreen_admin.html:47 -#: infoscreen/templates/infoscreen_admin.html:74 -#: infoscreen/templates/infoscreen_admin.html:81 -#: infoscreen/templates/infoscreen_admin.html:98 -#: infoscreen/templates/infoscreen_admin.html:102 +#: infoscreen/templates/infoscreen_admin.html:43 +#: infoscreen/templates/infoscreen_admin.html:50 +#: infoscreen/templates/infoscreen_admin.html:77 +#: infoscreen/templates/infoscreen_admin.html:84 +#: infoscreen/templates/infoscreen_admin.html:101 +#: infoscreen/templates/infoscreen_admin.html:105 #: members/templates/member_list.html:63 msgid "Delete" msgstr "Poista" -#: infoscreen/templates/infoscreen_admin.html:46 +#: infoscreen/templates/infoscreen_admin.html:49 msgid "Add" msgstr "Lisää" -#: infoscreen/templates/infoscreen_admin.html:50 +#: infoscreen/templates/infoscreen_admin.html:53 msgid "Create new item" msgstr "Luo uusi dia" -#: infoscreen/templates/infoscreen_admin.html:53 +#: infoscreen/templates/infoscreen_admin.html:56 msgid "Item type" msgstr "Diatyyppi" -#: infoscreen/templates/infoscreen_admin.html:64 +#: infoscreen/templates/infoscreen_admin.html:67 msgid "Rotations" msgstr "Rotaatiot" -#: infoscreen/templates/infoscreen_admin.html:66 +#: infoscreen/templates/infoscreen_admin.html:69 msgid "Select rotation to edit" msgstr "Valitse muokattava rotaatio" -#: infoscreen/templates/infoscreen_admin.html:70 -#: infoscreen/templates/infoscreen_admin.html:92 +#: infoscreen/templates/infoscreen_admin.html:73 +#: infoscreen/templates/infoscreen_admin.html:95 msgid "Rotation" msgstr "Rotaatio" -#: infoscreen/templates/infoscreen_admin.html:71 +#: infoscreen/templates/infoscreen_admin.html:74 msgid "id" msgstr "id" -#: infoscreen/templates/infoscreen_admin.html:72 -#: infoscreen/templates/infoscreen_admin.html:79 +#: infoscreen/templates/infoscreen_admin.html:75 +#: infoscreen/templates/infoscreen_admin.html:82 msgid "Select" msgstr "Valitse" -#: infoscreen/templates/infoscreen_admin.html:73 -#: infoscreen/templates/infoscreen_admin.html:80 +#: infoscreen/templates/infoscreen_admin.html:76 +#: infoscreen/templates/infoscreen_admin.html:83 msgid "Preview" msgstr "Esikatsele" -#: infoscreen/templates/infoscreen_admin.html:84 +#: infoscreen/templates/infoscreen_admin.html:87 msgid "Name" msgstr "Nimi" -#: infoscreen/templates/infoscreen_admin.html:85 +#: infoscreen/templates/infoscreen_admin.html:88 msgid "Create new" msgstr "Luo uusi" -#: infoscreen/templates/infoscreen_admin.html:93 +#: infoscreen/templates/infoscreen_admin.html:96 msgid "Instances in currently selected rotation" msgstr "Nykyisen rotaation diat" -#: infoscreen/templates/infoscreen_admin.html:96 +#: infoscreen/templates/infoscreen_admin.html:99 msgid "Instance" msgstr "Dia" -#: infoscreen/templates/infoscreen_admin.html:97 +#: infoscreen/templates/infoscreen_admin.html:100 msgid "Duration" msgstr "Kesto" @@ -244,11 +252,13 @@ msgstr "Jäsenhakemus" msgid "Member register of SIK ry" msgstr "Aalto-yliopiston Sähköinsinöörikilta ry:n jäsenrekisteri" -#: sikweb/settings-sample.py:162 sikweb/settings.py:161 +#: sikweb/settings-docker-sample.py:170 sikweb/settings-sample.py:170 +#: sikweb/settings.py:170 msgid "English" msgstr "englanti" -#: sikweb/settings-sample.py:163 sikweb/settings.py:162 +#: sikweb/settings-docker-sample.py:171 sikweb/settings-sample.py:171 +#: sikweb/settings.py:171 msgid "Finnish" msgstr "suomi" @@ -261,7 +271,6 @@ msgid "SIK Admin" msgstr "SIK Hallintapaneeli" #: webapp/templates/main_index.html:7 -#, fuzzy msgid "Members" msgstr "Jäsenlistaus" diff --git a/members/migrations/0001_initial.py b/members/migrations/0001_initial.py new file mode 100644 index 0000000..fa73b35 --- /dev/null +++ b/members/migrations/0001_initial.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-01-25 16:59 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Member', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=127)), + ('last_name', models.CharField(max_length=127)), + ('email', models.EmailField(max_length=254)), + ('POR', models.CharField(max_length=255)), + ('AYY', models.BooleanField(default=False)), + ('jas', models.BooleanField(default=False)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('paid', models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0))), + ], + ), + migrations.CreateModel( + name='MemberRequest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.Member')), + ], + ), + ] diff --git a/members/migrations/0002_auto_20170329_1857.py b/members/migrations/0002_auto_20170329_1857.py new file mode 100644 index 0000000..0a1187e --- /dev/null +++ b/members/migrations/0002_auto_20170329_1857.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-03-29 15:57 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='member', + name='paid', + field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0)), + ), + ] diff --git a/members/migrations/__init__.py b/members/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/members/serializers.py b/members/serializers.py index abcd13f..097d6c1 100644 --- a/members/serializers.py +++ b/members/serializers.py @@ -4,8 +4,7 @@ from datetime import datetime from members.models import Member, MemberRequest from django.conf import settings -#, default=timezone.now -# , default=datetime.fromtimestamp(0) + class MemberSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) first_name = serializers.CharField(required=True, max_length=127) @@ -14,8 +13,8 @@ class MemberSerializer(serializers.Serializer): POR = serializers.CharField(max_length=255) AYY = serializers.BooleanField(default=False) jas = serializers.BooleanField(default=False) - created = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") - paid = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") + created = serializers.DateTimeField(default=timezone.now) + paid = serializers.DateTimeField(default=datetime.fromtimestamp(0)) def create(self, validated_data): ''' @@ -33,7 +32,7 @@ class MemberSerializer(serializers.Serializer): instance.POR = validated_data.get('POR', instance.POR) instance.AYY = validated_data.get('AYY', instance.AYY) instance.jas = validated_data.get('jas', instance.jas) - # instance.created = validated_data.get('created', instance.created) + instance.created = validated_data.get('created', instance.created) instance.paid = validated_data.get('paid', instance.paid) instance.save() return instance diff --git a/members/static/js/members_controllers.js b/members/static/js/members_controllers.js index f13355c..5fadf64 100644 --- a/members/static/js/members_controllers.js +++ b/members/static/js/members_controllers.js @@ -23,12 +23,12 @@ function memberDataEditor(returnPath) { return function($scope, $http, $window, $location) { var id = memberId; console.log("id: " + id); - $http.get("/members/rest/api/members/" + id).then(function(response) { + $http.get("/members/api/member/" + id).then(function(response) { $scope.member = response.data; }); $scope.send = function() { - $http.put("/members/rest/api/members/" + id + "/", $scope.member).then(function(response){ + $http.put("/members/api/member/" + id, $scope.member).then(function(response){ notySuccess("Jäsentiedot tallennettu"); $window.location = returnPath; }); @@ -69,26 +69,26 @@ app.controller("getController", function($scope, $document, $http){ /* Fetch all members from the database and show all members in the table */ $scope.updateMembers = function() { - $http.get("/members/rest/api/members").then(function(response){ + $http.get("/members/api/members").then(function(response){ $scope.members = response.data; // map trues and falses to more user-friendly format - // _.each($scope.members, function(m){ - // m.jas = m.jas ? "Kyllä" : "Ei"; - // m.AYY = m.AYY ? "Kyllä" : "Ei"; - // }); + _.each($scope.members, function(m){ + m.jas = m.jas ? "Kyllä" : "Ei"; + m.AYY = m.AYY ? "Kyllä" : "Ei"; + }); $scope.shown_members = $scope.members; }); }; /* Fetch a single member from the database by id and update its row */ $scope.updateMember = function(id) { - $http.get("/members/rest/api/members/" + id).then(function(response) { + $http.get("/members/api/member/" + id).then(function(response) { for (var i = 0; i < $scope.shown_members.length; i++) { var member = $scope.shown_members[i]; if (String(member.id) == String(id)) { member = response.data; - // member.jas = member.jas ? "Kyllä" : "Ei"; - // member.AYY = member.AYY ? "Kyllä" : "Ei"; + member.jas = member.jas ? "Kyllä" : "Ei"; + member.AYY = member.AYY ? "Kyllä" : "Ei"; $scope.shown_members[i] = member; } @@ -99,21 +99,12 @@ app.controller("getController", function($scope, $document, $http){ /* Update the payment date of a single member to the current time and send * the member to the database */ $scope.updatePayment= function(id){ - $scope.member = {}; - //Find member whose payment needs to be updated - $scope.member = $scope.members.find(function(element){ - return element.id == id; + $http.put("/members/api/member/"+id, { paid: moment().format("YYYY-MM-DD kk:mm:ss") }).then(function(response) { + $scope.updateMember(id); + notySuccess("Maksupäivämäärä päivitetty."); }); - //Update the member data if member was found - if($scope.member != undefined){ - $scope.member.paid = moment().format("YYYY-MM-DD kk:mm:ss"); - $http.put("/members/rest/api/members/"+id +"/", $scope.member).then(function(response) { - $scope.updateMember(id); - notySuccess("Maksupäivämäärä päivitetty."); - }); - } }; - + /* Redirect the browser to the CSV dump download endpoint */ $scope.loadCSV = function() { window.location = "/members/api/getCSV"; @@ -121,7 +112,7 @@ app.controller("getController", function($scope, $document, $http){ /* Delete a single member by id */ $scope.deleteMember = function(id) { - $http.delete("/members/rest/api/members/" + id).then( + $http.delete("/members/api/member/" + id).then( function(response) { notySuccess("Poistaminen onnistui") $scope.updateMembers(); @@ -169,7 +160,7 @@ app.controller("getController", function($scope, $document, $http){ if (name.length == 0) continue; if (member.first_name.toLowerCase().includes(name) - || member.last_name.toLowerCase().includes(name) + || member.last_name.toLowerCase().includes(name) || member.email.toLowerCase().includes(name)) { result.push(member); @@ -219,24 +210,26 @@ app.controller("getController", function($scope, $document, $http){ }); /* Controller for adding a member */ -app.controller("postController", function($scope, $http, $location) { +app.controller("postController", function($scope, $http, $location, $window) { $scope.member = {}; $scope.send = function() { - $http.post("/members/rest/api/members/", $scope.member).then(function(response){ + $http.post("/members/api/member/", $scope.member).then(function(response){ notySuccess("Jäsen lisätty!"); + $window.location = "/members/list"; }); + } }); /* Controller for application page */ app.controller("applController", function($scope, $http){ $scope.applUpdateAll = function() { - $http.get("/members/rest/api/requests").then(function(response){ + $http.get("/members/api/requests").then(function(response){ $scope.applications = response.data; - // _.each($scope.applications, function(a){ - // a.member.jas = a.member.jas ? "Kyllä" : "Ei"; - // a.member.AYY = a.member.AYY ? "Kyllä" : "Ei"; - // }); + _.each($scope.applications, function(a){ + a.member.jas = a.member.jas ? "Kyllä" : "Ei"; + a.member.AYY = a.member.AYY ? "Kyllä" : "Ei"; + }); }); }; diff --git a/members/templates/application_base.html b/members/templates/application_base.html index 2f00c86..bed2a37 100644 --- a/members/templates/application_base.html +++ b/members/templates/application_base.html @@ -15,7 +15,7 @@ - + diff --git a/members/templates/application_success.html b/members/templates/application_success.html index ec8e994..00aad06 100644 --- a/members/templates/application_success.html +++ b/members/templates/application_success.html @@ -2,5 +2,5 @@ {% block content %}

Hienoa! Jäsenhakemuksesi on nyt lähetetty.

-Takaisin Sähköinsinöörikillan web-sivuille +Takaisin Sähköinsinöörikillan web-sivuille {% endblock content %} diff --git a/members/templates/edit_application.html b/members/templates/edit_application.html index 308948b..14a5dda 100644 --- a/members/templates/edit_application.html +++ b/members/templates/edit_application.html @@ -33,8 +33,8 @@
- - + +
diff --git a/members/templates/members_base.html b/members/templates/members_base.html index 09a7613..8bfa0dc 100644 --- a/members/templates/members_base.html +++ b/members/templates/members_base.html @@ -20,7 +20,7 @@ - + diff --git a/members/views.py b/members/views.py index c4a5920..f3e6316 100644 --- a/members/views.py +++ b/members/views.py @@ -24,7 +24,7 @@ memberlogger = logging.getLogger(__name__) logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH) -# REST API views +#API views ######################################## class MembersList(generics.ListCreateAPIView): queryset = Member.objects.all() @@ -237,7 +237,7 @@ def new_member_request(request, *args, **kwargs): message += 'AYY-membership: ' + str(mem.AYY) + '\r\n' message += 'To mail list: ' + str(mem.jas) + '\r\n' message += 'Created: ' + mem.created.isoformat(' ') + '\r\n' - message += 'Please go to the http://sika.sahkoinsinoorikilta.fi/members/ and do something about it!\r\n' + message += 'Please go to the https://sika.sahkoinsinoorikilta.fi/members/ and do something about it!\r\n' # TODO: send mail when application is ready # send_mail_wrapper(subject, message) diff --git a/sikweb/urls.py b/sikweb/urls.py index b8a544a..611e570 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -62,12 +62,15 @@ from infoscreen.views import create_image_item from infoscreen.views import createABBItem from infoscreen.views import createSossoItem from infoscreen.views import createHslItem +from infoscreen.views import createEventItem from infoscreen.views import createExternalWebsiteItem from infoscreen.views import create_rotation from infoscreen.views import delete_rotation from infoscreen.views import CurrentHSLView +from infoscreen.views import createApyItem from infoscreen.views import admin as infoscreen_admin from infoscreen.views import hsl_timetable_settings +from infoscreen.views import get_apy_json #application from members.views import application_index from members.views import list_applications @@ -102,8 +105,6 @@ urlpatterns = [ url(r'^members/api/request/(?P\d+)$', handle_mem_request), url(r'^members/api/getCSV$', mem_csv_export), url(r'^members/tommy$', tommy_blooper), - - # Members API url(r'^members/rest/api/members/$', memsListAPI.as_view()), url(r'^members/rest/api/members/(?P\d+)/$', memDetailAPI.as_view()), url(r'^members/rest/api/requests/$', reqListAPI.as_view()), @@ -123,13 +124,16 @@ urlpatterns = [ url(r'^infoscreen/create_image$', create_image_item), url(r'^infoscreen/create_abbitem$', createABBItem), url(r'^infoscreen/create_sossoitem$', createSossoItem), + url(r'^infoscreen/create_eventitem$', createEventItem), url(r'^infoscreen/create_hslitem$', createHslItem), + url(r'^infoscreen/create_apyitem$', createApyItem), url(r'^infoscreen/create_websiteitem$', createExternalWebsiteItem), url(r'^infoscreen/admin$', infoscreen_admin), url(r'^infoscreen/create_rotation$', create_rotation), url(r'^infoscreen/delete_rotation/(?P\d+)$', delete_rotation), url(r'^infoscreen/hsl_data$', CurrentHSLView), url(r'^infoscreen/hsl_data/settings$', hsl_timetable_settings), + url(r'^infoscreen/apyjson', get_apy_json), #application url(r'^application/$', application_index), url(r'^application/success$', application_success_index), diff --git a/webapp/migrations/0001_initial.py b/webapp/migrations/0001_initial.py new file mode 100644 index 0000000..53345cd --- /dev/null +++ b/webapp/migrations/0001_initial.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-01-25 16:59 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Info', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + migrations.CreateModel( + name='InfoTr', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('lang', models.CharField(default='fi', max_length=2)), + ('topic', models.CharField(max_length=255)), + ('content', models.TextField()), + ('translation_for', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='webapp.Info')), + ], + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dummyname', models.CharField(max_length=127)), + ], + ), + migrations.CreateModel( + name='TagTr', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('lang', models.CharField(default='fi', max_length=2)), + ('name', models.CharField(max_length=127)), + ('translation_for', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='webapp.Tag')), + ], + ), + migrations.AddField( + model_name='info', + name='tags', + field=models.ManyToManyField(related_name='news', to='webapp.Tag'), + ), + ] diff --git a/webapp/migrations/__init__.py b/webapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webapp/templates/base.html b/webapp/templates/base.html index 8e86b50..e738a2f 100644 --- a/webapp/templates/base.html +++ b/webapp/templates/base.html @@ -19,7 +19,7 @@ - + diff --git a/webapp/templates/login.html b/webapp/templates/login.html index d38757a..785792b 100644 --- a/webapp/templates/login.html +++ b/webapp/templates/login.html @@ -11,7 +11,7 @@ - +