Merge branch 'develop' into 'master'

Develop



See merge request !6
This commit is contained in:
Jan Tuomi
2017-02-22 15:58:59 +02:00
49 changed files with 1533 additions and 650 deletions
+3 -1
View File
@@ -11,4 +11,6 @@ infoscreen/migrations/*
webapp/migrations/*
.idea/
logs/
logs/*
static/
node_modules/
media/
+26
View File
@@ -0,0 +1,26 @@
.footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
text-align: center;
background-color: #cfcfcf;
padding: 1rem;
}
#fi-button {
background: url("/static/img/fi.png") no-repeat;
background-size: cover;
}
#en-button {
background: url("/static/img/en.png") no-repeat;
background-size: cover;
}
.lang-button {
height: 20px;
width: 30px;
margin-left: 10px;
margin-right: 10px;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

+34 -1
View File
@@ -1,5 +1,5 @@
table {
font-size: 3vw;
font-size: 5vh;
font-family: 'Droid Sans Mono', monospace;
}
.red {
@@ -39,3 +39,36 @@ table {
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 {
-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;
}
+40 -35
View File
@@ -1,38 +1,43 @@
<link rel="stylesheet" href="/static/css/hsl.css">
<link href="https://fonts.googleapis.com/css?family=Droid+Sans+Mono" rel="stylesheet">
<div ng-app="myApp" ng-controller="timetableCtrl">
<table class="table table-striped">
<thead>
<tr>
<th>
Aika
</th>
<th>
Numero
</th>
<th>
Pys&#228;kki
</th>
<th>
P&#228;&#228;tepys&#228;kki
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="x in arr | orderBy: ['date','time'] | limitTo: 10">
<td ng-class='{red : x.hurry, black: !x.hurry}'>
{{x.time}}
</td>
<td style="margin-left: 15px">
{{x.bus}}
</td>
<td>
{{x.stop}}
</td>
<td>
{{x.laststop}}
</td>
</tr>
</tbody>
</table>
<div class="container" ng-app="myApp" ng-controller="timetableCtrl">
<div class="header-row row">
<div class="col-sm-2"></div>
<div class="col-sm-8">HSL-Aikataulut</div>
<div class="col-sm-2 time"><p>{{ clock | date:'HH:mm'}}</p></div>
</div>
<table class="table table-striped row">
<thead>
<tr>
<th>
Aika
</th>
<th>
Linja
</th>
<th>
Pys&#228;kki
</th>
<th>
P&#228;&#228;tepys&#228;kki
</th>
</tr>
</thead>
<tbody>
<tr class="repeat-item" ng-repeat="x in arr | orderBy: ['date','time'] | limitTo: 10">
<td ng-class='{red : x.hurry, black: !x.hurry}'>
{{x.timedelta < 10 ?x.timedelta + ' min' : x.time}}
</td>
<td>
{{x.bus}}
</td>
<td>
{{x.stop}}
</td>
<td>
{{x.laststop}}
</td>
</tr>
</tbody>
</table>
</div>
@@ -1,55 +0,0 @@
<div class="row" ng-controller="infoadmin_ctrl">
<div class="col-xs-12 col-md-6">
<h2>Info items</h2>
<div>Infoitems available for rotations:</div>
<table class="table table-striped">
<tr><th>Item</th><th>Set duration</th><th>Add to rotation</th><th>Delete</th></tr>
<tr ng-repeat="i in infoitems">
<td>{{i.name}}</td>
<td><input type="text" class="form-control" ng-model="i.duration"></input></td>
<td><input type="button" class="btn btn-success" ng-click="createInstance(selected_rot.id, i.id, i.item_type, i.duration);" value="add"></input></td>
<td><input type="button" class="btn btn-danger" ng-click="deleteItem(i.item_type, i.id);" value="delete"></input></td>
</tr>
</table>
<h2>Create new item</h2>
<table class="table table-striped">
<tr><td>Item type</td>
<td><select class="form-control form-control-sm" ng-model="createtype", ng-options="t.name for t in infotypes">
<option value=""></option>
</select></td>
</tr>
</table>
<div ng-include="createtype.create_template_url"></div>
</div>
<div class="col-xs-12 col-md-6">
<h2>Rotations</h2>
<div>
Select rotation to edit:
</div>
<table class="table table-striped">
<tr><th>Rotation</th>
<th>Select</th>
<th>Delete</th></tr>
<tr ng-repeat="r in rotations">
<td>{{r.name}}</td>
<td><input type="button" class="btn btn-info" ng-click="selectRotation(r.id)" value="select"></td>
<td><input type="button" class="btn btn-danger" ng-click="deleteRotation(r.id)" value="delete"></input></td>
</tr>
<tr>
<td><input type="text" class="form-control" ng-model="r.name" placeholder="Name"></input></td>
<td><input type="button" class="btn btn-success" ng-click="createRotation(r.name)" value="create new"></input></td>
<td></td>
</tr>
</table>
<h2>Rotation: {{selected_rot.name}}</h2>
<div>Instances in currently selected rotation:</div>
<table class="table table-striped">
<tr><th>Instance</th><th>Duration</th><th>Delete</th></tr>
<tr ng-repeat="i in selected_rot.instances">
<td>{{i.item.name}}</td><td>{{i.duration}}s</td>
<td><input type="button" ng-click="deleteInstance(i.id);" value="delete" class="btn btn-danger"></input></td>
</tr>
</div>
</div
@@ -1,8 +1,15 @@
var app = angular.module('infoAdmin',['ngFileUpload']);
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
app.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{$');
$interpolateProvider.endSymbol('$}');
});
app.service("InstanceList", ["$http", function($http){
var self = this;
this.selected_rot = {}
@@ -83,6 +83,7 @@ app.controller('timetableCtrl',
$scope.$on('$destroy', function() {
$interval.cancel(inter1);
$interval.cancel(inter2);
$interval.cancel(inter3);
});
var objects;
$scope.arr=[];
@@ -169,6 +170,7 @@ app.controller('timetableCtrl',
d.setHours(time[0]);
d.setMinutes(time[1]);
var diff=(d.getTime()-f.getTime());
$scope.arr[a]['timedelta']=Math.floor(diff/60000);
if(diff < tooSoon*60000) {
$scope.arr.splice(a,1);
}
@@ -177,10 +179,14 @@ app.controller('timetableCtrl',
}
}
}
function updateTime(){
$scope.clock = Date.now();
}
$scope.clock = Date.now();
load();
var inter1=$interval(delOld,2000);
var inter2=$interval(load,10000);
var inter3=$interval(updateTime, 1000);
}
);
+91 -6
View File
@@ -1,3 +1,5 @@
{% load i18n %}
{% load static %}
<!DOCTYPE html>
<html ng-app="infoAdmin">
<head>
@@ -13,13 +15,96 @@
</head>
<body>
<div id="header" class="row">
<div class="col-xs-1 col-xs-offset-11 col-sm-1 col-lg-1">
<form action="/logout" method="post"> {% csrf_token %}
<input type="Submit" value="Logout" name="Logout" class="btn btn-danger"/>
</form>
</div>
<div class="col-xs-1 col-xs-offset-11 col-sm-1 col-lg-1">
<form action="/logout" method="post"> {% csrf_token %}
<input type="Submit" value="{% trans "Log out" %}" name="Logout" class="btn btn-danger"/>
</form>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>{% trans "Infoscreen Admin Pane" %}</h1>
</div>
</div>
<div class="row" ng-controller="infoadmin_ctrl">
<div class="col-xs-12 col-md-6">
<h2>{% trans "Info items" %}</h2>
<div>{% trans "Infoitems available for rotations" %}</div>
<table class="table table-striped">
<tr>
<th>{% trans "Item" %}</th>
<th>{% trans "Set duration" %}</th>
<th>{% trans "Add to rotation" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="i in infoitems">
<td>{$ i.name $}</td>
<td><input type="text" class="form-control" ng-model="i.duration"></input></td>
<td><input type="button" class="btn btn-success" ng-click="createInstance(selected_rot.id, i.id, i.item_type, i.duration);" value="{% trans "Add" %}"></input></td>
<td><input type="button" class="btn btn-danger" ng-click="deleteItem(i.item_type, i.id);" value="{% trans "Delete" %}"></input></td>
</tr>
</table>
<h2>{% trans "Create new item" %}</h2>
<table class="table table-striped">
<tr>
<td>{% trans "Item type" %}</td>
<td>
<select class="form-control form-control-sm" ng-model="createtype", ng-options="t.name for t in infotypes">
<option value=""></option>
</select>
</td>
</tr>
</table>
<div ng-include="createtype.create_template_url"></div>
</div>
<div class="col-xs-12 col-md-6">
<h2>{% trans "Rotations" %}</h2>
<div>
{% trans "Select rotation to edit" %}:
</div>
<table class="table table-striped">
<tr>
<th>{% trans "Rotation" %}</th>
<th>{% trans "id" %}</th>
<th>{% trans "Select" %}</th>
<th>{% trans "Preview" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="r in rotations">
<td>{$ r.name $}</td>
<td>{$ r.id $}</td>
<td><input type="button" class="btn btn-info" ng-click="selectRotation(r.id)" value="{% trans "Select" %}"></td>
<td><a href="/infoscreen/{$ r.id $}"><input type="button" class="btn btn-primary" value="{% trans "Preview" %}"></a></td>
<td><input type="button" class="btn btn-danger" ng-click="deleteRotation(r.id)" value="{% trans "Delete" %}"></input></td>
</tr>
<tr>
<td><input type="text" class="form-control" ng-model="r.name" placeholder="{% trans "Name" %}"></input></td>
<td><input type="button" class="btn btn-success" ng-click="createRotation(r.name)" value="{% trans "Create new" %}"></input></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
<div class="container" ng-include="'/static/html/infoscreen_admin.html'"></div>
<h2>{% trans "Rotation" %}: {$ selected_rot.name $}</h2>
<div>{% trans "Instances in currently selected rotation" %}:</div>
<table class="table table-striped">
<tr>
<th>{% trans "Instance" %}</th>
<th>{% trans "Duration" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="i in selected_rot.instances">
<td>{$ i.item.name $}</td><td>{$ i.duration $} s</td>
<td><input type="button" ng-click="deleteInstance(i.id);" value="{% trans "Delete" %}" class="btn btn-danger"></input></td>
</tr>
</table>
</div>
</div>
<div style="margin-top: 100px;">
{% include "footer.html" %}
</div>
</div>
</body>
</html>
Binary file not shown.
+264
View File
@@ -0,0 +1,264 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-12 00:46+0200\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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: infoscreen/templates/infoscreen_admin.html:20
#: members/templates/members_base.html:67
msgid "Log out"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:27
msgid "Infoscreen Admin Pane"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:32
msgid "Info items"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:33
msgid "Infoitems available for rotations"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:36
msgid "Item"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:37
msgid "Set duration"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:38
msgid "Add to rotation"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:39
#: infoscreen/templates/infoscreen_admin.html:45
#: infoscreen/templates/infoscreen_admin.html:72
#: infoscreen/templates/infoscreen_admin.html:79
#: infoscreen/templates/infoscreen_admin.html:96
#: infoscreen/templates/infoscreen_admin.html:100
#: members/templates/member_list.html:63
msgid "Delete"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:44
msgid "Add"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:48
msgid "Create new item"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:51
msgid "Item type"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:62
msgid "Rotations"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:64
msgid "Select rotation to edit"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:68
#: infoscreen/templates/infoscreen_admin.html:90
msgid "Rotation"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:69
msgid "id"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:70
#: infoscreen/templates/infoscreen_admin.html:77
msgid "Select"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:71
#: infoscreen/templates/infoscreen_admin.html:78
msgid "Preview"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:82
msgid "Name"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:83
msgid "Create new"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:91
msgid "Instances in currently selected rotation"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:94
msgid "Instance"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:95
msgid "Duration"
msgstr ""
#: members/templates/member_list.html:13 members/templates/member_list.html:45
msgid "Added"
msgstr ""
#: members/templates/member_list.html:14
msgid "Added after"
msgstr ""
#: members/templates/member_list.html:15
msgid "Added before"
msgstr ""
#: members/templates/member_list.html:20 members/templates/member_list.html:46
msgid "Paid"
msgstr ""
#: members/templates/member_list.html:21
msgid "Paid after"
msgstr ""
#: members/templates/member_list.html:22
msgid "Paid before"
msgstr ""
#: members/templates/member_list.html:27
msgid "Search"
msgstr ""
#: members/templates/member_list.html:28
msgid "Filter"
msgstr ""
#: members/templates/member_list.html:29
msgid "Reset"
msgstr ""
#: members/templates/member_list.html:32 members/templates/members_base.html:13
msgid "Member register"
msgstr ""
#: members/templates/member_list.html:33
msgid "Download CSV"
msgstr ""
#: members/templates/member_list.html:39
msgid "Last name"
msgstr ""
#: members/templates/member_list.html:40
msgid "First name"
msgstr ""
#: members/templates/member_list.html:41
msgid "Email"
msgstr ""
#: members/templates/member_list.html:42
msgid "AYY member"
msgstr ""
#: members/templates/member_list.html:43
msgid "JAS recipient"
msgstr ""
#: members/templates/member_list.html:44
msgid "Residence"
msgstr ""
#: members/templates/member_list.html:47
msgid "Member count"
msgstr ""
#: members/templates/member_list.html:61
msgid "Update payment"
msgstr ""
#: members/templates/member_list.html:62
msgid "Edit"
msgstr ""
#: members/templates/member_list.html:63
msgid "Are you sure?"
msgstr ""
#: members/templates/members_base.html:49
msgid "Member list"
msgstr ""
#: members/templates/members_base.html:50
msgid "Add member"
msgstr ""
#: members/templates/members_base.html:51
msgid "Add multiple"
msgstr ""
#: members/templates/members_base.html:52
msgid "Member application"
msgstr ""
#: members/templates/members_base.html:62
msgid "Member register of SIK ry"
msgstr ""
#: sikweb/settings-sample.py:146 sikweb/settings.py:146
msgid "English"
msgstr ""
#: sikweb/settings-sample.py:147 sikweb/settings.py:147
msgid "Finnish"
msgstr ""
#: templates/footer.html:11
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr ""
#: webapp/templates/admin_index.html:6
msgid "SIK Admin"
msgstr ""
#: webapp/templates/main_index.html:7
msgid "Members"
msgstr ""
#: webapp/templates/main_index.html:8
msgid "Infoscreen"
msgstr ""
#: webapp/templates/main_index.html:9
msgid "Admin tools"
msgstr ""
#: webapp/templates/navigation.html:29
msgid "Event calendar"
msgstr ""
#: webapp/templates/navigation.html:30
msgid "International"
msgstr ""
#: webapp/templates/navigation.html:31
msgid "Sössö"
msgstr ""
#: webapp/templates/navigation.html:32
msgid "Contact"
msgstr ""
Binary file not shown.
+266
View File
@@ -0,0 +1,266 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-12 00:46+0200\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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: infoscreen/templates/infoscreen_admin.html:20
#: members/templates/members_base.html:67
msgid "Log out"
msgstr "Kirjaudu ulos"
#: infoscreen/templates/infoscreen_admin.html:27
msgid "Infoscreen Admin Pane"
msgstr "Infonäyttöjen hallintapaneeli"
#: infoscreen/templates/infoscreen_admin.html:32
msgid "Info items"
msgstr "Diat"
#: infoscreen/templates/infoscreen_admin.html:33
msgid "Infoitems available for rotations"
msgstr "Rotaatioon lisättävät diat"
#: infoscreen/templates/infoscreen_admin.html:36
msgid "Item"
msgstr "Dia"
#: infoscreen/templates/infoscreen_admin.html:37
msgid "Set duration"
msgstr "Aseta kesto"
#: infoscreen/templates/infoscreen_admin.html:38
msgid "Add to rotation"
msgstr "Lisää rotaatioon"
#: infoscreen/templates/infoscreen_admin.html:39
#: infoscreen/templates/infoscreen_admin.html:45
#: infoscreen/templates/infoscreen_admin.html:72
#: infoscreen/templates/infoscreen_admin.html:79
#: infoscreen/templates/infoscreen_admin.html:96
#: infoscreen/templates/infoscreen_admin.html:100
#: members/templates/member_list.html:63
msgid "Delete"
msgstr "Poista"
#: infoscreen/templates/infoscreen_admin.html:44
msgid "Add"
msgstr "Lisää"
#: infoscreen/templates/infoscreen_admin.html:48
msgid "Create new item"
msgstr "Luo uusi dia"
#: infoscreen/templates/infoscreen_admin.html:51
msgid "Item type"
msgstr "Diatyyppi"
#: infoscreen/templates/infoscreen_admin.html:62
msgid "Rotations"
msgstr "Rotaatiot"
#: infoscreen/templates/infoscreen_admin.html:64
msgid "Select rotation to edit"
msgstr "Valitse muokattava rotaatio"
#: infoscreen/templates/infoscreen_admin.html:68
#: infoscreen/templates/infoscreen_admin.html:90
msgid "Rotation"
msgstr "Rotaatio"
#: infoscreen/templates/infoscreen_admin.html:69
msgid "id"
msgstr "id"
#: infoscreen/templates/infoscreen_admin.html:70
#: infoscreen/templates/infoscreen_admin.html:77
msgid "Select"
msgstr "Valitse"
#: infoscreen/templates/infoscreen_admin.html:71
#: infoscreen/templates/infoscreen_admin.html:78
msgid "Preview"
msgstr "Esikatsele"
#: infoscreen/templates/infoscreen_admin.html:82
msgid "Name"
msgstr "Nimi"
#: infoscreen/templates/infoscreen_admin.html:83
msgid "Create new"
msgstr "Luo uusi"
#: infoscreen/templates/infoscreen_admin.html:91
msgid "Instances in currently selected rotation"
msgstr "Nykyisen rotaation diat"
#: infoscreen/templates/infoscreen_admin.html:94
msgid "Instance"
msgstr "Dia"
#: infoscreen/templates/infoscreen_admin.html:95
msgid "Duration"
msgstr "Kesto"
#: members/templates/member_list.html:13 members/templates/member_list.html:45
msgid "Added"
msgstr "Lisätty"
#: members/templates/member_list.html:14
msgid "Added after"
msgstr "Lisätty jälkeen"
#: members/templates/member_list.html:15
msgid "Added before"
msgstr "Lisätty ennen"
#: members/templates/member_list.html:20 members/templates/member_list.html:46
msgid "Paid"
msgstr "Maksettu"
#: members/templates/member_list.html:21
msgid "Paid after"
msgstr "Maksettu jälkeen"
#: members/templates/member_list.html:22
msgid "Paid before"
msgstr "Maksettu ennen"
#: members/templates/member_list.html:27
msgid "Search"
msgstr "Haku"
#: members/templates/member_list.html:28
msgid "Filter"
msgstr "Suodata"
#: members/templates/member_list.html:29
msgid "Reset"
msgstr "Nollaa"
#: members/templates/member_list.html:32 members/templates/members_base.html:13
msgid "Member register"
msgstr "Jäsenrekisteri"
#: members/templates/member_list.html:33
msgid "Download CSV"
msgstr "Lataa CSV"
#: members/templates/member_list.html:39
msgid "Last name"
msgstr "Sukunimi"
#: members/templates/member_list.html:40
msgid "First name"
msgstr "Etunimi"
#: members/templates/member_list.html:41
msgid "Email"
msgstr "Sähköposti"
#: members/templates/member_list.html:42
msgid "AYY member"
msgstr "AYY:n jäsen"
#: members/templates/member_list.html:43
msgid "JAS recipient"
msgstr "JAS-vastaanottaja"
#: members/templates/member_list.html:44
msgid "Residence"
msgstr "Asuinpaikka"
#: members/templates/member_list.html:47
msgid "Member count"
msgstr "Lukumäärä"
#: members/templates/member_list.html:61
msgid "Update payment"
msgstr "Päivitä maksu"
#: members/templates/member_list.html:62
msgid "Edit"
msgstr "Muokkaa"
#: members/templates/member_list.html:63
msgid "Are you sure?"
msgstr "Oletko varma?"
#: members/templates/members_base.html:49
msgid "Member list"
msgstr "Jäsenlistaus"
#: members/templates/members_base.html:50
msgid "Add member"
msgstr "Lisää jäsen"
#: members/templates/members_base.html:51
msgid "Add multiple"
msgstr "Lisää useita"
#: members/templates/members_base.html:52
msgid "Member application"
msgstr "Jäsenhakemus"
#: members/templates/members_base.html:62
msgid "Member register of SIK ry"
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry:n jäsenrekisteri"
#: sikweb/settings-sample.py:146 sikweb/settings.py:146
msgid "English"
msgstr "englanti"
#: sikweb/settings-sample.py:147 sikweb/settings.py:147
msgid "Finnish"
msgstr "suomi"
#: templates/footer.html:11
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
#: webapp/templates/admin_index.html:6
msgid "SIK Admin"
msgstr "SIK Hallintapaneeli"
#: webapp/templates/main_index.html:7
#, fuzzy
msgid "Members"
msgstr "Jäsenlistaus"
#: webapp/templates/main_index.html:8
msgid "Infoscreen"
msgstr "Infonäyttö"
#: webapp/templates/main_index.html:9
msgid "Admin tools"
msgstr "Hallintatyökalut"
#: webapp/templates/navigation.html:29
msgid "Event calendar"
msgstr "Tapahtumakalenteri"
#: webapp/templates/navigation.html:30
msgid "International"
msgstr "International"
#: webapp/templates/navigation.html:31
msgid "Sössö"
msgstr "Sössö"
#: webapp/templates/navigation.html:32
msgid "Contact"
msgstr "Yhteystiedot"
View File
+3
View File
@@ -1,3 +1,6 @@
from django.contrib import admin
from members.models import Member, MemberRequest
# Register your models here.
admin.site.register(Member)
admin.site.register(MemberRequest)
+1
View File
@@ -5,6 +5,7 @@
.content-area {
padding-left: 15px;
padding-right: 15px;
padding-bottom: 2rem;
}
.content-area-title {
-31
View File
@@ -1,31 +0,0 @@
<h3> Jäsenhakemukset </h3>
<div>
<div class="panel panel-primary" ng-repeat="x in applications | orderBy: 'submitted'">
<div class="panel-heading">{{ x.member.first_name }} {{ x.member.last_name}}</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-4">Sähköposti: {{ x.member.email }}</div>
</div>
<div class="row">
<div class="col-sm-4">AYY-jäsen: {{ x.member.AYY }}</div>
</div>
<div class="row">
<div class="col-sm-4">JAS-listaan: {{ x.member.jas }}</div>
</div>
<div class="row">
<div class="col-sm-4">Asuinpaikka: {{ x.member.POR }}</div>
</div>
<div class="row">
<div class="col-sm-4">Lisätty: {{ x.member.created }}</div>
</div>
<div class="row">
<div class="col-sm-4">
<input type="button" value="Hyväksy" class="btn btn-success" confirmed-click="sendAppl(x.id)" ng-confirm-click="Oletko varma, että haluat hyväksyä?"/>
<input type="button" value="Hylkää" class="btn btn-danger" confirmed-click="deleteAppl(x.id)" ng-confirm-click="Oletko varma, että haluat hylätä hakemuksen?"/>
<a href="#/applications/edit/{{x.member.id}}"<input type="button" value="Edit" class="btn btn-info">Muokkaa</input></a>
</div>
</div>
</div>
</div>
</div>
-66
View File
@@ -1,66 +0,0 @@
<link rel="stylesheet" href="/static/css/jasenlista.css">
<div class="row">
</div>
<div class="row content-area">
<div class="form-inline col-md-12 filters first-filter">
<div class="form-group">
<label for="addedBeforeDatePicker"><h4>Lisätty</h4></label>
<md-datepicker class="filter-field" id="addedAfterDatePicker" ng-model="addedAfterDatePicker" md-placeholder="Lisätty jälkeen"></md-datepicker>
<md-datepicker class="filter-field" id="addedBeforeDatePicker" ng-model="addedBeforeDatePicker" md-placeholder="Lisätty ennen"></md-datepicker>
</div>
</div>
<div class="form-inline col-md-12 filters">
<div class="form-group">
<label for="paidBeforeDatePicker"><h4>Maksettu</h4></label>
<md-datepicker class="filter-field" id="paidAfterDatePicker" ng-model="paidAfterDatePicker" md-placeholder="Maksettu jälkeen"></md-datepicker>
<md-datepicker class="filter-field" id="paidBeforeDatePicker" ng-model="paidBeforeDatePicker" md-placeholder="Maksettu ennen"></md-datepicker>
</div>
</div>
<div class="form-inline col-md-12 last-filter">
<div class="form-group filters">
<input class="filter-field form-control" type="text" id="searchFilter" placeholder="Haku" ng-keypress="pressKeyOnSearch($event)" ng-model="searchFilter"></input>
<input type="button" value="Suodata" class="filter-field btn btn-success" ng-click="doFilter()" />
<input type="button" value="Nollaa" class="filter-field btn btn-warning" ng-click="clearFilter()" />
</div>
<div class="content-area-title form-group">
<h3 class="inline-title">Jäsenlista (jäseniä: {{members.length}})</h3>
<input type="button" value="Lataa CSV" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
</div>
</div>
<table id="choose-address-table" class="table table-striped">
<thead>
<tr class="ui-widget-header">
<th>Sukunimi</th>
<th>Etunimi</th>
<th>Sähköposti</th>
<th>AYY-jäsen</th>
<th>JAS-listalla</th>
<th>Asuinpaikka</th>
<th>Lisätty</th>
<th>Maksanut</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="x in shown_members | orderBy: 'last_name'">
<td>{{ x.last_name }}</td>
<td>{{ x.first_name }}</td>
<td>{{ x.email }}</td>
<td>{{ x.AYY }}</td>
<td>{{ x.jas }}</td>
<td>{{ x.POR }}</td>
<td>{{ x.created }}</td>
<td>{{ x.paid }}</td>
<td class="table-button-column">
<input type="button" value="Päivitä maksu" class="table-button btn btn-success" ng-click="updatePayment(x.id)" />
<a href="#/edit/{{x.id}}"<input type="button" value="Edit" class="table-button btn btn-info">Muokkaa</input></a>
<input type="button" value="Poista" class="table-button btn btn-danger" confirmed-click="deleteMember(x.id)" ng-confirm-click="Are you sure?"/>
</td>
</tr>
</tbody>
</table>
<div class="row" id="tommy">
<div class="col-sm-4">
<a href="#/tommy">Tommy</a>
</div>
</div>
</div>
-31
View File
@@ -1,31 +0,0 @@
<h3> Lisää jäsen </h3>
<div id="input_form">
<form name="memberForm">
<div class="form-group">
<label>Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
<div class="form-group">
<label>Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
<div class="form-group">
<label>Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
<div class="form-group">
<label>AYY jäsen: </label>
<input type="checkbox" id="AYY" value="0" ng-model="member.AYY"></input>
</div>
<div class="form-group">
<label>JAS-listaan: </label>
<input type="checkbox" id="JAS" value="0" ng-model="member.jas"></input>
</div>
<div class="form-group">
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
</div>
<button ng-click="memberForm.$valid && send()" type="submit" class="btn btn-success" id="sendmember">Tallenna</button>
</form>
</div>
-24
View File
@@ -1,24 +0,0 @@
<div class="container" style="align:middle;">
<div class="instructions">
<h3> Lisää useampi jäsen </h3>
<h5>
Syötä jäsentiedot pilkuilla erotettuina formaatissa <b>Etunimi, Sukunimi, Sähköposti, Asuinkunta, AYY-jäsen(0 tai 1), JAS-listaan(0 tai 1)</b>
<br>
<br>
Erota jäsenet rivinvaihdoilla toisistaan.
</h5>
<!--<img src="/static/img/members_example.png" alt="exampleImg" style="max-width:100%; height:auto; margin-bottom:10px; opacity:0.7;">-->
</div>
<form name="memberTextForm">
<div class="row">
<div class="col-sm-4">
<textarea ng-model="memberData" rows="20" cols="120" placeholder="Salli, Vahvonen, salli.vahvonen@notmail.dom, Kerava, 0, 0" style="border:solid 3px #c9c9c9; transition:box-shadow 0.3s, border 0.3s; align:middle;"></textarea>
</div>
</div>
<div class="row">
<div class="col-sm-4">
<button ng-click="sendCSV()" type="submit" class="btn btn-success" id="sendMembers">Lähetä</button>
</div>
</div>
</form>
</div>
@@ -1,32 +0,0 @@
<h1> Muokkaa hakemuksen jäsentietoja </h1>
<div id="input_form">
<form name="applicationForm">
<div class="form-group">
<label>Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="application.member.first_name"></input>
</div>
<div class="form-group">
<label>Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="application.member.last_name"></input>
</div>
<div class="form-group">
<label>Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="application.member.email"></input>
</div>
<div class="form-group">
<label>AYY jäsen: </label>
<input type="checkbox" id="AYY" ng-model="application.member.AYY"></input>
</div>
<div class="form-group">
<label>JAS-listaan: </label>
<input type="checkbox" id="jas" ng-model="application.member.jas"></input>
</div>
<div class="form-group">
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="application.member.POR"></input>
</div>
<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>
-32
View File
@@ -1,32 +0,0 @@
<h1> Muokkaa jäsentietoja </h1>
<div id="input_form">
<form name="memberForm">
<div class="form-group">
<label>Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
<div class="form-group">
<label>Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
<div class="form-group">
<label>Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
<div class="form-group">
<label>AYY jäsen: </label>
<input type="checkbox" id="AYY" ng-model="member.AYY"></input>
</div>
<div class="form-group">
<label>JAS-listaan: </label>
<input type="checkbox" id="jas" ng-model="member.jas"></input>
</div>
<div class="form-group">
<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="memberForm.$valid && send()" type="submit" id="sendmember">Tallenna</button>
<button class="btn btn-warning" ng-click="cancel()" type="submit" id="sendmember">Peruuta</button>
</form>
</div>
+7 -2
View File
@@ -1,6 +1,11 @@
var app = angular.module('memberApp', ['ngRoute','ngMaterial','ngMessages']);
app.config(['$httpProvider', function ($httpProvider) {
app.config(['$httpProvider', '$locationProvider', function ($httpProvider, $locationProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
}]);
app.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{$');
$interpolateProvider.endSymbol('$}');
});
+11 -11
View File
@@ -19,21 +19,22 @@ function notyfication(type, timeout) {
var notyError = notyfication('error', 2500);
var notySuccess = notyfication('success', 2500);
function memberDataEditor(returnpath) {
return function($scope, $http, $route, $routeParams, $window, $location) {
$scope.member = {"id": $routeParams.id};
$http.get("/members/api/member/" + $scope.member.id).then(function(response) {
function memberDataEditor(returnPath) {
return function($scope, $http, $window, $location) {
var id = memberId;
console.log("id: " + id);
$http.get("/members/api/member/" + id).then(function(response) {
$scope.member = response.data;
});
$scope.send = function() {
$http.put("/members/api/member/" + $scope.member.id, $scope.member).then(function(response){
$http.put("/members/api/member/" + id, $scope.member).then(function(response){
notySuccess("Jäsentiedot tallennettu");
$location.path(returnpath);
$window.location = returnPath;
});
}
$scope.cancel = function() { //user canceled. return to list
$location.path(returnpath);
$window.location = returnPath;
}
}
}
@@ -47,7 +48,7 @@ app.directive('ngConfirmClick', [ function() { return {
buttons: [ {
addClass: 'btn btn-danger', text: 'Kyllä', onClick: function($noty) {
$noty.close();
scope.$eval(clickAction)
scope.$eval(clickAction);
}
},
{
@@ -214,7 +215,6 @@ app.controller("postController", function($scope, $http, $location) {
$scope.send = function() {
$http.post("/members/api/member/", $scope.member).then(function(response){
notySuccess("Jäsen lisätty!");
$location.path("/list");
});
}
});
@@ -258,8 +258,8 @@ app.controller("applController", function($scope, $http){
};
});
app.controller("editController", memberDataEditor("/list"));
app.controller("applEditController", memberDataEditor("/applications"));
app.controller("editController", memberDataEditor("/members/list"));
app.controller("applEditController", memberDataEditor("/members/applications"));
app.controller("addManyController", function($scope, $http, $window) {
$scope.memberData = '';
-37
View File
@@ -1,37 +0,0 @@
app.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/',{
templateUrl:"/static/html/jasenlista.html",
controller:'getController',
})
.when('/list/',{
templateUrl:"/static/html/jasenlista.html",
controller:'getController',
})
.when('/add/',{
templateUrl:"/static/html/lisaa_jasen.html",
controller:'postController',
})
.when('/edit/:id',{
templateUrl:"/static/html/muokkaa_jasenta.html",
controller:'editController',
})
.when('/applications/',{
templateUrl:"/static/html/jasenhakemukset.html",
controller:'applController',
})
.when('/applications/edit/:id',{
templateUrl:"/static/html/muokkaa_jasenta.html",
controller:'applEditController',
})
.when('/addmany/',{
templateUrl:"/static/html/lisaa_jasenia.html",
controller:'addManyController',
})
.when('/tommy/',{
templateUrl:"/static/html/tommy.html"
})
.otherwise({
'redirectTo':"/"
})
}]);
+28
View File
@@ -0,0 +1,28 @@
{% extends "members_base.html" %}
{% block content %}
<div class="container" style="align:middle;" ng-controller="addManyController">
<div class="instructions">
<h3> Lisää useampi jäsen </h3>
<h5>
Syötä jäsentiedot pilkuilla erotettuina formaatissa <b>Etunimi, Sukunimi, Sähköposti, Asuinkunta, AYY-jäsen(0 tai 1), JAS-listaan(0 tai 1)</b>
<br>
<br>
Erota jäsenet rivinvaihdoilla toisistaan.
</h5>
<!--<img src="/static/img/members_example.png" alt="exampleImg" style="max-width:100%; height:auto; margin-bottom:10px; opacity:0.7;">-->
</div>
<form name="memberTextForm">
<div class="row">
<div class="col-sm-4">
<textarea ng-model="memberData" rows="20" cols="120" placeholder="Salli, Vahvonen, salli.vahvonen@notmail.dom, Kerava, 0, 0" style="border:solid 3px #c9c9c9; transition:box-shadow 0.3s, border 0.3s; align:middle;"></textarea>
</div>
</div>
<div class="row">
<div class="col-sm-4">
<button ng-click="sendCSV()" type="submit" class="btn btn-success" id="sendMembers">Lähetä</button>
</div>
</div>
</form>
</div>
{% endblock content %}
+39
View File
@@ -0,0 +1,39 @@
{% extends "members_base.html" %}
{% block content %}
<div ng-controller="postController">
<h3> Lisää jäsen </h3>
<div id="input_form">
<form name="memberForm">
<div class="form-group">
<label>Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
<div class="form-group">
<label>Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
<div class="form-group">
<label>Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
<div class="form-group">
<label>AYY jäsen: </label>
<input type="checkbox" id="AYY" value="0" ng-model="member.AYY"></input>
</div>
<div class="form-group">
<label>JAS-listaan: </label>
<input type="checkbox" id="JAS" value="0" ng-model="member.jas"></input>
</div>
<div class="form-group">
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
</div>
<a href="/members/list">
<button ng-click="memberForm.$valid && send()" type="submit" class="btn btn-success" id="sendmember">Tallenna</button>
</a>
</form>
</div>
</div>
{% endblock content %}
+43
View File
@@ -0,0 +1,43 @@
{% load staticfiles %}
{% load i18n %}
<!DOCTYPE html>
<html lang="en" ng-app="applicationApp">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
<title>Jäsenhakemus</title>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<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://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-messages.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-aria.min.js"></script>
<!-- reCaptcha -->
<script src="/static/js/angular-recaptcha.js"></script>
<script src="https://www.google.com/recaptcha/api.js?onload=vcRecaptchaApiLoaded&render=explicit" async defer></script>
<script src="/static/js/jquery.noty.packaged.js"></script>
<script src="/static/js/appconfig.js"></script>
<script src="/static/js/application_controllers.js"></script>
<script src="/static/js/moment.js"></script>
<link href="/static/css/simple-sidebar.css" rel="stylesheet">
</head>
<body>
{% block content %}
{% endblock content %}
</body>
</html>
+65 -86
View File
@@ -1,88 +1,67 @@
<!DOCTYPE html>
<html lang="en" ng-app="applicationApp" ng-controller="applicationController">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
{% extends "application_base.html" %}
{% load static %}
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<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://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
{%load staticfiles %}
<script src="/static/js/jquery.noty.packaged.js"></script>
<script src="/static/js/application_controllers.js"></script>
<link rel="stylesheet" href="/static/css/application.css">
<!-- reCaptcha -->
<script src="https://www.google.com/recaptcha/api.js?onload=vcRecaptchaApiLoaded&render=explicit" async defer></script>
<script src="/static/js/angular-recaptcha.js"></script>
</head>
<body>
<!-- include finnish form and then button for changing the language -->
<div ng-include="">
{% block content %}
<link rel="stylesheet" href="{% static "css/application.css" %}">
</div>
<title>Jäseneksi Aalto-yliopiston Sähköinsinöörikiltaan</title>
<h3>Killan jäseneksi liittyminen on helppoa ja hauskaa!</h3>
<h3>Täytä vain alla oleva lomake</h3>
<h4>Muista myös maksaa jäsenmaksusi!</h4>
<div id="input_form">
<form name="applicationForm">
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="firstNameField">Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="lastNameField">Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="emailField">Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Olen AYY:n jäsen: </label>
<input type="checkbox" autocomplete="off" id="AYY" value="0" ng-model="member.AYY">
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Haluan saada viikottaisia jäsenmaileja: </label>
<input type="checkbox" class="custom-control-input" autocomplete="off" id="JAS" value="0" ng-model="member.jas">
</label>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div
id="captcha"
vc-recaptcha
theme="'light'"
key="'6LevHAcUAAAAAA45B7c-7qja-2aSwHztr9xb4K2Z'"
on-create="setWidgetId(widgetId)"
on-success="setResponse(response)"
on-expire="cbExpiration()"
></div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<button ng-click="applicationForm.$valid && send()" type="submit" class="btn btn-success" id="sendmember">Liity</button>
</div>
</form>
</div>
</body>
<div id="input_form" ng-controller="applicationController">
<form name="applicationForm">
<div class="col-xs-12">
<h3>Killan jäseneksi liittyminen on helppoa ja hauskaa!</h3>
<h3>Täytä vain alla oleva lomake</h3>
<h4>Muista myös maksaa jäsenmaksusi!</h4>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="firstNameField">Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="lastNameField">Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label for="emailField">Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Olen AYY:n jäsen: </label>
<input type="checkbox" autocomplete="off" id="AYY" value="0" ng-model="member.AYY">
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Haluan saada viikottaisia jäsenmaileja: </label>
<input type="checkbox" class="custom-control-input" autocomplete="off" id="JAS" value="0" ng-model="member.jas">
</label>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div class="form-group">
<label>Asuinkunta: </label>
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
</div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<div
id="captcha"
vc-recaptcha
theme="'light'"
key="'6LevHAcUAAAAAA45B7c-7qja-2aSwHztr9xb4K2Z'"
on-create="setWidgetId(widgetId)"
on-success="setResponse(response)"
on-expire="cbExpiration()"
></div>
</div>
<div class="col-xs-10 col-xs-offset-1">
<button ng-click="applicationForm.$valid && send()" type="submit" class="btn btn-success" id="sendmember">Liity</button>
</div>
</form>
</div>
{% endblock content %}
+6 -15
View File
@@ -1,15 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
<title>Hienoa! Jäsenhakemuksesi on nyt lähetetty.</title>
</head>
<body>
<h1>Hienoa! Jäsenhakemuksesi on nyt lähetetty.</h1>
<a href="http://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
</body>
</html>
{% extends "application_base.html" %}
{% block content %}
<h1>Hienoa! Jäsenhakemuksesi on nyt lähetetty.</h1>
<a href="http://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
{% endblock content %}
+41
View File
@@ -0,0 +1,41 @@
{% extends "members_base.html" %}
{% block content %}
<script>
var memberId = {{ member_id }};
</script>
<div ng-controller="applEditController">
<h1> Muokkaa hakemuksen jäsentietoja </h1>
<div id="input_form">
<form name="applicationForm">
<div class="form-group">
<label>Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
<div class="form-group">
<label>Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
<div class="form-group">
<label>Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
<div class="form-group">
<label>AYY jäsen: </label>
<input type="checkbox" id="AYY" ng-model="member.AYY"></input>
</div>
<div class="form-group">
<label>JAS-listaan: </label>
<input type="checkbox" id="jas" ng-model="member.jas"></input>
</div>
<div class="form-group">
<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 && sendappl()" type="submit" id="sendmember">Tallenna</button>
<button class="btn btn-warning" ng-click="cancelappl()" type="submit" id="sendmember">Peruuta</button>
</form>
</div>
</div>
{% endblock content %}
+41
View File
@@ -0,0 +1,41 @@
{% extends "members_base.html" %}
{% block content %}
<script>
var memberId = {{ member_id }};
</script>
<div ng-controller="editController">
<h1> Muokkaa jäsentietoja </h1>
<div id="input_form">
<form name="memberForm">
<div class="form-group">
<label>Etunimi: </label>
<input id="firstNameField" required type="text" placeholder="Sähkö" class="form-control" ng-model="member.first_name"></input>
</div>
<div class="form-group">
<label>Sukunimi: </label>
<input id="lastNameField" required type="text" placeholder="Insinööri" class="form-control" ng-model="member.last_name"></input>
</div>
<div class="form-group">
<label>Sähköposti: </label>
<input id="emailField" required type="text" placeholder="sahko.insinoori@aalto.fi" class="form-control" ng-model="member.email"></input>
</div>
<div class="form-group">
<label>AYY jäsen: </label>
<input type="checkbox" id="AYY" ng-model="member.AYY"></input>
</div>
<div class="form-group">
<label>JAS-listaan: </label>
<input type="checkbox" id="jas" ng-model="member.jas"></input>
</div>
<div class="form-group">
<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="memberForm.$valid && send()" type="submit" id="sendmember">Tallenna</button>
<button class="btn btn-warning" ng-click="cancel()" type="submit" id="sendmember">Peruuta</button>
</form>
</div>
</div>
{% endblock content %}
+40
View File
@@ -0,0 +1,40 @@
{% extends "members_base.html" %}
{% block content %}
<div ng-controller="applController">
<h3> Jäsenhakemukset </h3>
<div>
<div class="panel panel-primary" ng-repeat="x in applications | orderBy: 'submitted'">
<div class="panel-heading">{$ x.member.first_name $} {$ x.member.last_name$}</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-4">Sähköposti: {$ x.member.email $}</div>
</div>
<div class="row">
<div class="col-sm-4">AYY-jäsen: {$ x.member.AYY $}</div>
</div>
<div class="row">
<div class="col-sm-4">JAS-listaan: {$ x.member.jas $}</div>
</div>
<div class="row">
<div class="col-sm-4">Asuinpaikka: {$ x.member.POR $}</div>
</div>
<div class="row">
<div class="col-sm-4">Lisätty: {$ x.member.created $}</div>
</div>
<div class="row">
<div class="col-sm-4">
<input type="button" value="Hyväksy" class="btn btn-success" confirmed-click="sendAppl(x.id)" ng-confirm-click="Oletko varma, että haluat hyväksyä?"/>
<input type="button" value="Hylkää" class="btn btn-danger" confirmed-click="deleteAppl(x.id)" ng-confirm-click="Oletko varma, että haluat hylätä hakemuksen?"/>
<a href="/members/edit_application/{$x.member.id$}"<input type="button" value="Edit" class="btn btn-info">Muokkaa</input></a>
</div>
</div>
</div>
</div>
</div>
<div ng-show="!applications.length">
<h3>Ei jäsenhakemuksia :(</h3>
</div>
</div>
{% endblock content %}
+75
View File
@@ -0,0 +1,75 @@
{% extends "members_base.html" %}
{% load static %}
{% load i18n %}
{% block content %}
<link rel="stylesheet" href="{% static "css/jasenlista.css" %}">
<div ng-controller="getController">
<div class="row">
</div>
<div class="row content-area">
<div class="form-inline col-md-12 first-filter">
<div class="form-group filters">
<label for="addedBeforeDatePicker"><h4>{% trans "Added" %}</h4></label>
<md-datepicker class="filter-field" id="addedAfterDatePicker" ng-model="addedAfterDatePicker" md-placeholder="{% trans "Added after" %}"></md-datepicker>
<md-datepicker class="filter-field" id="addedBeforeDatePicker" ng-model="addedBeforeDatePicker" md-placeholder="{% trans "Added before" %}"></md-datepicker>
</div>
</div>
<div class="form-inline col-md-12">
<div class="form-group filters">
<label for="paidBeforeDatePicker"><h4>{% trans "Paid" %}</h4></label>
<md-datepicker class="filter-field" id="paidAfterDatePicker" ng-model="paidAfterDatePicker" md-placeholder="{% trans "Paid after" %}"></md-datepicker>
<md-datepicker class="filter-field" id="paidBeforeDatePicker" ng-model="paidBeforeDatePicker" md-placeholder="{% trans "Paid before" %}"></md-datepicker>
</div>
</div>
<div class="form-inline col-md-12 last-filter">
<div class="form-group filters">
<input class="filter-field form-control" type="text" id="searchFilter" placeholder="{% trans "Search" %}" ng-keypress="pressKeyOnSearch($event)" ng-model="searchFilter"></input>
<input type="button" value="{% trans "Filter" %}" class="filter-field btn btn-success" ng-click="doFilter()" />
<input type="button" value="{% trans "Reset" %}" class="filter-field btn btn-warning" ng-click="clearFilter()" />
</div>
<div class="content-area-title form-group">
<h3 class="inline-title">{% trans "Member register" %}</h3>
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
</div>
</div>
<table id="choose-address-table" class="table table-striped">
<thead>
<tr class="ui-widget-header">
<th>{% trans "Last name" %}</th>
<th>{% trans "First name" %}</th>
<th>{% trans "Email" %}</th>
<th>{% trans "AYY member" %}</th>
<th>{% trans "JAS recipient" %}</th>
<th>{% trans "Residence" %}</th>
<th>{% trans "Added" %}</th>
<th>{% trans "Paid" %}</th>
<th class="table-button-column">{% trans "Member count" %}: {$ members.length $}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="x in shown_members | orderBy: 'last_name'">
<td>{$ x.last_name $}</td>
<td>{$ x.first_name $}</td>
<td>{$ x.email $}</td>
<td>{$ x.AYY $}</td>
<td>{$ x.jas $}</td>
<td>{$ x.POR $}</td>
<td>{$ x.created $}</td>
<td>{$ x.paid $}</td>
<td class="table-button-column">
<input type="button" value="{% trans "Update payment" %}" class="table-button btn btn-success" ng-click="updatePayment(x.id)" />
<a href="/members/edit/{$ x.id $}"<input type="button" value="{% trans "Edit" %}" class="table-button btn btn-info">{% trans "Edit" %}</input></a>
<input type="button" value="{% trans "Delete" %}" class="table-button btn btn-danger" confirmed-click="deleteMember(x.id)" ng-confirm-click="{% trans "Are you sure?" %}"/>
</td>
</tr>
</tbody>
</table>
<div class="row" id="tommy">
<div class="col-sm-4">
<a href="/members/tommy">Tommy</a>
</div>
</div>
</div>
</div>
{% endblock content %}
+76
View File
@@ -0,0 +1,76 @@
{% load staticfiles %}
{% load static %}
{% load i18n %}
<!DOCTYPE html>
<html lang="en" ng-app="memberApp">
<head>
<base href="/">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
<title>{% trans "Member register" %}</title>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<!-- Angular -->
<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>
<!-- Underscore.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-messages.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-aria.min.js"></script>
<script src="/static/js/jquery.noty.packaged.js"></script>
<script src="/static/js/appconfig.js"></script>
<script src="/static/js/members_controllers.js"></script>
<script src="/static/js/moment.js"></script>
<link href="/static/css/simple-sidebar.css" rel="stylesheet">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<div id="sidebar-wrapper">
<ul class="sidebar-nav">
<li><a href="/members/list">{% trans "Member list" %}</a></li>
<li><a href="/members/add">{% trans "Add member" %}</a></li>
<li><a href="/members/add_many">{% trans "Add multiple" %}</a></li>
<li><a href="/members/applications">{% trans "Member application" %}</a></li>
</ul>
</div>
<!-- /#sidebar-wrapper -->
<!-- Page Content -->
<div class="col-xs-12 col-sm-12 col-lg-12">
<div id="header" class="row">
<div class="col-xs-11 col-sm-11 col-lg-11">
<h1 style="text-align:center; margin-top:10px; margin-bottom: 10px;">
{% trans "Member register of SIK ry" %}
</h1>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1">
<form action="/logout" method="post"> {% csrf_token %}
<input type="Submit" value="{% trans "Log out" %}" name="Logout" class="btn btn-danger" style="margin-top:12px;"/>
</form>
</div>
</div>
{% block content %}
{% endblock content %}
</div>
{% include "footer.html" %}
</body>
</html>
+28 -63
View File
@@ -1,66 +1,31 @@
<!DOCTYPE html>
<html lang="en" ng-app="memberApp">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
{% extends "members_base.html" %}
<title>Jäsenrekisteri</title>
{% block content %}
<div id="wrapper">
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<!-- Sidebar -->
<div id="sidebar-wrapper">
<ul class="sidebar-nav">
<li><a href="#/list">Listaa jäsenet</a></li>
<li><a href="#/add">Lisää jäsen</a></li>
<li><a href="#/addmany">Lisää jäseniä</a></li>
<li><a href="#/applications">Jäsenhakemukset</a></li>
</ul>
</div>
<!-- /#sidebar-wrapper -->
<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://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-messages.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-aria.min.js"></script>
{%load staticfiles %}
<script src="/static/js/jquery.noty.packaged.js"></script>
<script src="/static/js/appconfig.js"></script>
<script src="/static/js/members_routers.js"></script>
<script src="/static/js/members_controllers.js"></script>
<script src="/static/js/moment.js"></script>
<link href="/static/css/simple-sidebar.css" rel="stylesheet">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<div id="sidebar-wrapper">
<ul class="sidebar-nav">
<li><a href="#/list">Listaa jäsenet</a></li>
<li><a href="#/add">Lisää jäsen</a></li>
<li><a href="#/addmany">Lisää jäseniä</a></li>
<li><a href="#/applications">Jäsenhakemukset</a></li>
</ul>
</div>
<!-- /#sidebar-wrapper -->
<!-- Page Content -->
<div class="col-xs-12 col-sm-12 col-lg-12">
<div id="header" class="row">
<div class="col-xs-11 col-sm-11 col-lg-11">
<h1 style="text-align:center; margin-top:10px; margin-bottom: 10px;">Aalto-yliopiston Sähköinsinöörikilta RY:n jäsenrekisteri</h1>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1">
<form action="/logout" method="post"> {% csrf_token %}
<input type="Submit" value="Logout" name="Logout" class="btn btn-danger" style="margin-top:12px;"/>
</form>
</div>
</div>
<div ng-view></div>
</div>
</body>
</html>
<!-- Page Content -->
<div class="col-xs-12 col-sm-12 col-lg-12">
<div id="header" class="row">
<div class="col-xs-11 col-sm-11 col-lg-11">
<h1 style="text-align:center; margin-top:10px; margin-bottom: 10px;">Aalto-yliopiston Sähköinsinöörikilta RY:n jäsenrekisteri</h1>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1">
<form action="/logout" method="post"> {% csrf_token %}
<input type="Submit" value="Logout" name="Logout" class="btn btn-danger" style="margin-top:12px;"/>
</form>
</div>
</div>
<div ng-view></div>
</div>
{% endblock content %}
+8
View File
@@ -0,0 +1,8 @@
{% extends "members_base.html" %}
{% block content %}
<h1> Tommyn jäsenlista </h1>
<div>
<img src="/static/tommy.jpg" style="width:800px;height:300px;"></img>
</div>
{% endblock content %}
+47 -4
View File
@@ -45,15 +45,58 @@ def send_mail_wrapper(subject, message):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def index(request, *args, **kwargs):
return render(request, 'members_index.html', {})
def member_list(request, *args, **kwargs):
context = {}
return render(request, 'member_list.html', context)
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def add_member(request, *args, **kwargs):
return render(request, 'add_member.html', {})
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def add_many_members(request, *args, **kwargs):
return render(request, 'add_many_members.html', {})
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def list_applications(request, *args, **kwargs):
return render(request, 'list_applications.html', {})
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def tommy_blooper(request, *args, **kwargs):
return render(request, 'tommy_blooper.html', {})
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def edit_member(request, *args, **kwargs):
i = kwargs.pop('index', None);
if i is None:
return HttpResponse(status=500, error="{'error': 'No member id specified'}")
else:
return render(request, 'edit_member.html', {'member_id' : i})
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def edit_application(request, *args, **kwargs):
i = kwargs.pop('index', None);
if i is None:
return HttpResponse(status=500, error="{'error': 'No member id specified'}")
else:
return render(request, 'edit_application.html', {'member_id' : i})
@ensure_csrf_cookie
def application_index(request, *args, **kwargs):
return render(request, 'application_index.html', {})
@ensure_csrf_cookie
def application_success_index(request, *args, **kwargs):
return render(request, 'application_success.html', {})
@@ -210,4 +253,4 @@ def export_csv(request, *args, **kwargs):
writer.writerow(field_list)
return response
return response
+27 -3
View File
@@ -13,6 +13,7 @@ https://docs.djangoproject.com/en/1.9/ref/settings/
import os
import logging
from os.path import expanduser
from django.utils.translation import ugettext_lazy as _
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -48,6 +49,7 @@ INSTALLED_APPS = [
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
@@ -63,14 +65,16 @@ ROOT_URLCONF = 'sikweb.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'DIRS': ['templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.template.context_processors.i18n',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.static',
],
},
},
@@ -138,7 +142,18 @@ LOGPATH = "logs/debug.log"
# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGES = (
('en', _('English')),
('fi', _('Finnish')),
)
LANGUAGE_CODE = 'fi'
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
print("LOCALE_PATHS: {}".format(LOCALE_PATHS))
TIME_ZONE = 'Europe/Helsinki'
@@ -151,8 +166,17 @@ USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATICFILES_FINDERS = ['django.contrib.staticfiles.finders.AppDirectoriesFinder']
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'global_static'),
)
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
HSL_USERHASH = 'YOUR HSL USERHASH HERE'
HSL_DEPARTURE_THRESHOLD = 8
+74 -44
View File
@@ -17,13 +17,23 @@ Including another URLconf
from django.conf.urls import url
from django.contrib import admin
from django.views.generic.base import RedirectView
from django.views.static import serve as static_serve
from django.conf.urls import include
from django.conf.urls.static import static
from django.conf import settings
from django.contrib.staticfiles import views as static_views
# main
from webapp.views import main_index
from webapp.views import admin_index
# login
from webapp.views import login_view
from webapp.views import logout_view
# members
from members.views import index as mindex
from members.views import member_list
from members.views import add_member
from members.views import add_many_members
from members.views import edit_member
from members.views import members as mems
from members.views import member as mem
from members.views import handle_mem_request
@@ -31,6 +41,7 @@ from members.views import csv_import as mem_csv_import
from members.views import new_member_request
from members.views import member_requests
from members.views import export_csv as mem_csv_export
from members.views import tommy_blooper
#infoscreen
from infoscreen.views import index as infoindex
from infoscreen.views import default as infodefault
@@ -54,51 +65,70 @@ from infoscreen.views import admin as infoscreen_admin
from infoscreen.views import hsl_timetable_settings
#application
from members.views import application_index
from members.views import list_applications
from members.views import edit_application
from members.views import application_success_index
favicon_view = RedirectView.as_view(url='static/img/favicon.ico', permanent=True)
urlpatterns = [
# main
url(r'^$', main_index),
# admin
url(r'^admin/', admin.site.urls),
# login stuff
url(r'^login$', login_view),
url(r'^logout$', logout_view),
# members
url(r'^members/$', mindex),
url(r'^members/api/members$', mems),
url(r'^members/api/member/(?P<idx>\d+)$', mem),
url(r'^members/api/member/$', mem),
url(r'^members/api/csvimport$', mem_csv_import),
url(r'^members/api/requests$', member_requests),
url(r'^members/api/request$', new_member_request),
url(r'^members/api/request/(?P<idx>\d+)$', handle_mem_request),
url(r'^members/api/getCSV$', mem_csv_export),
#infoscreen
url(r'^infoscreen/$', infodefault),
url(r'^infoscreen/(?P<idx>\d+)$', infoindex),
url(r'^infoscreen/items$', info_items),
url(r'^infoscreen/rotation/(?P<idx>\d+)$', rotation),
url(r'^infoscreen/rotations$', rotations),
url(r'^infoscreen/instance$', createInfoInstance),
url(r'^infoscreen/instance/(?P<idx>\d+)$', deleteInfoInstance),
url(r'^infoscreen/types$', info_types),
url(r'^infoscreen/delete_item/(?P<type_id>\d+)/(?P<idx>\d+)$', delete_info_item),
url(r'^infoscreen/create_external_image$', createExternalImageInfoItem),
url(r'^infoscreen/create_image$', create_image_item),
url(r'^infoscreen/create_abbitem$', createABBItem),
url(r'^infoscreen/create_sossoitem$', createSossoItem),
url(r'^infoscreen/create_hslitem$', createHslItem),
url(r'^infoscreen/create_coffeeitem$', createCoffeeItem),
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),
#application
url(r'^application/$', application_index),
url(r'^application/success$', application_success_index),
url(r'^favicon\.ico$', favicon_view),
]
# main
url(r'^$', main_index),
url(r'^sikadmin$', admin_index),
# admin
url(r'^admin/', admin.site.urls),
# login stuff
url(r'^login$', login_view),
url(r'^logout$', logout_view),
# members
url(r'^members/$', member_list),
url(r'^members/list$', member_list),
url(r'^members/add$', add_member),
url(r'^members/add_many$', add_many_members),
url(r'^members/edit/(?P<index>\d+)$', edit_member),
url(r'^members/applications$', list_applications),
url(r'^members/edit_application/(?P<index>\d+)$', edit_application),
url(r'^members/api/members$', mems),
url(r'^members/api/member/(?P<idx>\d+)$', mem),
url(r'^members/api/member/$', mem),
url(r'^members/api/csvimport$', mem_csv_import),
url(r'^members/api/requests$', member_requests),
url(r'^members/api/request$', new_member_request),
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),
#infoscreen
url(r'^infoscreen/$', infodefault),
url(r'^infoscreen/(?P<idx>\d+)$', infoindex),
url(r'^infoscreen/items$', info_items),
url(r'^infoscreen/rotation/(?P<idx>\d+)$', rotation),
url(r'^infoscreen/rotations$', rotations),
url(r'^infoscreen/instance$', createInfoInstance),
url(r'^infoscreen/instance/(?P<idx>\d+)$', deleteInfoInstance),
url(r'^infoscreen/types$', info_types),
url(r'^infoscreen/delete_item/(?P<type_id>\d+)/(?P<idx>\d+)$', delete_info_item),
url(r'^infoscreen/create_external_image$', createExternalImageInfoItem),
url(r'^infoscreen/create_image$', create_image_item),
url(r'^infoscreen/create_abbitem$', createABBItem),
url(r'^infoscreen/create_sossoitem$', createSossoItem),
url(r'^infoscreen/create_hslitem$', createHslItem),
url(r'^infoscreen/create_coffeeitem$', createCoffeeItem),
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),
#application
url(r'^application/$', application_index),
url(r'^application/success$', application_success_index),
url(r'^favicon\.ico$', favicon_view),
# i18n default view for changing the active language
url(r'^i18n/', include('django.conf.urls.i18n')),
# staticfiles default view for static files in development
url(r'^static/(?P<path>.*)$', static_views.serve),
url(r'^media/(?P<path>.*)$', static_serve, {'document_root': settings.MEDIA_ROOT}),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+13
View File
@@ -0,0 +1,13 @@
{% load i18n %}
{% load static %}
{% load staticfiles %}
<link rel="stylesheet" href="{% static "css/footer.css" %}">
<div class="footer">
<form action="/i18n/setlang/" method="post"> {% csrf_token %}
<button id="fi-button" class="lang-button" name="language" value="fi"></button>
<button id="en-button" class="lang-button" name="language" value="en"></button>
</form>
<div>
{% trans "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" %} {% now 'Y' %}
</div>
</div>
+13
View File
@@ -0,0 +1,13 @@
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<h1>{% trans "SIK Admin" %}</h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam consectetur vitae arcu at bibendum. Nam vel vulputate massa, sit amet volutpat tellus. Fusce varius lectus iaculis nunc laoreet, ac ultricies nulla luctus. Nam fringilla ipsum vel tincidunt viverra. Fusce vestibulum, metus et tincidunt commodo, leo mauris vulputate magna, ut euismod magna nisi eu sem. Integer venenatis, enim in feugiat tempus, erat urna ornare turpis, in varius eros ligula vitae libero. Aliquam erat volutpat. Curabitur ac interdum quam. Duis ornare, eros ac laoreet finibus, libero arcu molestie tellus, id finibus velit lacus nec nibh. Morbi vehicula dolor vel imperdiet pharetra. Maecenas purus lorem, vulputate eget lacus ut, pharetra eleifend sem. Sed aliquam eleifend posuere. Maecenas ac scelerisque odio. Nunc facilisis cursus ornare. Sed neque turpis, sodales id rhoncus eget, vestibulum id urna. Nam ornare urna quis felis porta, vel mollis leo laoreet.
</p>
<p>
Proin sed odio a nisi aliquet blandit quis at dolor. Sed tincidunt neque vel ex pulvinar, auctor elementum magna euismod. Pellentesque vel porta justo, quis pulvinar diam. Pellentesque consectetur convallis tellus faucibus lobortis. Mauris ornare erat ac varius condimentum. Sed neque augue, semper quis iaculis a, tincidunt sed diam. Donec volutpat non justo quis mollis. Maecenas nisi enim, mollis sed hendrerit nec, mattis eu diam. Nunc a faucibus neque, scelerisque fermentum ligula. Pellentesque tempus pharetra tempor. Quisque tincidunt orci vel ullamcorper venenatis. Phasellus blandit et purus molestie facilisis. Maecenas auctor accumsan pellentesque. Ut vel mi sem. Etiam porttitor metus vitae nulla pulvinar, nec efficitur metus tincidunt.
</p>
{% endblock %}
+12
View File
@@ -0,0 +1,12 @@
{% load i18n %}
<nav class="navbar navbar-default sidebar" role="navigation">
<div class="container-fluid">
<div class="collapse navbar-collapse" id="bs-sidebar-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/sikadmin">SIK Admin</a></li>
</ul>
</div>
</div>
</nav>
+45
View File
@@ -0,0 +1,45 @@
{% load i18n %}
{% load static %}
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en" ng-app="webApp">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
<link rel="stylesheet" href="{% static "css/webapp.css" %}">
<title>Aalto-yliopiston Sähköinsinöörikilta ry</title>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<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://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-messages.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-aria.min.js"></script>
<script src="{% static "js/controllers.js" %}"></script>
</head>
<body>
<div class="page-content">
{% include "navigation.html" %}
{% block content %}
{% endblock %}
</div>
{% include "footer.html" %}
</body>
</html>
+7 -69
View File
@@ -1,73 +1,11 @@
<!DOCTYPE html>
<html lang="en" ng-app="webApp">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="uli uli">
<meta name="author" content="veedeeämkoo">
<title>Aalto-yliopiston Sähköinsinöörikilta ry</title>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel = "stylesheet">
<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://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!-- DatePicker -->
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-messages.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-aria.min.js"></script>
{%load staticfiles %}
</head>
<nav class="navbar navbar-default sidebar" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-sidebar-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="collapse navbar-collapse" id="bs-sidebar-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="/">SIK<span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-home"></span></a></li>
<li><a href="/kilta">Kilta</a></li>
<li><a href="/fuksit">Fuksit</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Yritykset <span class="caret"></span><span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-user"></span></a>
<ul class="dropdown-menu forAnimate" role="menu">
<li><a href="#">Työpaikat</a></li>
<li><a href="#">Yritysdadaa</a></li>
<li><a href="#">Lisää yritysdadaa</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
<li class="divider"></li>
<li><a href="#">Informes</a></li>
</ul>
</li>
<li ><a href="/kalenteri">Tapahtumakalenteri<span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-th-list"></span></a></li>
<li ><a href="/international">International<span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-tags"></span></a></li>
<li ><a href="/sosso">Sosso</a></li>
<li ><a href="/contact">Yhteystiedot<span class="pull-right hidden-xs showopacity glyphicon glyphicon-book"></span></a></li>
</ul>
</div>
</div>
</nav>
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<h3>HURDURR DUMMY SITE</h3>
<div>
<a href="/members">Members</a>
<a href="/infoscreen">Infoscreen</a>
<a href="/admin">Admin</a>
<a href="/members">{% trans "Members" %}</a>
<a href="/infoscreen">{% trans "Infoscreen" %}</a>
<a href="/admin">{% trans "Admin tools" %}</a>
</div>
{% endblock %}
+36
View File
@@ -0,0 +1,36 @@
{% load i18n %}
<nav class="navbar navbar-default sidebar" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-sidebar-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="collapse navbar-collapse" id="bs-sidebar-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="/">SIK<span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-home"></span></a></li>
<li><a href="/kilta">Kilta</a></li>
<li><a href="/fuksit">Fuksit</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Yritykset<span class="caret"></span><span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-user"></span></a>
<ul class="dropdown-menu forAnimate" role="menu">
<li><a href="#">Työpaikat</a></li>
<li><a href="#">Yritysdadaa</a></li>
<li><a href="#">Lisää yritysdadaa</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
<li class="divider"></li>
<li><a href="#">Informes</a></li>
</ul>
</li>
<li ><a href="/kalenteri">{% trans "Event calendar" %}<span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-th-list"></span></a></li>
<li ><a href="/international">{% trans "International" %}<span style="font-size:16px;" class="pull-right hidden-xs showopacity glyphicon glyphicon-tags"></span></a></li>
<li ><a href="/sosso">{% trans "Sössö" %}</a></li>
<li ><a href="/contact">{% trans "Contact" %}<span class="pull-right hidden-xs showopacity glyphicon glyphicon-book"></span></a></li>
</ul>
</div>
</div>
</nav>
+9 -1
View File
@@ -1,6 +1,8 @@
from django.shortcuts import render, redirect
from django.contrib.auth import login, logout, authenticate
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import ensure_csrf_cookie
from django.contrib.auth.decorators import permission_required
from django.conf import settings
import logging
@@ -10,7 +12,13 @@ logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=setti
@require_http_methods(["GET"])
def main_index(request, *args, **kwargs):
return render(request, "main_index.html", {})
return render(request, "main_index.html", {})
@require_http_methods(["GET", "POST"])
@ensure_csrf_cookie
@permission_required('members.change_member', login_url='/login')
def admin_index(request, *args, **kwargs):
return render(request, "admin_index.html", {})
@require_http_methods(["GET", "POST"])
def login_view(request, *args, **kwargs):