Merge branch 'develop' into feature-payment

This commit is contained in:
henu
2017-03-29 19:15:48 +03:00
37 changed files with 646 additions and 146 deletions
+1 -3
View File
@@ -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/
+2 -2
View File
@@ -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&center_coordinate={},{}"
"https://api.reittiopas.fi/hsl/prod/?userhash={}&request=stops_area&center_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]
+91
View File
@@ -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'),
),
]
@@ -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',),
),
]
@@ -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',
),
]
View File
+21
View File
@@ -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")
+38
View File
@@ -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;
}
+42
View File
@@ -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;
}
+17
View File
@@ -0,0 +1,17 @@
<link rel="stylesheet" href="/static/css/apy.css">
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet">
<div id="bg">
<div class="container " ng-controller="ApyController">
<div class="header-row row">
<div class="col-sm-8">Kilta</div>
<div class="col-sm-4">Lehdet</div>
</div>
<div class="repeat-item row event" ng-repeat="item in items">
<div class="col-sm-8 event-col">{{item.name}}</div>
<div class="col-sm-4 event-col">{{item.size}}</div>
</div>
<div id="footer">
</div>
</div>
</div>
+10
View File
@@ -0,0 +1,10 @@
<div ng-controller="infoadmin_apyitem_create" style="margin-top:20px;">
<div>
create apyitem
</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>
+4
View File
@@ -0,0 +1,4 @@
<link rel="stylesheet" href="/static/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>
+14
View File
@@ -0,0 +1,14 @@
<link rel="stylesheet" href="/static/css/events.css">
<link href="https://fonts.googleapis.com/css?family=Droid+Sans+Mono" rel="stylesheet">
<div class="container" ng-app="myApp" ng-controller="EventController">
<div class="header-row row">
<div class="col-sm-6">Tapahtuma</div>
<div class="col-sm-2">Aika</div>
<div class="col-sm-4">Paikka</div>
</div>
<div class="repeat-item row event" ng-repeat="event in events">
<div class="col-sm-6 event-col">{{event.name}}</div>
<div class="col-sm-2 event-col">{{event.event_start}}</div>
<div class="col-sm-4 event-col">{{event.location}}</div>
</div>
</div>
+10
View File
@@ -0,0 +1,10 @@
<div ng-controller="infoadmin_eventitem_create" style="margin-top:20px;">
<div>
Create new item to show events 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>
@@ -1,6 +1,6 @@
<div ng-controller="infoadmin_externalimage_create" style="margin-top:20px;">
<div>
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)
</div>
<div class="form-group">
<label>Name:</label>
@@ -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)
}
});
+31 -2
View File
@@ -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(){
+9 -1
View File
@@ -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)
Binary file not shown.
+63 -45
View File
@@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"
Binary file not shown.
+53 -44
View File
@@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"
+40
View File
@@ -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')),
],
),
]
@@ -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)),
),
]
View File
+4 -5
View File
@@ -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
+21 -28
View File
@@ -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,19 +99,10 @@ 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;
});
//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) {
$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.");
});
}
};
/* Redirect the browser to the CSV dump download endpoint */
@@ -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();
@@ -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";
});
});
};
+1 -1
View File
@@ -15,7 +15,7 @@
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
+1 -1
View File
@@ -2,5 +2,5 @@
{% block content %}
<h1>Hienoa! Jäsenhakemuksesi on nyt lähetetty.</h1>
<a href="http://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
<a href="https://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
{% endblock content %}
+2 -2
View File
@@ -33,8 +33,8 @@
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
</div>
<button class="btn btn-success" ng-click="applicationForm.$valid && send()" type="submit" id="sendmember">Tallenna</button>
<button class="btn btn-warning" ng-click="cancel()" type="submit" id="sendmember">Peruuta</button>
<button class="btn btn-success" ng-click="applicationForm.$valid && sendappl()" type="submit" id="sendmember">Tallenna</button>
<button class="btn btn-warning" ng-click="cancelappl()" type="submit" id="sendmember">Peruuta</button>
</form>
</div>
</div>
+1 -1
View File
@@ -20,7 +20,7 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
<!-- Angular routing -->
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<!-- Underscore.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
+2 -2
View File
@@ -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)
+6 -2
View File
@@ -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<idx>\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<pk>\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<id>\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),
+56
View File
@@ -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'),
),
]
View File
+1 -1
View File
@@ -19,7 +19,7 @@
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
+1 -1
View File
@@ -11,7 +11,7 @@
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
</head>
<body>