Merge branch 'develop' into 'master'

Develop

Closes #54

See merge request !34
This commit is contained in:
Jan Tuomi
2017-06-01 19:47:59 +03:00
19 changed files with 822 additions and 301 deletions
+55 -5
View File
@@ -1,5 +1,55 @@
td{
max-width:12vw;
overflow:hidden;
word-wrap:break-word;
}
html {
font-size: 16px;
}
body {
padding: 1.5rem;
margin: 0.5rem;
}
tbody {
border: 1px solid #ddd;
}
div {
margin-bottom: 0.5rem;
}
td {
max-width: 12vw;
overflow: hidden;
word-wrap: break-word;
}
@media (min-width: 760px) {
body {
font-size: 1rem;
}
}
@media (max-width: 760px) {
body {
font-size: 0.7rem;
padding: 0;
}
h1 {
font-size: 2.5rem;
}
h2 {
font-size: 1.5rem;
}
.logout-button {
margin: 0;
}
table>tbody>tr>td,
table>tbody>tr>th {
white-space: normal;
padding: 0.2rem !important;
max-width: 100%;
}
}
#header {
max-width: 100%;
}
+137 -76
View File
@@ -4,7 +4,7 @@
<!DOCTYPE html>
<html ng-app="infoAdmin">
<head>
<meta charset="utf-8">
<meta charset="utf-8" name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1" />
<title>Infoscreen admin</title>
<script src="{% static "js/lib/angular.js" %}"></script>
<script src="{% static "js/lib/ng-file-upload-bower-12.2.11/ng-file-upload-all.js" %}"></script>
@@ -25,87 +25,148 @@
</form>
</div>
</div>
<div class="container">
<div class="container" ng-controller="infoadmin_ctrl">
<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 "Type" %}</th>
<th>{% trans "Set duration" %}</th>
<th>{% trans "Add to rotation" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="i in infoitems | orderBy:['display_name','name']">
<td>{$ i.name $}</td>
<td>{$ i.display_name $}</td>
<td><input type="number" min="1" max="60" 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>
<ul class="nav nav-tabs" role="tablist">
<li class="active"><a data-toggle="tab" href="#slides" role="tab">{% trans "Manage Slides" %}</a></li>
<li class="dropdown">
<a data-toggle="dropdown" href="#">{% trans "Manage Rotations" %}<span class="caret"></span></a>
<ul class="dropdown-menu">
<li ng-repeat="r in rotations"><a href="#rotations" ng-click="selectRotation(r.id)" data-toggle="tab">{$ r.name $}</a></li>
<li class="divider">
<li class="nav-item"><a data-toggle="tab" href="#deleterot" role="tab">{% trans "Create/Delete" %}</a></li>
</ul>
<li><a data-toggle="tab" href="#settings" role="tab">{% trans "Settings" %}</a></li>
</ul>
<div class="tab-content row">
<div id="slides" class="tab-pane active">
<div ng-controller="infoadmin_ctrl">
<div class="col-xs-12 col-md-6">
<h2>{% trans "Create new item" %}</h2>
<div>{% trans "Create a new item by type" %}</div>
<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 | orderBy: 'name'">
<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 "Info items" %}</h2>
<div>{% trans "Infoitems available for rotations" %}</div>
<table class="table table-striped">
<tr>
<th>{% trans "Item" %}</th>
<th>{% trans "Type" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="i in infoitems | orderBy:['display_name','name']">
<td>{$ i.name $}</td>
<td>{$ i.display_name $}</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 "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>
<div id="rotations" class="tab-pane" 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 "Type" %}</th>
<th>{% trans "Set duration" %}</th>
<th>{% trans "Add to rotation" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="i in infoitems | orderBy:['display_name','name']">
<td>{$ i.name $}</td>
<td>{$ i.display_name $}</td>
<td><input type="number" min="1" max="60" 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>
</div>
<div class="col-xs-12 col-md-6">
<h2>{% trans "Rotation" %}: {$ selected_rot.name $}<a href="/infoscreen/{$ selected_rot.id $}"><input type="button" class="btn btn-primary pull-right" value="{% trans "Preview" %}"></a></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 id="deleterot" class="tab-pane">
<div class="col-xs-12 " ng-controller="infoadmin_ctrl">
<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 "Preview" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
<tr ng-repeat="r in rotations">
<td>{$ r.name $}</td>
<td>{$ r.id $}</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>
</tr>
</table>
</div>
</div>
<div id="settings" class="tab-pane">
<div>
<div class="col-md-12">
<h2>{% trans "Settings" %}</h2>
</div>
<form action="/i18n/setlang/" method="post" class="form-group"> {% csrf_token %}
<div class="col-md-12">
<h4>{% trans "Language" %}</h4>
</div>
<div class="col-md-6">
<select name="language" class="form-control">
<option value="fi" {% if LANGUAGE_CODE == "fi" %} selected {% endif %}>{% trans "Finnish" %}</option>
<option value="en" {% if LANGUAGE_CODE == "en" %} selected {% endif %}>{% trans "English" %}</option>
</select>
</div>
<div class="col-md-3">
<input type="submit" class="btn btn-success" value="{% trans "Submit" %}">
</div>
</form>
</div>
</div>
</div>
<div style="margin-top: 100px;">
Binary file not shown.
+175 -96
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-26 19:53+0300\n"
"POT-Creation-Date: 2017-06-01 19:20+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"
@@ -50,7 +50,7 @@ msgid "External image"
msgstr "External image"
#: infoscreen/templates/infoscreen_admin.html:24
#: members/templates/members_base.html:69
#: members/templates/members_base.html:79
msgid "Log out"
msgstr "Log out"
@@ -58,99 +58,119 @@ msgstr "Log out"
msgid "Infoscreen Admin Pane"
msgstr "Infoscreen Admin Pane"
#: infoscreen/templates/infoscreen_admin.html:36
#: infoscreen/templates/infoscreen_admin.html:35
msgid "Manage Slides"
msgstr ""
#: infoscreen/templates/infoscreen_admin.html:37
msgid "Manage Rotations"
msgstr "Manage Rotations"
#: infoscreen/templates/infoscreen_admin.html:41
msgid "Create/Delete"
msgstr "Create/Delete"
#: infoscreen/templates/infoscreen_admin.html:48
msgid "Create new item"
msgstr "Create new item"
#: infoscreen/templates/infoscreen_admin.html:49
#, fuzzy
#| msgid "Create new item"
msgid "Create a new item by type"
msgstr "Create new item"
#: infoscreen/templates/infoscreen_admin.html:52
msgid "Item type"
msgstr "Item type"
#: infoscreen/templates/infoscreen_admin.html:63
#: infoscreen/templates/infoscreen_admin.html:83
msgid "Info items"
msgstr "Info items"
#: infoscreen/templates/infoscreen_admin.html:37
#: infoscreen/templates/infoscreen_admin.html:64
#: infoscreen/templates/infoscreen_admin.html:84
msgid "Infoitems available for rotations"
msgstr "Infoitems available for rotations"
#: infoscreen/templates/infoscreen_admin.html:40
#: infoscreen/templates/infoscreen_admin.html:67
#: infoscreen/templates/infoscreen_admin.html:87
msgid "Item"
msgstr "Item"
#: infoscreen/templates/infoscreen_admin.html:41
#: infoscreen/templates/infoscreen_admin.html:68
#: infoscreen/templates/infoscreen_admin.html:88
msgid "Type"
msgstr "Type"
#: infoscreen/templates/infoscreen_admin.html:42
msgid "Set duration"
msgstr "Set duration"
#: infoscreen/templates/infoscreen_admin.html:43
msgid "Add to rotation"
msgstr "Add to rotation"
#: infoscreen/templates/infoscreen_admin.html:44
#: infoscreen/templates/infoscreen_admin.html:51
#: infoscreen/templates/infoscreen_admin.html:78
#: infoscreen/templates/infoscreen_admin.html:85
#: infoscreen/templates/infoscreen_admin.html:102
#: infoscreen/templates/infoscreen_admin.html:106
#: infoscreen/templates/infoscreen_admin.html:69
#: infoscreen/templates/infoscreen_admin.html:74
#: infoscreen/templates/infoscreen_admin.html:91
#: infoscreen/templates/infoscreen_admin.html:98
#: infoscreen/templates/infoscreen_admin.html:112
#: infoscreen/templates/infoscreen_admin.html:116
#: infoscreen/templates/infoscreen_admin.html:134
#: infoscreen/templates/infoscreen_admin.html:140
#: members/templates/member_edit.html:20 members/templates/payment_edit.html:20
msgid "Delete"
msgstr "Delete"
#: infoscreen/templates/infoscreen_admin.html:50
#: infoscreen/templates/infoscreen_admin.html:89
msgid "Set duration"
msgstr "Set duration"
#: infoscreen/templates/infoscreen_admin.html:90
msgid "Add to rotation"
msgstr "Add to rotation"
#: infoscreen/templates/infoscreen_admin.html:97
msgid "Add"
msgstr "Add"
#: infoscreen/templates/infoscreen_admin.html:54
msgid "Create new item"
msgstr "Create new item"
#: infoscreen/templates/infoscreen_admin.html:57
msgid "Item type"
msgstr "Item type"
#: infoscreen/templates/infoscreen_admin.html:68
msgid "Rotations"
msgstr "Rotations"
#: infoscreen/templates/infoscreen_admin.html:70
msgid "Select rotation to edit"
msgstr "Select rotation to edit"
#: infoscreen/templates/infoscreen_admin.html:74
#: infoscreen/templates/infoscreen_admin.html:96
#: infoscreen/templates/infoscreen_admin.html:106
#: infoscreen/templates/infoscreen_admin.html:131
msgid "Rotation"
msgstr "Rotation"
#: infoscreen/templates/infoscreen_admin.html:75
msgid "id"
msgstr "id"
#: infoscreen/templates/infoscreen_admin.html:76
#: infoscreen/templates/infoscreen_admin.html:83
msgid "Select"
msgstr "Select"
#: infoscreen/templates/infoscreen_admin.html:77
#: infoscreen/templates/infoscreen_admin.html:84
#: infoscreen/templates/infoscreen_admin.html:106
#: infoscreen/templates/infoscreen_admin.html:133
#: infoscreen/templates/infoscreen_admin.html:139
msgid "Preview"
msgstr "Preview"
#: infoscreen/templates/infoscreen_admin.html:88
msgid "Name"
msgstr "Name"
#: infoscreen/templates/infoscreen_admin.html:89
msgid "Create new"
msgstr "Create new"
#: infoscreen/templates/infoscreen_admin.html:97
#: infoscreen/templates/infoscreen_admin.html:107
msgid "Instances in currently selected rotation"
msgstr "Instances in currently selected rotation"
#: infoscreen/templates/infoscreen_admin.html:100
#: infoscreen/templates/infoscreen_admin.html:110
msgid "Instance"
msgstr "Instance"
#: infoscreen/templates/infoscreen_admin.html:101
#: infoscreen/templates/infoscreen_admin.html:111
msgid "Duration"
msgstr "Duration"
#: infoscreen/templates/infoscreen_admin.html:125
msgid "Rotations"
msgstr "Rotations"
#: infoscreen/templates/infoscreen_admin.html:127
msgid "Select rotation to edit"
msgstr "Select rotation to edit"
#: infoscreen/templates/infoscreen_admin.html:132
msgid "id"
msgstr "id"
#: infoscreen/templates/infoscreen_admin.html:143
msgid "Name"
msgstr "Name"
#: infoscreen/templates/infoscreen_admin.html:144
msgid "Create new"
msgstr "Create new"
#: members/models.py:16
msgid "First name"
msgstr "First name"
@@ -195,7 +215,7 @@ msgstr "Cash"
msgid "Bank transfer"
msgstr "Bank transfer"
#: members/models.py:98
#: members/models.py:102
msgid "Created"
msgstr "Created"
@@ -239,7 +259,7 @@ msgstr "Error"
msgid "Back"
msgstr "Back"
#: members/templates/member_add.html:8 members/templates/members_base.html:45
#: members/templates/member_add.html:8 members/templates/members_base.html:55
msgid "Add member"
msgstr "Add member"
@@ -289,6 +309,31 @@ msgstr "Are you sure you want to delete this member?"
msgid "Yes, I'm sure"
msgstr "Yes, I'm sure"
#: members/templates/member_duplicates.html:9
msgid "Conflicting member entries"
msgstr ""
#: members/templates/member_duplicates.html:13
msgid ""
"Found conflicting member entries. Choose how to handle the problematic data."
msgstr ""
#: members/templates/member_duplicates.html:29
msgid "Which one has the correct information for this member?"
msgstr ""
#: members/templates/member_duplicates.html:31
msgid "Accept first and remove second"
msgstr ""
#: members/templates/member_duplicates.html:32
msgid "Accept second and remove first"
msgstr ""
#: members/templates/member_duplicates.html:33
msgid "Accept both as two members"
msgstr ""
#: members/templates/member_edit.html:9
msgid "Edit member"
msgstr "Edit member"
@@ -297,51 +342,64 @@ msgstr "Edit member"
msgid "Member register"
msgstr "Member register"
#: members/templates/member_list.html:23
#: members/templates/member_list.html:16
msgid ""
"There are duplicate member entries in the register.\n"
" Please visit <a href=\"/members/duplicates\">duplicate resolver</a>."
msgstr ""
#: members/templates/member_list.html:28
#, fuzzy
#| msgid "Member register"
msgid "Members in register:"
msgstr "Member register"
#: members/templates/member_list.html:34
msgid "Download CSV"
msgstr "Download CSV"
#: members/templates/members_base.html:33
#: members/templates/members_base.html:42
msgid "Member register of SIK ry"
msgstr "Member register of SIK ry"
#: members/templates/members_base.html:42 webapp/templates/main_index.html:7
#: members/templates/members_base.html:52 webapp/templates/main_index.html:7
msgid "Members"
msgstr "Members"
#: members/templates/members_base.html:44
#: members/templates/members_base.html:54
msgid "List members"
msgstr "List members"
#: members/templates/members_base.html:46
#: members/templates/members_base.html:56
msgid "Add multiple"
msgstr "Add multiple"
#: members/templates/members_base.html:50
#: members/templates/members_base.html:60
msgid "Payments"
msgstr "Payments"
#: members/templates/members_base.html:52
#: members/templates/members_base.html:62
msgid "List payments"
msgstr "List payments"
#: members/templates/members_base.html:53 members/templates/payment_add.html:8
#: members/templates/members_base.html:63 members/templates/payment_add.html:8
msgid "Add payment"
msgstr "Add payment"
#: members/templates/members_base.html:57
#: members/templates/members_base.html:67
msgid "Applications"
msgstr "Applications"
#: members/templates/members_base.html:59
#: members/templates/members_base.html:69
msgid "List applications"
msgstr "List applications"
#: members/templates/members_base.html:60
#: members/templates/members_base.html:70
msgid "Application form"
msgstr "Application form"
#: members/templates/members_base.html:65 members/templates/settings.html:11
#: members/templates/members_base.html:75 members/templates/settings.html:11
msgid "Settings"
msgstr "Settings"
@@ -361,96 +419,102 @@ msgstr "Payment events"
msgid "Language"
msgstr "Language"
#: members/templates/settings.html:20 sikweb/settings-sample.py:177
#: members/templates/settings.html:20 sikweb/settings-sample.py:179
#: sikweb/settings.py:177
msgid "Finnish"
msgstr "Finnish"
#: members/templates/settings.html:21 sikweb/settings-sample.py:176
#: members/templates/settings.html:21 sikweb/settings-sample.py:178
#: sikweb/settings.py:176
msgid "English"
msgstr "English"
#: members/views.py:114 members/views.py:171 members/views.py:190
#: members/views.py:129 members/views.py:186 members/views.py:205
msgid "No member id specified"
msgstr "No member id specified"
#: members/views.py:136
#: members/views.py:151
msgid "Successfully added member"
msgstr "Successfully added member"
#: members/views.py:157
#: members/views.py:172
msgid "Successfully updated member"
msgstr "Successfully updated member"
#: members/views.py:161
#: members/views.py:176
msgid "Could not update member object"
msgstr "Could not update member object"
#: members/views.py:175
#: members/views.py:190
msgid "Successfully deleted member"
msgstr "Successfully deleted member"
#: members/views.py:181
#: members/views.py:196
msgid "Could not delete member object"
msgstr "Could not delete member object"
#: members/views.py:224 members/views.py:258 members/views.py:276
#: members/views.py:239 members/views.py:273 members/views.py:291
msgid "No application id specified"
msgstr "No application id specified"
#: members/views.py:245
#: members/views.py:260
msgid "Successfully accepted application"
msgstr "Successfully accepted application"
#: members/views.py:248
#: members/views.py:263
msgid "Could not accept application object"
msgstr "Could not accept application object"
#: members/views.py:262
#: members/views.py:277
msgid "Successfully deleted application"
msgstr "Successfully deleted application"
#: members/views.py:267
#: members/views.py:282
msgid "Could not delete application object"
msgstr "Could not delete application object"
#: members/views.py:331
#: members/views.py:346
msgid "Successfully added payment for member"
msgstr "Successfully added payment for member"
#: members/views.py:344 members/views.py:357 members/views.py:371
#: members/views.py:359 members/views.py:372 members/views.py:386
msgid "No payment id specified"
msgstr "No payment id specified"
#: members/views.py:375
#: members/views.py:390
msgid "Successfully deleted payment"
msgstr "Successfully deleted payment"
#: members/views.py:380
#: members/views.py:395
msgid "Could not delete payment object"
msgstr "Could not delete payment object"
#: members/views.py:395
#: members/views.py:410
msgid "Successfully updated payment"
msgstr "Successfully updated payment"
#: members/views.py:398
#: members/views.py:413
msgid "Could not update payment object"
msgstr "Could not update payment object"
#: members/views.py:415
#: members/views.py:430
msgid "Missing \"textfield\" POST request field"
msgstr "Missing \"textfield\" POST request field"
#: members/views.py:420
#: members/views.py:435
msgid "Successfully imported multiple members"
msgstr "Successfully imported multiple members"
#: members/views.py:423
#: members/views.py:438
msgid "Failed to import members"
msgstr "Failed to import members"
#: members/views.py:504
#, fuzzy
#| msgid "Successfully deleted member"
msgid "Successfully resolved all member conflicts."
msgstr "Successfully deleted member"
#: templates/footer.html:7
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
@@ -463,6 +527,18 @@ msgstr "SIK Admin"
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
#: webapp/templates/login.html:25 webapp/templates/login.html:27
msgid "Username"
msgstr "Username"
#: webapp/templates/login.html:31 webapp/templates/login.html:33
msgid "Password"
msgstr "Password"
#: webapp/templates/login.html:43
msgid "Log in"
msgstr "Log in"
#: webapp/templates/main_index.html:8
msgid "Infoscreen"
msgstr "Infoscreen"
@@ -486,3 +562,6 @@ msgstr "Sössö"
#: webapp/templates/navigation.html:32
msgid "Contact"
msgstr "Contact"
#~ msgid "Select"
#~ msgstr "Select"
Binary file not shown.
+173 -96
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-26 19:53+0300\n"
"POT-Creation-Date: 2017-06-01 19:20+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"
@@ -51,7 +51,7 @@ msgid "External image"
msgstr "Ulkoinen kuva"
#: infoscreen/templates/infoscreen_admin.html:24
#: members/templates/members_base.html:69
#: members/templates/members_base.html:79
msgid "Log out"
msgstr "Kirjaudu ulos"
@@ -59,99 +59,117 @@ msgstr "Kirjaudu ulos"
msgid "Infoscreen Admin Pane"
msgstr "Infonäyttöjen hallintapaneeli"
#: infoscreen/templates/infoscreen_admin.html:36
#: infoscreen/templates/infoscreen_admin.html:35
msgid "Manage Slides"
msgstr "Hallinnoi dioja"
#: infoscreen/templates/infoscreen_admin.html:37
msgid "Manage Rotations"
msgstr "Hallinnoi Rotaatioita"
#: infoscreen/templates/infoscreen_admin.html:41
msgid "Create/Delete"
msgstr "Lisää/Poista"
#: infoscreen/templates/infoscreen_admin.html:48
msgid "Create new item"
msgstr "Luo uusi dia"
#: infoscreen/templates/infoscreen_admin.html:49
msgid "Create a new item by type"
msgstr "Luo uusi dia tyypin perusteella"
#: infoscreen/templates/infoscreen_admin.html:52
msgid "Item type"
msgstr "Diatyyppi"
#: infoscreen/templates/infoscreen_admin.html:63
#: infoscreen/templates/infoscreen_admin.html:83
msgid "Info items"
msgstr "Diat"
#: infoscreen/templates/infoscreen_admin.html:37
#: infoscreen/templates/infoscreen_admin.html:64
#: infoscreen/templates/infoscreen_admin.html:84
msgid "Infoitems available for rotations"
msgstr "Rotaatioon lisättävät diat"
#: infoscreen/templates/infoscreen_admin.html:40
#: infoscreen/templates/infoscreen_admin.html:67
#: infoscreen/templates/infoscreen_admin.html:87
msgid "Item"
msgstr "Dia"
#: infoscreen/templates/infoscreen_admin.html:41
#: infoscreen/templates/infoscreen_admin.html:68
#: infoscreen/templates/infoscreen_admin.html:88
msgid "Type"
msgstr "Tyyppi"
#: infoscreen/templates/infoscreen_admin.html:42
msgid "Set duration"
msgstr "Aseta kesto"
#: infoscreen/templates/infoscreen_admin.html:43
msgid "Add to rotation"
msgstr "Lisää rotaatioon"
#: infoscreen/templates/infoscreen_admin.html:44
#: infoscreen/templates/infoscreen_admin.html:51
#: infoscreen/templates/infoscreen_admin.html:78
#: infoscreen/templates/infoscreen_admin.html:85
#: infoscreen/templates/infoscreen_admin.html:102
#: infoscreen/templates/infoscreen_admin.html:106
#: infoscreen/templates/infoscreen_admin.html:69
#: infoscreen/templates/infoscreen_admin.html:74
#: infoscreen/templates/infoscreen_admin.html:91
#: infoscreen/templates/infoscreen_admin.html:98
#: infoscreen/templates/infoscreen_admin.html:112
#: infoscreen/templates/infoscreen_admin.html:116
#: infoscreen/templates/infoscreen_admin.html:134
#: infoscreen/templates/infoscreen_admin.html:140
#: members/templates/member_edit.html:20 members/templates/payment_edit.html:20
msgid "Delete"
msgstr "Poista"
#: infoscreen/templates/infoscreen_admin.html:50
#: infoscreen/templates/infoscreen_admin.html:89
msgid "Set duration"
msgstr "Aseta kesto"
#: infoscreen/templates/infoscreen_admin.html:90
msgid "Add to rotation"
msgstr "Lisää rotaatioon"
#: infoscreen/templates/infoscreen_admin.html:97
msgid "Add"
msgstr "Lisää"
#: infoscreen/templates/infoscreen_admin.html:54
msgid "Create new item"
msgstr "Luo uusi dia"
#: infoscreen/templates/infoscreen_admin.html:57
msgid "Item type"
msgstr "Diatyyppi"
#: infoscreen/templates/infoscreen_admin.html:68
msgid "Rotations"
msgstr "Rotaatiot"
#: infoscreen/templates/infoscreen_admin.html:70
msgid "Select rotation to edit"
msgstr "Valitse muokattava rotaatio"
#: infoscreen/templates/infoscreen_admin.html:74
#: infoscreen/templates/infoscreen_admin.html:96
#: infoscreen/templates/infoscreen_admin.html:106
#: infoscreen/templates/infoscreen_admin.html:131
msgid "Rotation"
msgstr "Rotaatio"
#: infoscreen/templates/infoscreen_admin.html:75
msgid "id"
msgstr "id"
#: infoscreen/templates/infoscreen_admin.html:76
#: infoscreen/templates/infoscreen_admin.html:83
msgid "Select"
msgstr "Valitse"
#: infoscreen/templates/infoscreen_admin.html:77
#: infoscreen/templates/infoscreen_admin.html:84
#: infoscreen/templates/infoscreen_admin.html:106
#: infoscreen/templates/infoscreen_admin.html:133
#: infoscreen/templates/infoscreen_admin.html:139
msgid "Preview"
msgstr "Esikatsele"
#: infoscreen/templates/infoscreen_admin.html:88
msgid "Name"
msgstr "Nimi"
#: infoscreen/templates/infoscreen_admin.html:89
msgid "Create new"
msgstr "Luo uusi"
#: infoscreen/templates/infoscreen_admin.html:97
#: infoscreen/templates/infoscreen_admin.html:107
msgid "Instances in currently selected rotation"
msgstr "Nykyisen rotaation diat"
#: infoscreen/templates/infoscreen_admin.html:100
#: infoscreen/templates/infoscreen_admin.html:110
msgid "Instance"
msgstr "Dia"
#: infoscreen/templates/infoscreen_admin.html:101
#: infoscreen/templates/infoscreen_admin.html:111
msgid "Duration"
msgstr "Kesto"
#: infoscreen/templates/infoscreen_admin.html:125
msgid "Rotations"
msgstr "Rotaatiot"
#: infoscreen/templates/infoscreen_admin.html:127
msgid "Select rotation to edit"
msgstr "Valitse muokattava rotaatio"
#: infoscreen/templates/infoscreen_admin.html:132
msgid "id"
msgstr "id"
#: infoscreen/templates/infoscreen_admin.html:143
msgid "Name"
msgstr "Nimi"
#: infoscreen/templates/infoscreen_admin.html:144
msgid "Create new"
msgstr "Luo uusi"
#: members/models.py:16
msgid "First name"
msgstr "Etunimi"
@@ -196,7 +214,7 @@ msgstr "Käteinen"
msgid "Bank transfer"
msgstr "Tilisiirto"
#: members/models.py:98
#: members/models.py:102
msgid "Created"
msgstr "Lisätty"
@@ -240,7 +258,7 @@ msgstr "Virhe"
msgid "Back"
msgstr "Takaisin"
#: members/templates/member_add.html:8 members/templates/members_base.html:45
#: members/templates/member_add.html:8 members/templates/members_base.html:55
msgid "Add member"
msgstr "Lisää jäsen"
@@ -293,6 +311,32 @@ msgstr "Oletko varma, että haluat poistaa tämän jäsenen?"
msgid "Yes, I'm sure"
msgstr "Kyllä, olen varma"
#: members/templates/member_duplicates.html:9
msgid "Conflicting member entries"
msgstr "Ongelmalliset jäsentiedot"
#: members/templates/member_duplicates.html:13
msgid ""
"Found conflicting member entries. Choose how to handle the problematic data."
msgstr ""
"Ongelmallista jäsendataa havaittu. Valitse, miten ongelmat ratkaistaan."
#: members/templates/member_duplicates.html:29
msgid "Which one has the correct information for this member?"
msgstr "Kummassa on jäsenen oikeat tiedot?"
#: members/templates/member_duplicates.html:31
msgid "Accept first and remove second"
msgstr "Hyväksy ensimmäinen ja poista toinen"
#: members/templates/member_duplicates.html:32
msgid "Accept second and remove first"
msgstr "Hyväksy toinen ja poista ensimmäinen"
#: members/templates/member_duplicates.html:33
msgid "Accept both as two members"
msgstr "Hyväksy molemmat kahtena jäsenenä"
#: members/templates/member_edit.html:9
msgid "Edit member"
msgstr "Muokkaa jäsentä"
@@ -301,51 +345,65 @@ msgstr "Muokkaa jäsentä"
msgid "Member register"
msgstr "Jäsenrekisteri"
#: members/templates/member_list.html:23
#: members/templates/member_list.html:16
msgid ""
"There are duplicate member entries in the register.\n"
" Please visit <a href=\"/members/duplicates\">duplicate resolver</a>."
msgstr ""
"Jäsenrekisterissä on duplikaattijäseniä.\n"
" Käytä ongelman ratkaisuun <a href=\"/members/duplicates"
"\">duplikaattityökalua</a>."
#: members/templates/member_list.html:28
msgid "Members in register:"
msgstr "Jäseniä:"
#: members/templates/member_list.html:34
msgid "Download CSV"
msgstr "Lataa CSV"
#: members/templates/members_base.html:33
#: members/templates/members_base.html:42
msgid "Member register of SIK ry"
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry:n jäsenrekisteri"
#: members/templates/members_base.html:42 webapp/templates/main_index.html:7
#: members/templates/members_base.html:52 webapp/templates/main_index.html:7
msgid "Members"
msgstr "Jäsenet"
#: members/templates/members_base.html:44
#: members/templates/members_base.html:54
msgid "List members"
msgstr "Jäsenlistaus"
#: members/templates/members_base.html:46
#: members/templates/members_base.html:56
msgid "Add multiple"
msgstr "Lisää useita"
#: members/templates/members_base.html:50
#: members/templates/members_base.html:60
msgid "Payments"
msgstr "Maksutapahtumat"
#: members/templates/members_base.html:52
#: members/templates/members_base.html:62
msgid "List payments"
msgstr "Maksulistaus"
#: members/templates/members_base.html:53 members/templates/payment_add.html:8
#: members/templates/members_base.html:63 members/templates/payment_add.html:8
msgid "Add payment"
msgstr "Lisää maksu"
#: members/templates/members_base.html:57
#: members/templates/members_base.html:67
msgid "Applications"
msgstr "Jäsenhakemukset"
#: members/templates/members_base.html:59
#: members/templates/members_base.html:69
msgid "List applications"
msgstr "Hakemuslistaus"
#: members/templates/members_base.html:60
#: members/templates/members_base.html:70
msgid "Application form"
msgstr "Jäsenhakemuslomake"
#: members/templates/members_base.html:65 members/templates/settings.html:11
#: members/templates/members_base.html:75 members/templates/settings.html:11
msgid "Settings"
msgstr "Asetukset"
@@ -365,96 +423,100 @@ msgstr "Maksutapahtumat"
msgid "Language"
msgstr "Kieli"
#: members/templates/settings.html:20 sikweb/settings-sample.py:177
#: members/templates/settings.html:20 sikweb/settings-sample.py:179
#: sikweb/settings.py:177
msgid "Finnish"
msgstr "suomi"
#: members/templates/settings.html:21 sikweb/settings-sample.py:176
#: members/templates/settings.html:21 sikweb/settings-sample.py:178
#: sikweb/settings.py:176
msgid "English"
msgstr "englanti"
#: members/views.py:114 members/views.py:171 members/views.py:190
#: members/views.py:129 members/views.py:186 members/views.py:205
msgid "No member id specified"
msgstr "Jäsenen ID ei määritelty"
#: members/views.py:136
#: members/views.py:151
msgid "Successfully added member"
msgstr "Onnistuneesti lisättiin jäsen"
#: members/views.py:157
#: members/views.py:172
msgid "Successfully updated member"
msgstr "Onnistuneesti päivitettiin jäsen"
#: members/views.py:161
#: members/views.py:176
msgid "Could not update member object"
msgstr "Jäsenobjektia ei voitu päivittää"
#: members/views.py:175
#: members/views.py:190
msgid "Successfully deleted member"
msgstr "Onnistuneesti poistettiin jäsen"
#: members/views.py:181
#: members/views.py:196
msgid "Could not delete member object"
msgstr "Jäsenobjektia ei voitu poistaa"
#: members/views.py:224 members/views.py:258 members/views.py:276
#: members/views.py:239 members/views.py:273 members/views.py:291
msgid "No application id specified"
msgstr "Hakemuksen ID ei määritelty"
#: members/views.py:245
#: members/views.py:260
msgid "Successfully accepted application"
msgstr "Onnistuneesti hyväksyttiin hakemus"
#: members/views.py:248
#: members/views.py:263
msgid "Could not accept application object"
msgstr "Hakemusobjektia ei voitu hyväksyä"
#: members/views.py:262
#: members/views.py:277
msgid "Successfully deleted application"
msgstr "Onnistuneesti poistettiin hakemus"
#: members/views.py:267
#: members/views.py:282
msgid "Could not delete application object"
msgstr "Hakemusobjektia ei voitu poistaa"
#: members/views.py:331
#: members/views.py:346
msgid "Successfully added payment for member"
msgstr "Onnistuneesti lisättiin maksutapahtuma jäsenelle"
#: members/views.py:344 members/views.py:357 members/views.py:371
#: members/views.py:359 members/views.py:372 members/views.py:386
msgid "No payment id specified"
msgstr "Maksutapahtuman ID ei määritelty"
#: members/views.py:375
#: members/views.py:390
msgid "Successfully deleted payment"
msgstr "Onnistuneesti poistettiin maksutapahtuma"
#: members/views.py:380
#: members/views.py:395
msgid "Could not delete payment object"
msgstr "Maksutapahtumaobjektia ei voitu poistaa"
#: members/views.py:395
#: members/views.py:410
msgid "Successfully updated payment"
msgstr "Onnistuneesti päivitettiin maksutapahtuma"
#: members/views.py:398
#: members/views.py:413
msgid "Could not update payment object"
msgstr "Maksutapahtumaobjektia ei voitu päivittää"
#: members/views.py:415
#: members/views.py:430
msgid "Missing \"textfield\" POST request field"
msgstr "Puuttuva \"textfield\" POST-kenttä"
#: members/views.py:420
#: members/views.py:435
msgid "Successfully imported multiple members"
msgstr "Onnistuneesti tuotu useita jäseniä"
#: members/views.py:423
#: members/views.py:438
msgid "Failed to import members"
msgstr "Jäsenten tuonti epäonnistui"
#: members/views.py:504
msgid "Successfully resolved all member conflicts."
msgstr "Kaikki jäsenkonfliktit ratkaistu onnistuneesti."
#: templates/footer.html:7
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
@@ -467,6 +529,18 @@ msgstr "SIK Hallintapaneeli"
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
#: webapp/templates/login.html:25 webapp/templates/login.html:27
msgid "Username"
msgstr "Käyttäjänimi"
#: webapp/templates/login.html:31 webapp/templates/login.html:33
msgid "Password"
msgstr "Salasana"
#: webapp/templates/login.html:43
msgid "Log in"
msgstr "Kirjaudu sisään"
#: webapp/templates/main_index.html:8
msgid "Infoscreen"
msgstr "Infonäyttö"
@@ -490,3 +564,6 @@ msgstr "Sössö"
#: webapp/templates/navigation.html:32
msgid "Contact"
msgstr "Yhteystiedot"
#~ msgid "Select"
#~ msgstr "Valitse"
+2 -1
View File
@@ -1,7 +1,8 @@
from django.contrib import admin
from members.models import Member, Request, Payment
from members.models import Member, Request, Payment, MemberConflict
# Register your models here.
admin.site.register(Member)
admin.site.register(Request)
admin.site.register(Payment)
admin.site.register(MemberConflict)
+24
View File
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2017-05-28 20:32
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('members', '0011_auto_20170526_2013'),
]
operations = [
migrations.CreateModel(
name='MemberConflict',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberconflict_first_member', to='members.Member')),
('second_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberconflict_second_member', to='members.Member')),
],
),
]
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2017-06-01 15:22
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('members', '0012_memberconflict'),
]
operations = [
migrations.AlterField(
model_name='payment',
name='member',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='payments', to='members.Member'),
),
]
+23 -1
View File
@@ -85,7 +85,11 @@ class Payment(models.Model):
('bank_transfer', _('Bank transfer')),
], max_length=255)
member = models.ForeignKey('Member', on_delete=models.SET_NULL, blank=True, null=True)
member = models.ForeignKey('Member',
on_delete=models.PROTECT,
blank=True,
null=True,
related_name='payments')
def __str__(self):
return 'Payment no. {}, {}'.format(self.id, str(self.date))
@@ -119,3 +123,21 @@ class Member(BaseMember):
AYY=bool(array[4]),
jas=bool(array[5]),
)
class MemberConflict(models.Model):
first_member = models.ForeignKey('Member', related_name='%(class)s_first_member')
second_member = models.ForeignKey('Member', related_name='%(class)s_second_member')
@property
def first_member_form(self):
return MemberForm(instance=self.first_member)
@property
def second_member_form(self):
return MemberForm(instance=self.second_member)
# To avoid problems with a cyclical import, this is at the bottom of the file
from members.forms import MemberForm # nopep8
+24
View File
@@ -246,3 +246,27 @@ input {
max-width: 100%;
height: 10rem !important;
}
.conflict-row {
overflow: auto;
margin-bottom: 2rem;
border: 1px dotted black;
}
.table-conflict {
}
.conflict-row>div>table>tbody>tr>th,
.conflict-row>div>table>tbody>tr>td {
border-top: none;
padding: 1rem;
}
.conflict-row>div {
}
.member_count {
margin-bottom: 0.5rem;
font-size: 1.2rem;
text-align: right;
}
+40
View File
@@ -0,0 +1,40 @@
{% extends "members_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block content %}
<div>
<div>
<h3>{% trans "Conflicting member entries" %}</h3>
</div>
<div>
<p>{% blocktrans %}Found conflicting member entries. Choose how to handle the problematic data.{% endblocktrans %}</p>
{% for conflict in conflicts %}
<div class="conflict-row">
<div class="col-md-6">
<table class="table readonly table-conflict bg-info" >
{{ conflict.first_member_form }}
</table>
</div>
<div class="col-md-6">
<table class="table readonly table-conflict bg-info" >
{{ conflict.second_member_form }}
</table>
</div>
<div>
<form action="/members/resolve_conflict" method="POST">{% csrf_token %}
<p>{% blocktrans %}Which one has the correct information for this member?{% endblocktrans %}</p>
<input type="hidden" name="id" value="{{ conflict.id }}">
<button type="submit" name="action" value="first" class="btn btn-primary">{% trans "Accept first and remove second" %}</button>
<button type="submit" name="action" value="second" class="btn btn-primary">{% trans "Accept second and remove first" %}</button>
<button type="submit" name="action" value="both" class="btn btn-primary">{% trans "Accept both as two members" %}</button>
</form>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock content %}
+11
View File
@@ -11,12 +11,23 @@
<h2>{% trans "Member register" %}</h2>
</div>
{% if is_member_conflict %}
<div class="alert alert-warning">
{% blocktrans %}There are duplicate member entries in the register.
Please visit <a href="/members/duplicates">duplicate resolver</a>.{% endblocktrans %}
</div>
{% endif %}
{% if notification %}
<div class="alert alert-success">
{{ notification }}
</div>
{% endif %}
<div class="member_count">
<span>{% trans "Members in register:" %} {{ member_count }}</span>
</div>
{{ table|safe }}
<div>
+1 -1
View File
@@ -20,7 +20,7 @@
<option value="fi" {% if LANGUAGE_CODE == "fi" %} selected {% endif %}>{% trans "Finnish" %}</option>
<option value="en" {% if LANGUAGE_CODE == "en" %} selected {% endif %}>{% trans "English" %}</option>
</select>
<input type="submit" class="btn btn-success">
<input type="submit" class="btn btn-success" value="{% trans "Submit" %}">
</form>
</div>
</div>
+7 -4
View File
@@ -16,6 +16,8 @@ from members.views import member_update
from members.views import member_delete_confirm
from members.views import member_delete
from members.views import payment_list
from members.views import member_duplicates
from members.views import resolve_conflict
# rest api
from members.views import MemberDetail
@@ -102,9 +104,10 @@ urlpatterns = [
# rest api url
url(r'^api/members/(?P<pk>\d+)$', MemberDetail.as_view()),
# email validation
# url(r'^validate/(?P<uidb64>[0-9A-Za-z_\-\']+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', validateEmail, name='user-activation-link'),
# url(r'^validate/success/$', validate_success),
# url(r'^validate/failure/$', validate_fail),
# member duplicate resolution view
url(r'^duplicates$', member_duplicates),
# post target for resolving a conflict
url(r'^resolve_conflict$', resolve_conflict)
]
+91 -10
View File
@@ -25,8 +25,9 @@ import requests
import logging
import html
import csv
from smtplib import SMTPAuthenticationError
from members.models import Member, Request, Payment
from members.models import Member, Request, Payment, MemberConflict
from members.forms import MemberForm, PaymentForm, ApplicationForm
# Logger function, you can use the same idea when implementing other loggers to other apps
@@ -105,7 +106,8 @@ def member_list(request, *args, **kwargs):
context = {
'table': table_html,
'member_count': len(members),
'notification': request.GET.get('notification', None)
'notification': request.GET.get('notification', None),
'is_member_conflict': MemberConflict.objects.exists()
}
return render(request, 'member_list.html', context)
@@ -455,6 +457,54 @@ def export_csv(request, *args, **kwargs):
return response
@ensure_csrf_cookie
@require_http_methods(["GET"])
@permission_required('members.change_member', login_url='/login')
def member_duplicates(request, *args, **kwargs):
conflicts = MemberConflict.objects.all()
context = {
'conflicts': conflicts
}
return render(request, 'member_duplicates.html', context)
@ensure_csrf_cookie
@require_http_methods(["POST"])
@permission_required('members.change_member', login_url='/login')
def resolve_conflict(request, *args, **kwargs):
action = request.POST.get('action', None)
if action not in ['first', 'second', 'both']:
return render(request, 'error.html', {'error': '{}: {}'.format(('Incorrect action value'), action)})
id = request.POST.get('id', None)
if id is None:
return render(request, 'error.html', {'error': '{}: {}'.format(('Incorrect id value'), id)})
conflict = MemberConflict.objects.get(id=id)
first_member = conflict.first_member
second_member = conflict.second_member
if action == 'first':
for payment in second_member.payments.all():
payment.member = first_member
payment.save()
second_member.delete()
elif action == 'second':
for payment in first_member.payments.all():
payment.member = second_member
payment.save()
first_member.delete()
conflict.delete()
if MemberConflict.objects.exists():
return HttpResponseRedirect('/members/duplicates')
else:
notification = _('Successfully resolved all member conflicts.')
return HttpResponseRedirect('/members/list?notification={}'.format(html.escape(notification)))
def send_mail_wrapper(subject, message, email_to):
send_mail(subject,
message,
@@ -465,18 +515,49 @@ def send_mail_wrapper(subject, message, email_to):
@receiver(post_save, sender=Request)
def email_on_request(sender, instance, created, **kwargs):
if created:
subject = 'Test1'
message = 'Please validate your email address\r\n'
send_mail_wrapper(subject, message, instance.email)
if not settings.ENABLE_AUTOMATIC_EMAILS:
return
try:
if created:
subject = 'Test1'
message = 'Please validate your email address\r\n'
send_mail_wrapper(subject, message, instance.email)
except SMTPAuthenticationError:
memberlogger.error('Failed to send email to accepted request!')
@receiver(post_save, sender=Member)
def email_on_accept(sender, instance, created, **kwargs):
if created:
subject = 'Test2'
message = 'Jäsenhakemuksesi on hyväksytty!!!\r\n'
send_mail_wrapper(subject, message, instance.email)
if not settings.ENABLE_AUTOMATIC_EMAILS:
return
try:
if created:
subject = 'Test2'
message = 'Jäsenhakemuksesi on hyväksytty!!!\r\n'
send_mail_wrapper(subject, message, instance.email)
except SMTPAuthenticationError:
memberlogger.error('Failed to send email to accepted member!')
def check_for_duplicates(instance):
name_candidates = Member.objects.filter(first_name=instance.first_name,
last_name=instance.last_name)
email_candidates = Member.objects.filter(email=instance.email)
candidates = name_candidates | email_candidates
duplicates = candidates.exclude(id=instance.id)
if len(duplicates) > 0:
conflict = MemberConflict(first_member=instance,
second_member=duplicates[0])
conflict.save()
@receiver(post_save, sender=Member)
def duplicate_receiver(sender, instance, created, **kwargs):
check_for_duplicates(instance)
# Can be used to retrieve single member information via REST API
+1 -1
View File
@@ -158,7 +158,7 @@ EMAIL_PORT = 587
EMAIL_HOST_USER = '<gmailtunnarisi>@gmail.com'
EMAIL_HOST_PASSWORD = '<gmail_passu>'
DEFAULT_EMAIL_FROM = 'SIK Viestintä <sikviestinta@gmail.com>'
ENABLE_AUTOMATIC_EMAILS = False
# ReCaptcha
# http://www.yaconiello.com/blog/integrating-google-recaptcha-to-django/
+30 -3
View File
@@ -1,7 +1,34 @@
html {
width: 100%;
height: 100%;
}
@media (max-width: 760px) {
html {
font-size: 24px;
}
}
@media (min-width: 760px) {
html {
font-size: 16px;
}
}
body {
max-width: 760px;
margin: auto;
font-size: 1rem;
}
h1 {
padding-bottom: 3rem;
padding-top: 3rem;
font-size: 3rem;
}
#content-body {
width: 50vw;
max-width: 800px;
margin: 40px auto;
width: 100%;
}
#login-button {
+7 -7
View File
@@ -5,8 +5,8 @@
<html>
<head>
<meta charset="utf-8">
<title>SIK - Login</title>
<meta name="viewport" charset="utf-8" content="width=device-width" />
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="{% static "js/lib/jquery-3.1.0.min.js" %}"></script>
@@ -19,18 +19,18 @@
</head>
<body>
<div id="content-body" class="container">
<h1 id="site-title">SIK Admin</h1>
<h1>SIK Admin</h1>
<form method="POST" class="form-horizontal" action=""> {% csrf_token %}
<div class="form-group row">
<label for="input-username" class="col-sm-2 col-form-label">Käyttäjätunnus</label>
<label for="input-username" class="col-sm-2 col-form-label">{% trans "Username" %}</label>
<div class="col-sm-10">
<input type="text" name="username" id="input-username" class="form-control" placeholder="Käyttäjätunnus"></input>
<input type="text" name="username" id="input-username" class="form-control" placeholder="{% trans "Username" %}"></input>
</div>
</div>
<div class="form-group row">
<label for="input-password" class="col-sm-2 col-form-label">Salasana</label>
<label for="input-password" class="col-sm-2 col-form-label">{% trans "Password" %}</label>
<div class="col-sm-10">
<input type="password" name="passwd" id="input-passwd" class="form-control" placeholder="Salasana"></input>
<input type="password" name="passwd" id="input-passwd" class="form-control" placeholder="{% trans "Password" %}"></input>
</div>
</div>
<div class="form-group row">
@@ -40,7 +40,7 @@
</div>
<div class="form-group row" id="login-button">
<div class="col-sm-2">
<button type="submit" class="btn btn-default">Kirjaudu</button>
<button type="submit" class="btn btn-primary">{% trans "Log in" %}</button>
</div>
</div>
</form>