Merge branch 'develop' into Django2.0

This commit is contained in:
Aarni Halinen
2018-07-17 20:57:58 +03:00
33 changed files with 1024 additions and 493 deletions
-1
View File
@@ -9,7 +9,6 @@ from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from auditlog.registry import auditlog
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.postgres.fields import JSONField
import logging
Binary file not shown.
+148 -166
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-02 02:43+0200\n"
"POT-Creation-Date: 2018-06-19 20:44+0300\n"
"PO-Revision-Date: 2017-11-02 23:09+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -33,7 +33,7 @@ msgstr "External website"
msgid "Sössö articles"
msgstr "Sössö articles"
#: infoscreen/models.py:199 webapp/models.py:72
#: infoscreen/models.py:199 signup/models.py:30
msgid "Events"
msgstr "Events"
@@ -112,8 +112,8 @@ msgstr "Preview"
msgid "Delete"
msgstr "Delete"
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:39
#: kaehmy/templates/list.html:36 webapp/models.py:110
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:38
#: kaehmy/templates/list.html:36 webapp/models.py:61 webapp/models.py:90
msgid "Name"
msgstr "Name"
@@ -201,105 +201,103 @@ msgstr "Invalid phone number"
msgid "Custom role with the same name already exists."
msgstr "Custom role with the same name already exists."
#: kaehmy/models.py:18
#: kaehmy/models.py:17
msgid "Kaehmy"
msgstr "Kaehmy"
#: kaehmy/models.py:25
#: kaehmy/models.py:24
msgid "Preset kaehmy role"
msgstr "Preset kaehmy role"
#: kaehmy/models.py:26
#: kaehmy/models.py:25
msgid "Preset kaehmy roles"
msgstr "Preset kaehmy roles"
#: kaehmy/models.py:33
#: kaehmy/models.py:32
msgid "Custom kaehmy role"
msgstr "Custom kaehmy role"
#: kaehmy/models.py:34
#: kaehmy/models.py:33
msgid "Custom kaehmy roles"
msgstr "Custom kaehmy roles"
#: kaehmy/models.py:40 kaehmy/templates/list.html:40 members/models.py:16
#: kaehmy/models.py:39 kaehmy/templates/list.html:40 members/models.py:15
msgid "Email"
msgstr "Email"
#: kaehmy/models.py:41
#: kaehmy/models.py:40
msgid "Timestamp"
msgstr ""
#: kaehmy/models.py:55
#: kaehmy/models.py:54
msgid "Kaehmykommentti"
msgstr "Kaehmy comment"
#: kaehmy/models.py:56
#: kaehmy/models.py:55
msgid "Kaehmykommentit"
msgstr "Kaehmy comments"
#: kaehmy/models.py:58 ohlhafv/models.py:37
#: kaehmy/models.py:57 ohlhafv/models.py:36
msgid "Message"
msgstr ""
#: kaehmy/models.py:77 kaehmy/templates/kaehmy.html:12
#: kaehmy/models.py:76 kaehmy/templates/kaehmy.html:12
msgid "Kaehmylomake"
msgstr "Kaehmy application"
#: kaehmy/models.py:78
#: kaehmy/models.py:77
msgid "Kaehmylomakkeet"
msgstr "Kaehmy applications"
#: kaehmy/models.py:81 webapp/models.py:153
#: kaehmy/models.py:80 webapp/models.py:125
msgid "Phone number"
msgstr ""
#: kaehmy/models.py:82
#: kaehmy/models.py:81
msgid "Year"
msgstr ""
#: kaehmy/models.py:83
#: kaehmy/models.py:82
msgid "Text"
msgstr ""
#: kaehmy/models.py:85
#: kaehmy/models.py:84
msgid "Custom role name"
msgstr ""
#: kaehmy/models.py:87 webapp/models.py:111
#: kaehmy/models.py:86 webapp/models.py:62
msgid "Board member"
msgstr "Board member"
#: kaehmy/models.py:95
#: kaehmy/models.py:94
msgid "Kaehmy application: {}"
msgstr "Kaehmy application: {}"
#: kaehmy/models.py:117
#: kaehmy/models.py:116
msgid "Board: {}"
msgstr ""
#: kaehmy/models.py:123
#: kaehmy/models.py:122
msgid "Official: {}"
msgstr ""
#: kaehmy/models.py:140
#: kaehmy/models.py:139
msgid "Telegram channel"
msgstr ""
#: kaehmy/models.py:141
#: kaehmy/models.py:140
msgid "Telegram channels"
msgstr ""
#: kaehmy/tables.py:13 webapp/models.py:137
#: kaehmy/tables.py:13 webapp/models.py:109
msgid "Roles"
msgstr ""
#: kaehmy/templates/error.html:8 members/templates/error.html:8
#: templates/error.html:8
#: kaehmy/templates/error.html:8 templates/error.html:8
msgid "Error"
msgstr "Error"
#: kaehmy/templates/error.html:15 members/templates/error.html:15
#: templates/error.html:15
#: kaehmy/templates/error.html:15 templates/error.html:15
msgid "Back"
msgstr "Back"
@@ -436,7 +434,7 @@ msgstr "New application"
msgid "Statistics"
msgstr ""
#: members/forms.py:107 members/models.py:103 members/tables.py:46
#: members/forms.py:107 members/models.py:102 members/tables.py:41
msgid "Member"
msgstr "Member"
@@ -448,65 +446,65 @@ msgstr "I'm a member of AYY"
msgid "I want to receive a weekly newsletter"
msgstr "I want to receive a weekly newsletter"
#: members/models.py:14
#: members/models.py:13
msgid "First name"
msgstr "First name"
#: members/models.py:15
#: members/models.py:14
msgid "Last name"
msgstr "Last name"
#: members/models.py:17
#: members/models.py:16
msgid "Place of residence"
msgstr "Place of residence"
#: members/models.py:19 members/models.py:70
#: members/models.py:18 members/models.py:69
#: members/templates/member_add_many.html:39
msgid "AYY"
msgstr "AYY"
#: members/models.py:20
#: members/models.py:19
msgid "JAS"
msgstr "JAS"
#: members/models.py:51
#: members/models.py:50
msgid "Submitted"
msgstr "Submitted"
#: members/models.py:68
#: members/models.py:67
msgid "Date"
msgstr "Date"
#: members/models.py:69
#: members/models.py:68
msgid "Source"
msgstr "Source"
#: members/models.py:71
#: members/models.py:70
msgid "Cash"
msgstr "Cash"
#: members/models.py:72 members/templates/member_add_many.html:40
#: members/models.py:71 members/templates/member_add_many.html:40
msgid "Bank transfer"
msgstr "Bank transfer"
#: members/models.py:96
#: members/models.py:95
msgid "Created"
msgstr "Created"
#: members/models.py:104 members/templates/base.html:52
#: members/models.py:103 members/templates/base.html:52
#: members/templates/member_add_many_confirm.html:12
msgid "Members"
msgstr "Members"
#: members/tables.py:14
#: members/tables.py:15
msgid "Last paid"
msgstr "Last paid"
#: members/tables.py:19 members/tables.py:51 members/tables.py:68
#: members/tables.py:19 members/tables.py:45 members/tables.py:60
msgid "Edit"
msgstr "Edit"
#: members/tables.py:33
#: members/tables.py:31
msgid " (not paid)"
msgstr " (not paid)"
@@ -728,11 +726,11 @@ msgstr "Payments in register:"
msgid "Language"
msgstr "Language"
#: members/templates/settings.html:20 sikweb/base.py:232
#: members/templates/settings.html:20 sikweb/base.py:247
msgid "Finnish"
msgstr "Finnish"
#: members/templates/settings.html:21 sikweb/base.py:233
#: members/templates/settings.html:21 sikweb/base.py:248
msgid "English"
msgstr "English"
@@ -762,32 +760,32 @@ msgstr "Successfully deleted application"
msgid "Could not delete application object"
msgstr "Could not delete application object"
#: members/views/members.py:73 members/views/members.py:175
#: members/views/members.py:199
#: members/views/members.py:87 members/views/members.py:189
#: members/views/members.py:213
msgid "No member id specified"
msgstr "No member id specified"
#: members/views/members.py:114
#: members/views/members.py:128
msgid "Failed to import members"
msgstr "Failed to import members"
#: members/views/members.py:128
#: members/views/members.py:142
msgid "Successfully added member"
msgstr "Successfully added member"
#: members/views/members.py:149
#: members/views/members.py:163
msgid "Member missing 'id' field."
msgstr "Member missing 'id' field."
#: members/views/members.py:158
#: members/views/members.py:172
msgid "Successfully updated member"
msgstr "Successfully updated member"
#: members/views/members.py:179
#: members/views/members.py:193
msgid "Successfully deleted member"
msgstr "Successfully deleted member"
#: members/views/members.py:188
#: members/views/members.py:202
msgid "Could not delete member object"
msgstr "Could not delete member object"
@@ -820,39 +818,39 @@ msgstr "Could not update payment object"
msgid "Missing CSV file"
msgstr "Missing CSV file"
#: ohlhafv/models.py:16
#: ohlhafv/models.py:15
msgid "Ohlhafv"
msgstr "Øhlhäfv"
#: ohlhafv/models.py:23
#: ohlhafv/models.py:22
msgid "Ohlhafv challenge"
msgstr ""
#: ohlhafv/models.py:24
#: ohlhafv/models.py:23
msgid "Ohlhafv challenges"
msgstr ""
#: ohlhafv/models.py:30
#: ohlhafv/models.py:29
msgid "Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)"
msgstr ""
#: ohlhafv/models.py:33
#: ohlhafv/models.py:32
msgid "Challenger"
msgstr ""
#: ohlhafv/models.py:34
#: ohlhafv/models.py:33
msgid "Victim"
msgstr ""
#: ohlhafv/models.py:35
#: ohlhafv/models.py:34
msgid "Victim email"
msgstr ""
#: ohlhafv/models.py:36
#: ohlhafv/models.py:35
msgid "Series"
msgstr ""
#: ohlhafv/models.py:41
#: ohlhafv/models.py:40
msgid "Ohlhafv challenge: {} vs. {}"
msgstr ""
@@ -905,6 +903,50 @@ msgstr "Challenge"
msgid "Sinut on haastettu Øhlhäfviin!"
msgstr "You have been challenged at Ohlhafv!"
#: signup/models.py:14 webapp/models.py:16
msgid "Webapp"
msgstr "Webapp"
#: signup/models.py:26
msgid "Event: {}"
msgstr ""
#: signup/models.py:29
msgid "Event"
msgstr ""
#: signup/models.py:40
msgid "Template questions: {}"
msgstr ""
#: signup/models.py:43
msgid "Template question"
msgstr ""
#: signup/models.py:44
msgid "Template questions"
msgstr ""
#: signup/models.py:56
msgid "Signup form"
msgstr ""
#: signup/models.py:57
msgid "Signup forms"
msgstr ""
#: signup/models.py:66
msgid "Sign-ups: {}"
msgstr ""
#: signup/models.py:69
msgid "Sign-up"
msgstr ""
#: signup/models.py:70
msgid "Sign-ups"
msgstr ""
#: templates/admin/base_site.html:43
msgid "Go"
msgstr "Go"
@@ -977,145 +1019,71 @@ msgstr ""
"An email was sent to <strong>%(email)s</strong> %(ago)s ago. Use the link in "
"it to set a new password."
#: webapp/models.py:17
msgid "Webapp"
msgstr "Webapp"
#: webapp/models.py:28
#: webapp/models.py:27
msgid "Tag"
msgstr "Tag"
#: webapp/models.py:29
#: webapp/models.py:28
msgid "Tags"
msgstr "Tags"
#: webapp/models.py:32
#: webapp/models.py:31
msgid "Tag: {}"
msgstr "Tag: {}"
#: webapp/models.py:52
#: webapp/models.py:51
msgid "Feed: {}"
msgstr "Feed: {}"
#: webapp/models.py:55
#: webapp/models.py:54
msgid "Feed"
msgstr ""
#: webapp/models.py:56
#: webapp/models.py:55
msgid "Feeds"
msgstr ""
#: webapp/models.py:68
msgid "Event: {}"
msgstr ""
#: webapp/models.py:71
msgid "Event"
msgstr ""
#: webapp/models.py:83
msgid "Registration: {}"
msgstr ""
#: webapp/models.py:86
msgid "Registration"
msgstr ""
#: webapp/models.py:87
msgid "Registrations"
msgstr ""
#: webapp/models.py:94
msgid "Corporate affairs"
msgstr ""
#: webapp/models.py:95 webapp/templates/freshmen.html:10
#: webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Freshmen"
#: webapp/models.py:96 webapp/templates/international.html:10
#: webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
#: webapp/models.py:97
msgid "External affairs"
msgstr ""
#: webapp/models.py:98
msgid "Media"
msgstr ""
#: webapp/models.py:99
msgid "Technology"
msgstr ""
#: webapp/models.py:100
msgid "Wellbeing"
msgstr ""
#: webapp/models.py:101
msgid "Elepaja"
msgstr ""
#: webapp/models.py:102
msgid "Ceremonies"
msgstr ""
#: webapp/models.py:103
msgid "Culture"
msgstr ""
#: webapp/models.py:104
msgid "Studies"
msgstr ""
#: webapp/models.py:105
msgid "Sössö magazine"
msgstr "Sössö magazine"
#: webapp/models.py:106
msgid "Alumni relations"
msgstr "Alumni relations"
#: webapp/models.py:107
msgid "Others"
msgstr ""
#: webapp/models.py:112
msgid "Category"
msgstr ""
#: webapp/models.py:116
#: webapp/models.py:66
msgid "board member"
msgstr "board member"
#: webapp/models.py:122
#: webapp/models.py:72
msgid "Description"
msgstr "Description"
#: webapp/models.py:136
#: webapp/models.py:84
msgid "Committee"
msgstr ""
#: webapp/models.py:85
msgid "Committees"
msgstr ""
#: webapp/models.py:88
msgid "Committee: {}"
msgstr ""
#: webapp/models.py:108
msgid "Role"
msgstr ""
#: webapp/models.py:139
#: webapp/models.py:111
msgid "Start date"
msgstr ""
#: webapp/models.py:140
#: webapp/models.py:112
msgid "End date"
msgstr ""
#: webapp/models.py:150
#: webapp/models.py:122
msgid "Official"
msgstr ""
#: webapp/models.py:151
#: webapp/models.py:123
msgid "Officials"
msgstr ""
#: webapp/templates/contact.html:10 webapp/templates/navigation.html:20
#: webapp/templates/contact.html:9 webapp/templates/navigation.html:20
msgid "Contact"
msgstr "Contact"
@@ -1123,6 +1091,10 @@ msgstr "Contact"
msgid "Event calendar"
msgstr "Event calendar"
#: webapp/templates/freshmen.html:10 webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Freshmen"
#: webapp/templates/guild.html:10
msgid "Kilta"
msgstr "Guild"
@@ -1143,6 +1115,10 @@ msgstr "Infoscreen Admin Pane"
msgid "Kaehmy application"
msgstr "Kaehmy application"
#: webapp/templates/international.html:10 webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
#: webapp/templates/jobs.html:10 webapp/templates/navigation.html:27
msgid "Jobs"
msgstr "Jobs"
@@ -1159,6 +1135,12 @@ msgstr "Sössö"
msgid "Corporate"
msgstr "Corporate"
#~ msgid "Sössö magazine"
#~ msgstr "Sössö magazine"
#~ msgid "Alumni relations"
#~ msgstr "Alumni relations"
#~ msgid "SIK Admin"
#~ msgstr "SIK Admin"
Binary file not shown.
+192 -172
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-02 02:43+0200\n"
"POT-Creation-Date: 2018-06-19 20:44+0300\n"
"PO-Revision-Date: 2017-11-02 23:04+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -34,7 +34,7 @@ msgstr "Ulkoinen verkkosivu"
msgid "Sössö articles"
msgstr "Sössön artikkelit"
#: infoscreen/models.py:199 webapp/models.py:72
#: infoscreen/models.py:199 signup/models.py:30
msgid "Events"
msgstr "Tapahtumat"
@@ -51,10 +51,8 @@ msgid "External image"
msgstr "Ulkoinen kuva"
#: infoscreen/templates/infoscreen_admin.html:10
#, fuzzy
#| msgid "Infoscreen admin pane"
msgid "Infoscreen admin"
msgstr "Infonäyttöjen hallintapaneeli"
msgstr "Infonäyttöjen hallinta"
#: infoscreen/templates/infoscreen_admin.html:26 members/templates/base.html:79
msgid "Log out"
@@ -115,8 +113,8 @@ msgstr "Esikatsele"
msgid "Delete"
msgstr "Poista"
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:39
#: kaehmy/templates/list.html:36 webapp/models.py:110
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:38
#: kaehmy/templates/list.html:36 webapp/models.py:61 webapp/models.py:90
msgid "Name"
msgstr "Nimi"
@@ -204,107 +202,103 @@ msgstr "Virheellinen puhelinnumero"
msgid "Custom role with the same name already exists."
msgstr "Samanniminen virka on jo olemassa."
#: kaehmy/models.py:18
#, fuzzy
#| msgid "Kaehmylomake"
#: kaehmy/models.py:17
msgid "Kaehmy"
msgstr "Kaehmylomake"
msgstr "Kaehmy"
#: kaehmy/models.py:25
#: kaehmy/models.py:24
msgid "Preset kaehmy role"
msgstr "Kaehmyvirka"
#: kaehmy/models.py:26
#: kaehmy/models.py:25
msgid "Preset kaehmy roles"
msgstr "Kaehmyvirat"
#: kaehmy/models.py:33
#: kaehmy/models.py:32
msgid "Custom kaehmy role"
msgstr "Uusi virka"
#: kaehmy/models.py:34
#: kaehmy/models.py:33
msgid "Custom kaehmy roles"
msgstr "Uudet kaehmyvirat"
#: kaehmy/models.py:40 kaehmy/templates/list.html:40 members/models.py:16
#: kaehmy/models.py:39 kaehmy/templates/list.html:40 members/models.py:15
msgid "Email"
msgstr "Sähköposti"
#: kaehmy/models.py:41
#: kaehmy/models.py:40
msgid "Timestamp"
msgstr "Aikaleima"
#: kaehmy/models.py:55
#: kaehmy/models.py:54
msgid "Kaehmykommentti"
msgstr "Kaehmykommentti"
#: kaehmy/models.py:56
#: kaehmy/models.py:55
msgid "Kaehmykommentit"
msgstr "Kaehmykommentit"
#: kaehmy/models.py:58 ohlhafv/models.py:37
#: kaehmy/models.py:57 ohlhafv/models.py:36
msgid "Message"
msgstr "Viesti"
#: kaehmy/models.py:77 kaehmy/templates/kaehmy.html:12
#: kaehmy/models.py:76 kaehmy/templates/kaehmy.html:12
msgid "Kaehmylomake"
msgstr "Kaehmylomake"
#: kaehmy/models.py:78
#: kaehmy/models.py:77
msgid "Kaehmylomakkeet"
msgstr "Kaehmylomakkeet"
#: kaehmy/models.py:81 webapp/models.py:153
#: kaehmy/models.py:80 webapp/models.py:125
msgid "Phone number"
msgstr "Puhelinnumero"
#: kaehmy/models.py:82
#: kaehmy/models.py:81
msgid "Year"
msgstr "Vuosi"
#: kaehmy/models.py:83
#: kaehmy/models.py:82
msgid "Text"
msgstr "Teksti"
#: kaehmy/models.py:85
#: kaehmy/models.py:84
msgid "Custom role name"
msgstr "Uusi virka"
#: kaehmy/models.py:87 webapp/models.py:111
#: kaehmy/models.py:86 webapp/models.py:62
msgid "Board member"
msgstr "Hallituksen jäsen"
#: kaehmy/models.py:95
#: kaehmy/models.py:94
msgid "Kaehmy application: {}"
msgstr "Kaehmy: {}"
#: kaehmy/models.py:117
#: kaehmy/models.py:116
msgid "Board: {}"
msgstr "Hallitus: {}"
#: kaehmy/models.py:123
#: kaehmy/models.py:122
msgid "Official: {}"
msgstr "Toimari: {}"
#: kaehmy/models.py:140
#: kaehmy/models.py:139
msgid "Telegram channel"
msgstr "Telegram-kanava"
#: kaehmy/models.py:141
#: kaehmy/models.py:140
msgid "Telegram channels"
msgstr "Telegram-kanavat"
#: kaehmy/tables.py:13 webapp/models.py:137
#: kaehmy/tables.py:13 webapp/models.py:109
msgid "Roles"
msgstr "Roolit"
#: kaehmy/templates/error.html:8 members/templates/error.html:8
#: templates/error.html:8
#: kaehmy/templates/error.html:8 templates/error.html:8
msgid "Error"
msgstr "Virhe"
#: kaehmy/templates/error.html:15 members/templates/error.html:15
#: templates/error.html:15
#: kaehmy/templates/error.html:15 templates/error.html:15
msgid "Back"
msgstr "Takaisin"
@@ -444,7 +438,7 @@ msgstr "Uusi kaehmy"
msgid "Statistics"
msgstr "Kaehmytilastot"
#: members/forms.py:107 members/models.py:103 members/tables.py:46
#: members/forms.py:107 members/models.py:102 members/tables.py:41
msgid "Member"
msgstr "Jäsen"
@@ -456,65 +450,65 @@ msgstr "Olen AYY:n jäsen"
msgid "I want to receive a weekly newsletter"
msgstr "Haluan saada viikottaisen jäsentiedotteen"
#: members/models.py:14
#: members/models.py:13
msgid "First name"
msgstr "Etunimi"
#: members/models.py:15
#: members/models.py:14
msgid "Last name"
msgstr "Sukunimi"
#: members/models.py:17
#: members/models.py:16
msgid "Place of residence"
msgstr "Asuinpaikka"
#: members/models.py:19 members/models.py:70
#: members/models.py:18 members/models.py:69
#: members/templates/member_add_many.html:39
msgid "AYY"
msgstr "AYY"
#: members/models.py:20
#: members/models.py:19
msgid "JAS"
msgstr "JAS"
#: members/models.py:51
#: members/models.py:50
msgid "Submitted"
msgstr "Lisätty"
#: members/models.py:68
#: members/models.py:67
msgid "Date"
msgstr "Päivämäärä"
#: members/models.py:69
#: members/models.py:68
msgid "Source"
msgstr "Lähde"
#: members/models.py:71
#: members/models.py:70
msgid "Cash"
msgstr "Käteinen"
#: members/models.py:72 members/templates/member_add_many.html:40
#: members/models.py:71 members/templates/member_add_many.html:40
msgid "Bank transfer"
msgstr "Tilisiirto"
#: members/models.py:96
#: members/models.py:95
msgid "Created"
msgstr "Lisätty"
#: members/models.py:104 members/templates/base.html:52
#: members/models.py:103 members/templates/base.html:52
#: members/templates/member_add_many_confirm.html:12
msgid "Members"
msgstr "Jäsenet"
#: members/tables.py:14
#: members/tables.py:15
msgid "Last paid"
msgstr "Viimeksi maksettu"
#: members/tables.py:19 members/tables.py:51 members/tables.py:68
#: members/tables.py:19 members/tables.py:45 members/tables.py:60
msgid "Edit"
msgstr "Muokkaa"
#: members/tables.py:33
#: members/tables.py:31
msgid " (not paid)"
msgstr " (ei maksua)"
@@ -734,11 +728,11 @@ msgstr "Maksutapahtumia:"
msgid "Language"
msgstr "Kieli"
#: members/templates/settings.html:20 sikweb/base.py:232
#: members/templates/settings.html:20 sikweb/base.py:247
msgid "Finnish"
msgstr "suomi"
#: members/templates/settings.html:21 sikweb/base.py:233
#: members/templates/settings.html:21 sikweb/base.py:248
msgid "English"
msgstr "englanti"
@@ -767,32 +761,32 @@ msgstr "Onnistuneesti poistettiin hakemus"
msgid "Could not delete application object"
msgstr "Hakemusobjektia ei voitu poistaa"
#: members/views/members.py:73 members/views/members.py:175
#: members/views/members.py:199
#: members/views/members.py:87 members/views/members.py:189
#: members/views/members.py:213
msgid "No member id specified"
msgstr "Jäsenen ID ei määritelty"
#: members/views/members.py:114
#: members/views/members.py:128
msgid "Failed to import members"
msgstr "Jäsenten tuonti epäonnistui"
#: members/views/members.py:128
#: members/views/members.py:142
msgid "Successfully added member"
msgstr "Onnistuneesti lisättiin jäsen"
#: members/views/members.py:149
#: members/views/members.py:163
msgid "Member missing 'id' field."
msgstr "Jäsenen ID ei määritelty."
#: members/views/members.py:158
#: members/views/members.py:172
msgid "Successfully updated member"
msgstr "Onnistuneesti päivitettiin jäsen"
#: members/views/members.py:179
#: members/views/members.py:193
msgid "Successfully deleted member"
msgstr "Onnistuneesti poistettiin jäsen"
#: members/views/members.py:188
#: members/views/members.py:202
msgid "Could not delete member object"
msgstr "Jäsenobjektia ei voitu poistaa"
@@ -825,39 +819,39 @@ msgstr "Maksutapahtumaobjektia ei voitu päivittää"
msgid "Missing CSV file"
msgstr "Puuttuva CSV-tiedosto"
#: ohlhafv/models.py:16
#: ohlhafv/models.py:15
msgid "Ohlhafv"
msgstr "Øhlhäfv"
#: ohlhafv/models.py:23
#: ohlhafv/models.py:22
msgid "Ohlhafv challenge"
msgstr "Ohlhafv haaste"
#: ohlhafv/models.py:24
#: ohlhafv/models.py:23
msgid "Ohlhafv challenges"
msgstr "Ohlhafv haasteet"
#: ohlhafv/models.py:30
#: ohlhafv/models.py:29
msgid "Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)"
msgstr "Joukkuehaaste (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)"
#: ohlhafv/models.py:33
#: ohlhafv/models.py:32
msgid "Challenger"
msgstr "Haastaja"
#: ohlhafv/models.py:34
#: ohlhafv/models.py:33
msgid "Victim"
msgstr "Uhri"
#: ohlhafv/models.py:35
#: ohlhafv/models.py:34
msgid "Victim email"
msgstr "Uhrin sähköpostiosoite"
#: ohlhafv/models.py:36
#: ohlhafv/models.py:35
msgid "Series"
msgstr "Sarja"
#: ohlhafv/models.py:41
#: ohlhafv/models.py:40
msgid "Ohlhafv challenge: {} vs. {}"
msgstr "Ohlhafv-haaste: {} vs. {}"
@@ -909,6 +903,50 @@ msgstr "Haasta"
msgid "Sinut on haastettu Øhlhäfviin!"
msgstr ""
#: signup/models.py:14 webapp/models.py:16
msgid "Webapp"
msgstr "Nettisivut"
#: signup/models.py:26
msgid "Event: {}"
msgstr "Tapahtuma: {}"
#: signup/models.py:29
msgid "Event"
msgstr "Tapahtuma"
#: signup/models.py:40
msgid "Template questions: {}"
msgstr "Vakiokysymykset: {}"
#: signup/models.py:43
msgid "Template question"
msgstr "Vakiokysymys"
#: signup/models.py:44
msgid "Template questions"
msgstr "Vakiokysymykset"
#: signup/models.py:56
msgid "Signup form"
msgstr "Ilmoittautumislomake"
#: signup/models.py:57
msgid "Signup forms"
msgstr "Ilmoittautumislomakkeet"
#: signup/models.py:66
msgid "Sign-ups: {}"
msgstr "Ilmoittautumiset: {}"
#: signup/models.py:69
msgid "Sign-up"
msgstr "Ilmoittautuminen"
#: signup/models.py:70
msgid "Sign-ups"
msgstr "Ilmoittautumiset"
#: templates/admin/base_site.html:43
msgid "Go"
msgstr "Vaihda"
@@ -980,145 +1018,71 @@ msgstr ""
"Sähköposti on lähetetty osoitteeseen <strong>%(email)s</strong> %(ago)s:a "
"sitten. Käytä linkkiä asettaaksesi uuden salasanan."
#: webapp/models.py:17
msgid "Webapp"
msgstr "Nettisivut"
#: webapp/models.py:28
#: webapp/models.py:27
msgid "Tag"
msgstr "Tunniste"
#: webapp/models.py:29
#: webapp/models.py:28
msgid "Tags"
msgstr "Tunnisteet"
#: webapp/models.py:32
#: webapp/models.py:31
msgid "Tag: {}"
msgstr "Tunniste: {}"
#: webapp/models.py:52
#: webapp/models.py:51
msgid "Feed: {}"
msgstr "Uutinen: {}"
#: webapp/models.py:55
#: webapp/models.py:54
msgid "Feed"
msgstr "Uutinen"
#: webapp/models.py:56
#: webapp/models.py:55
msgid "Feeds"
msgstr "Uutiset"
#: webapp/models.py:68
msgid "Event: {}"
msgstr "Tapahtuma: {}"
#: webapp/models.py:71
msgid "Event"
msgstr "Tapahtuma"
#: webapp/models.py:83
msgid "Registration: {}"
msgstr "Registration: {}"
#: webapp/models.py:86
msgid "Registration"
msgstr "Ilmoittautuminen"
#: webapp/models.py:87
msgid "Registrations"
msgstr "Ilmoittautumiset"
#: webapp/models.py:94
msgid "Corporate affairs"
msgstr "Yrityssuhteet"
#: webapp/models.py:95 webapp/templates/freshmen.html:10
#: webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Fuksit"
#: webapp/models.py:96 webapp/templates/international.html:10
#: webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
#: webapp/models.py:97
msgid "External affairs"
msgstr "Ulkosuhteet"
#: webapp/models.py:98
msgid "Media"
msgstr "Media"
#: webapp/models.py:99
msgid "Technology"
msgstr "Teknologia"
#: webapp/models.py:100
msgid "Wellbeing"
msgstr "Hyvinvointi"
#: webapp/models.py:101
msgid "Elepaja"
msgstr "Elepaja"
#: webapp/models.py:102
msgid "Ceremonies"
msgstr "Hupitapahtumat"
#: webapp/models.py:103
msgid "Culture"
msgstr "Kulttuuri"
#: webapp/models.py:104
msgid "Studies"
msgstr "Opinnot"
#: webapp/models.py:105
msgid "Sössö magazine"
msgstr "Kiltalehti Sössö"
#: webapp/models.py:106
msgid "Alumni relations"
msgstr "Alumnisuhteet"
#: webapp/models.py:107
msgid "Others"
msgstr "Muut"
#: webapp/models.py:112
msgid "Category"
msgstr "Kategoria"
#: webapp/models.py:116
#: webapp/models.py:66
msgid "board member"
msgstr "hallituksen jäsen"
#: webapp/models.py:122
#: webapp/models.py:72
msgid "Description"
msgstr "Kuvaus"
#: webapp/models.py:136
#: webapp/models.py:84
msgid "Committee"
msgstr "Toimikunta"
#: webapp/models.py:85
msgid "Committees"
msgstr "Toimikunnat"
#: webapp/models.py:88
msgid "Committee: {}"
msgstr "Toimikunta: {}"
#: webapp/models.py:108
msgid "Role"
msgstr "Rooli"
#: webapp/models.py:139
#: webapp/models.py:111
msgid "Start date"
msgstr "Alkupäivämäärä"
#: webapp/models.py:140
#: webapp/models.py:112
msgid "End date"
msgstr "Loppupäivämäärä"
#: webapp/models.py:150
#: webapp/models.py:122
msgid "Official"
msgstr "Toimihenkilö"
#: webapp/models.py:151
#: webapp/models.py:123
msgid "Officials"
msgstr "Toimihenkilöt"
#: webapp/templates/contact.html:10 webapp/templates/navigation.html:20
#: webapp/templates/contact.html:9 webapp/templates/navigation.html:20
msgid "Contact"
msgstr "Yhteystiedot"
@@ -1126,6 +1090,10 @@ msgstr "Yhteystiedot"
msgid "Event calendar"
msgstr "Tapahtumakalenteri"
#: webapp/templates/freshmen.html:10 webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Fuksit"
#: webapp/templates/guild.html:10
msgid "Kilta"
msgstr "Kilta"
@@ -1146,6 +1114,10 @@ msgstr "Infonäyttöjen hallintapaneeli"
msgid "Kaehmy application"
msgstr "Kaehmy"
#: webapp/templates/international.html:10 webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
#: webapp/templates/jobs.html:10 webapp/templates/navigation.html:27
msgid "Jobs"
msgstr "Työpaikat"
@@ -1162,6 +1134,54 @@ msgstr "Sössö"
msgid "Corporate"
msgstr "Yritys"
#~ msgid "Registration: {}"
#~ msgstr "Registration: {}"
#~ msgid "Registration"
#~ msgstr "Ilmoittautuminen"
#~ msgid "Registrations"
#~ msgstr "Ilmoittautumiset"
#~ msgid "Corporate affairs"
#~ msgstr "Yrityssuhteet"
#~ msgid "External affairs"
#~ msgstr "Ulkosuhteet"
#~ msgid "Media"
#~ msgstr "Media"
#~ msgid "Technology"
#~ msgstr "Teknologia"
#~ msgid "Wellbeing"
#~ msgstr "Hyvinvointi"
#~ msgid "Elepaja"
#~ msgstr "Elepaja"
#~ msgid "Ceremonies"
#~ msgstr "Hupitapahtumat"
#~ msgid "Culture"
#~ msgstr "Kulttuuri"
#~ msgid "Studies"
#~ msgstr "Opinnot"
#~ msgid "Sössö magazine"
#~ msgstr "Kiltalehti Sössö"
#~ msgid "Alumni relations"
#~ msgstr "Alumnisuhteet"
#~ msgid "Others"
#~ msgstr "Muut"
#~ msgid "Category"
#~ msgstr "Kategoria"
#~ msgid "Challenger email"
#~ msgstr "Haastajan sähköpostiosoite"
+6 -2
View File
@@ -3,8 +3,7 @@
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.db.models import Q
from django.db.models import Q, F, OuterRef, Subquery
import csv
@@ -125,6 +124,11 @@ class Member(BaseMember):
qs = qs.filter(Q(first_name__icontains=term) | Q(last_name__icontains=term))
return qs
def get_members_with_latest_payment(members_query):
"""Return QuerySet of given members QS with last_paid attribute."""
latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date')
return members_query.annotate(last_paid=Subquery(latest.values('date')[:1]))
# To avoid problems with a cyclical import, this is at the bottom of the file
from members.forms import MemberForm # nopep8
+7 -14
View File
@@ -4,6 +4,7 @@ import django_tables2 as tables
from django.utils.translation import ugettext as _
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import F, OuterRef, Subquery
from django.utils import timezone
from members.models import Member, Payment, Request
@@ -15,10 +16,7 @@ class MemberTable(tables.Table):
options = tables.TemplateColumn(
('<a class="data-table-button btn btn-primary" '
'href="/members/edit/{{ record.id }}">') +
_('Edit') +
'</a>',
verbose_name=""
'href="/members/edit/{{ record.id }}">') + _('Edit') + '</a>', verbose_name=""
)
class Meta:
@@ -28,13 +26,12 @@ class MemberTable(tables.Table):
def render_last_paid(self, record):
try:
return record.payments.filter(member=record).latest('date').date.strftime('%e.%m.%Y %H:%M')
return timezone.localtime(record.payments.filter(member=record).latest('date').date).strftime('%-d.%-m.%Y %H:%M')
except ObjectDoesNotExist:
return record.created.strftime('%e.%m.%Y %H:%M') + _(" (not paid)")
return timezone.localtime(record.created).strftime('%-d.%-m.%Y %H:%M') + _(" (not paid)")
def order_last_paid(self, queryset, is_descending):
latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date')
queryset = queryset.annotate(last_paid=Subquery(latest.values('date')[:1])).order_by(('-' if is_descending else '') + 'last_paid')
queryset = Member.get_members_with_latest_payment(queryset).order_by(('-' if is_descending else '') + 'last_paid')
return (queryset, True)
@@ -45,9 +42,7 @@ class PaymentTable(tables.Table):
options = tables.TemplateColumn(
('<a class="data-table-button btn btn-primary" '
'href="/members/edit_payment/{{ record.id }}">') +
_('Edit') +
'</a>',
'href="/members/edit_payment/{{ record.id }}">') + _('Edit') + '</a>',
verbose_name=""
)
@@ -62,9 +57,7 @@ class RequestTable(tables.Table):
options = tables.TemplateColumn(
('<a class="data-table-button btn btn-primary" '
'href="/members/edit_application/{{ record.id }}">') +
_('Edit') +
'</a>',
'href="/members/edit_application/{{ record.id }}">') + _('Edit') + '</a>',
verbose_name=""
)
-18
View File
@@ -1,18 +0,0 @@
{% extends "members:base.html" %}
{% load static %}
{% load i18n %}
{% block content %}
<div>
<div>
<h3>{% trans "Error" %}</h3>
</div>
<div class="alert alert-danger">
{{ error|safe }}
</div>
<div>
<button onclick="window.history.back();" class="btn btn-primary">{% trans "Back" %}</button>
</div>
</div>
{% endblock content %}
+1 -1
View File
@@ -18,7 +18,7 @@
{% endif %}
<div class="member_count">
<span>{% trans "Members in register:" %} {{ member_count }}</span>
<span>{% trans "Members in register:" %} {{ member_count }} ({{ paid_count }})</span>
</div>
<div>
+14
View File
@@ -7,10 +7,13 @@ from django.http import HttpResponse, HttpResponseRedirect, JsonResponse, HttpRe
from django.core.mail import send_mail
from django.conf import settings
from django.utils.translation import ugettext as _
from django.utils import timezone
from django.forms.models import model_to_dict
from dal import autocomplete
from django.utils import timezone
import logging
import datetime
import html
from rest_framework.views import APIView
@@ -44,9 +47,20 @@ def member_list(request, *args, **kwargs):
table.paginate(page=request.GET.get('page', 1), per_page=25)
table_html = convert_table_to_html(table, request)
queryset = Member.get_members_with_latest_payment(members)
# Member fee is valid from 1.9.-31.8.
f_day = 1
f_month = 9
now = timezone.now()
if (now.month >= f_month):
filter_date = datetime.date(now.year, f_month, f_day)
else:
filter_date = datetime.date(now.year - 1, f_month, f_day)
context = {
'table': table_html,
'member_count': len(members),
'paid_count': len(queryset.filter(last_paid__gte=filter_date)),
'notification': request.GET.get('notification', None),
}
return render(request, 'member_list.html', context)
-1
View File
@@ -9,7 +9,6 @@ from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
from auditlog.registry import auditlog
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.postgres.fields import JSONField
import logging
+6 -2
View File
@@ -17,7 +17,7 @@ djangorestframework==3.8.2
coverage==4.3.4
django-nose==1.4.5
nose-exclude==0.5.0
psycopg2==2.7.1
psycopg2==2.7.3.1
django-bootstrap3==8.2.3
django-tables2==1.6.1
pycodestyle==2.3.1
@@ -29,8 +29,12 @@ django-autocomplete-light==3.2.10
six==1.10.0
django-suit==0.2.26
telepot==12.3
django-password-reset==1.0.1
django-password-reset==1.0
<<<<<<< Updated upstream
pyexcel==0.5.8
=======
pyexcel==0.5.7
>>>>>>> Stashed changes
pyexcel-xlsx==0.5.5
django-import-export==0.7.0
openpyxl==2.4.11
+1 -1
View File
@@ -1,4 +1,4 @@
{% extends "members_base.html" %}
{% extends "members:base.html" %}
{% load static %}
{% load i18n %}
+6 -3
View File
@@ -1,8 +1,8 @@
"""File containing webapp app admin registers."""
from django.contrib import admin
from webapp.models import Official, Role
from webapp.models import Feed, Tag, BaseFeed, Event, Registration
from webapp.models import Official, Role, Committee
from webapp.models import Feed, Tag, BaseFeed, Event, Signup, SignupForm, TemplateQuestion
from modeltranslation.admin import TranslationAdmin
from django.contrib.auth.models import Permission
# this is needed so that the models get registered for translation
@@ -13,6 +13,9 @@ admin.site.register(Permission)
admin.site.register(Feed, TranslationAdmin)
admin.site.register(Tag, TranslationAdmin)
admin.site.register(Event, TranslationAdmin)
admin.site.register(Registration, TranslationAdmin)
admin.site.register(SignupForm, TranslationAdmin)
admin.site.register(Signup, TranslationAdmin)
admin.site.register(TemplateQuestion, TranslationAdmin)
admin.site.register(Official)
admin.site.register(Role)
admin.site.register(Committee)
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-03-01 18:11
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('webapp', '0035_auto_20171019_1413'),
]
operations = [
migrations.CreateModel(
name='Committee',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
),
migrations.AddField(
model_name='role',
name='committee',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'),
),
]
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-03-01 19:11
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('webapp', '0036_auto_20180301_2011'),
]
operations = [
migrations.AlterModelOptions(
name='committee',
options={'verbose_name': 'Committee', 'verbose_name_plural': 'Committees'},
),
]
@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-05-16 18:08
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('webapp', '0037_auto_20180301_2111'),
]
operations = [
migrations.RemoveField(
model_name='baserole',
name='category',
),
migrations.RemoveField(
model_name='role',
name='committee',
),
migrations.AddField(
model_name='official',
name='committee',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'),
),
migrations.AlterField(
model_name='role',
name='official',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='webapp.Official'),
),
]
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-05-16 18:13
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('webapp', '0038_auto_20180516_2108'),
]
operations = [
migrations.RemoveField(
model_name='official',
name='committee',
),
migrations.RemoveField(
model_name='role',
name='official',
),
migrations.AddField(
model_name='official',
name='role',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Role'),
),
migrations.AddField(
model_name='role',
name='committee',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'),
),
migrations.AlterField(
model_name='committee',
name='name',
field=models.CharField(max_length=255, verbose_name='Name'),
),
]
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-05-16 18:24
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webapp', '0039_auto_20180516_2113'),
]
operations = [
migrations.RemoveField(
model_name='official',
name='role',
),
migrations.AddField(
model_name='official',
name='role',
field=models.ManyToManyField(null=True, related_name='roles', to='webapp.Role'),
),
]
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-05-16 19:04
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webapp', '0040_auto_20180516_2124'),
]
operations = [
migrations.AlterField(
model_name='official',
name='role',
field=models.ManyToManyField(related_name='official', to='webapp.Role'),
),
]
@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-05-16 19:49
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('webapp', '0041_auto_20180516_2204'),
('webapp', '0041_delete_ohlhafvchallenge'),
]
operations = [
]
@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-06-05 16:53
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('webapp', '0042_merge_20180516_2249'),
]
operations = [
migrations.RemoveField(
model_name='event',
name='basefeed_ptr',
),
migrations.RemoveField(
model_name='event',
name='registration',
),
migrations.DeleteModel(
name='Event',
),
migrations.DeleteModel(
name='Registration',
),
]
@@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-07-05 15:51
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('webapp', '0043_auto_20180605_1953'),
]
operations = [
migrations.CreateModel(
name='Event',
fields=[
('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')),
('start_time', models.DateTimeField(default=django.utils.timezone.now)),
('end_time', models.DateTimeField(default=django.utils.timezone.now)),
],
options={
'verbose_name': 'Event',
'verbose_name_plural': 'Events',
},
bases=('webapp.basefeed',),
),
migrations.CreateModel(
name='Signup',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(default=django.utils.timezone.now)),
('answer', models.CharField(max_length=255)),
],
options={
'verbose_name': 'Sign-up',
'verbose_name_plural': 'Sign-ups',
},
),
migrations.CreateModel(
name='SignupForm',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('start', models.DateTimeField(default=django.utils.timezone.now)),
('end', models.DateTimeField(default=django.utils.timezone.now)),
('question', models.CharField(max_length=255)),
],
options={
'verbose_name': 'Signup form',
'verbose_name_plural': 'Signup forms',
},
),
migrations.CreateModel(
name='TemplateQuestion',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('question', models.CharField(max_length=255)),
],
options={
'verbose_name': 'Template question',
'verbose_name_plural': 'Template questions',
},
),
migrations.AddField(
model_name='signup',
name='signupForm',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='webapp.SignupForm'),
),
migrations.AddField(
model_name='event',
name='signupForm',
field=models.ManyToManyField(blank=True, to='webapp.SignupForm'),
),
]
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-07-10 16:01
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('webapp', '0044_auto_20180705_1851'),
]
operations = [
migrations.RenameField(
model_name='signupform',
old_name='question',
new_name='questions',
),
]
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-07-10 17:41
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('webapp', '0045_auto_20180710_1901'),
]
operations = [
migrations.RemoveField(
model_name='event',
name='signupForm',
),
migrations.AddField(
model_name='event',
name='signupForm',
field=models.ForeignKey(blank=True, default=0, on_delete=django.db.models.deletion.CASCADE, to='webapp.SignupForm'),
preserve_default=False,
),
]
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-07-10 18:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webapp', '0046_auto_20180710_2041'),
]
operations = [
migrations.RemoveField(
model_name='event',
name='signupForm',
),
migrations.AddField(
model_name='event',
name='signupForm',
field=models.ManyToManyField(blank=True, to='webapp.SignupForm'),
),
]
+84 -32
View File
@@ -2,16 +2,16 @@
from django.db import models
from django.utils import timezone
from datetime import timedelta
# from datetime import timedelta
from django.contrib.auth.models import User
from webapp.utils import month_from_now
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User
# from django.contrib.auth.models import User
from auditlog.registry import auditlog
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.postgres.fields import JSONField
# from django.contrib.postgres.fields import JSONField
import logging
# import logging
VERBOSE_NAME = _('Webapp')
@@ -61,8 +61,8 @@ class Event(BaseFeed):
start_time = models.DateTimeField(default=timezone.now)
end_time = models.DateTimeField(default=timezone.now)
registration = models.ForeignKey(
'Registration', on_delete=models.CASCADE, null=True)
signupForm = models.ManyToManyField(
'SignupForm', blank=True)
def __str__(self):
return _('Event: {}').format(self.title)
@@ -72,44 +72,69 @@ class Event(BaseFeed):
verbose_name_plural = _('Events')
class Registration(models.Model):
"""Model for event registration."""
class TemplateQuestion(models.Model):
"""Stores template questions for signup forms as JSONB"""
# question = JSONField()
name = models.CharField(max_length=255)
email = models.EmailField()
options = JSONField()
question = models.CharField(max_length=255)
def __str__(self):
return _('Registration: {}').format(self.name)
return _('Template questions: {}').format(self.name)
class Meta:
verbose_name = _('Registration')
verbose_name_plural = _('Registrations')
verbose_name = _('Template question')
verbose_name_plural = _('Template questions')
class SignupForm(models.Model):
"""Model for event signup form. Stores questions in JSONB."""
start = models.DateTimeField(default=timezone.now)
end = models.DateTimeField(default=timezone.now)
# question = JSONField()
questions = models.CharField(max_length=255)
class Meta:
verbose_name = _('Signup form')
verbose_name_plural = _('Signup forms')
class Signup(models.Model):
signupForm = models.ForeignKey('SignupForm', on_delete=models.CASCADE)
time = models.DateTimeField(default=timezone.now)
answer = models.CharField(max_length=255)
def __str__(self):
return _('Sign-ups: {}').format(self.signupForm)
class Meta:
verbose_name = _('Sign-up')
verbose_name_plural = _('Sign-ups')
class BaseRole(models.Model):
"""Base model for occupations/roles."""
CATEGORIES = (
('corporate', _('Corporate affairs')),
('freshman', _('Freshmen')),
('international', _('International')),
('external', _('External affairs')),
('media', _('Media')),
('tech', _('Technology')),
('wellbeing', _('Wellbeing')),
('elepaja', _('Elepaja')),
('ceremonies', _('Ceremonies')),
('culture', _('Culture')),
('studies', _('Studies')),
('sosso', _('Sössö magazine')),
('alumni', _('Alumni relations')),
('others', _('Others')),
)
# CATEGORIES = (
# ('corporate', _('Corporate affairs')),
# ('freshman', _('Freshmen')),
# ('international', _('International')),
# ('external', _('External affairs')),
# ('media', _('Media')),
# ('tech', _('Technology')),
# ('wellbeing', _('Wellbeing')),
# ('elepaja', _('Elepaja')),
# ('ceremonies', _('Ceremonies')),
# ('culture', _('Culture')),
# ('studies', _('Studies')),
# ('sosso', _('Sössö magazine')),
# ('alumni', _('Alumni relations')),
# ('others', _('Others')),
# )
name = models.CharField(_('Name'), max_length=255)
is_board = models.BooleanField(_('Board member'))
category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255)
# category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255)
def __str__(self):
n = self.name.capitalize()
@@ -122,6 +147,28 @@ class PresetRole(BaseRole):
description = models.TextField(_('Description'))
class Committee(models.Model):
"""
Committee model
Has many Roles found under variable roles
"""
class Meta:
"""Meta class for Committee class."""
verbose_name = _('Committee')
verbose_name_plural = _('Committees')
def __str__(self):
return _('Committee: {}').format(self.name)
name = models.CharField(_("Name"), max_length=255)
@property
def current_roles(self):
return self.roles.all().filter(end_date__gte=timezone.now()).filter(start_date__lte=timezone.now())
class Role(PresetRole):
"""
Model for Role.
@@ -138,7 +185,7 @@ class Role(PresetRole):
start_date = models.DateField(_('Start date'))
end_date = models.DateField(_('End date'))
official = models.ForeignKey('Official', related_name='roles', on_delete=models.CASCADE)
committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, null=True)
class Official(User):
@@ -151,11 +198,16 @@ class Official(User):
verbose_name_plural = _('Officials')
phone_number = PhoneNumberField(_('Phone number'))
role = models.ManyToManyField('Role', related_name='official')
def __str__(self):
return '{} {}'.format(self.first_name, self.last_name)
auditlog.register(Tag)
auditlog.register(Feed)
auditlog.register(Event)
auditlog.register(Signup)
auditlog.register(PresetRole)
auditlog.register(Role)
auditlog.register(Official)
+42
View File
@@ -0,0 +1,42 @@
from rest_framework import serializers
from webapp.models import *
class SignupFormSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = SignupForm
fields = ('id', 'start', 'end', 'questions')
class EventSerializer(serializers.HyperlinkedModelSerializer):
signupForm = SignupFormSerializer(many=True, read_only=True, required=False)
signup_id = serializers.PrimaryKeyRelatedField(
many=True,
source="signupForm",
queryset=SignupForm.objects.all())
class Meta:
model = Event
fields = ('id', 'tags', 'visible', 'title', 'description',
'content', 'start_time', 'end_time', 'signup_id', 'signupForm')
depth = 1
def create(self, validated_data):
signupForms = validated_data.pop('signupForm')
event = Event.objects.create(**validated_data)
for signupForm in signupForms:
event.signupForm.add(signupForm)
event.save()
return event
class SignupSerializer(serializers.ModelSerializer):
class Meta:
model = Signup
fields = ('id', 'signupForm', 'answer')
extra_kwargs = {
'url': {
'view_name': 'signup-detail',
}
}
+6
View File
@@ -0,0 +1,6 @@
.role-container {
background-color: aqua;
width: 200px;
text-align: center;
}
+30 -27
View File
@@ -4,34 +4,37 @@
{% load i18n %}
<div class="contact_div">
<div class="container">
<div class="row">
<div class="col">
<h2>{% trans "Contact" %}</h2>
<div>
{% if kaikki %}
<table>
{% for teekkari in kaikki %}
{% load static %}
<tr>
<td>
{% load static %}
<link rel="stylesheet" href="{% static "css/contact.css" %}">
<h2>{% trans "Contact" %}</h2>
{% if committees %}
{% for committee in committees %}
<!--Committee title-->
<h4>{{ committee.name }}</h4>
{% for role in committee.current_roles %}
{% for official in role.official.all %}
<div class="role-container">
<div class="row">
<div class="col">
<img src="static/img/missing.png">
</td>
<td>
<p class="name">{{ teekkari.first_name }} {{ teekkari.last_name }}</p>
<p class="email">{{ teekkari.email }}</p>
<p class="puh">{{ teekkari.phone_number }}</p>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<p>Ei henkilöitä</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
<h5>{{role.name}}</h5>
<p>{{official.first_name}}
{{official.last_name}}
{{official.email}}</p>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
{% endfor %}
{% else%}
<p>Ei Toimikuntia</p>
{% endif %}
</div>
{% endblock %}
+25 -11
View File
@@ -1,7 +1,7 @@
"""Translation classes."""
from modeltranslation.translator import register, TranslationOptions
from webapp.models import BaseFeed, Feed, Tag, Event, Registration
from webapp.models import BaseFeed, Feed, Tag, Event, Signup, SignupForm, TemplateQuestion
from webapp.models import PresetRole, BaseRole
@@ -19,13 +19,6 @@ class FeedTranslationOptions(TranslationOptions):
fields = ()
@register(Event)
class EventTranslationOptions(TranslationOptions):
"""Class for event translation options."""
fields = ()
@register(Tag)
class TagTranslationOptions(TranslationOptions):
"""Class for tag translation options."""
@@ -33,11 +26,32 @@ class TagTranslationOptions(TranslationOptions):
fields = ('name',)
@register(Registration)
class RegistrationTranslationOptions(TranslationOptions):
@register(Event)
class EventTranslationOptions(TranslationOptions):
"""Class for event translation options."""
fields = ()
@register(Signup)
class SignupTranslationOptions(TranslationOptions):
"""Class for registration translation options."""
fields = ('name',)
fields = ()
@register(SignupForm)
class SignupFormTranslationOptions(TranslationOptions):
"""Class for registration translation options."""
fields = ()
@register(TemplateQuestion)
class TemplateQuestionTranslationOptions(TranslationOptions):
"""Class for registration translation options."""
fields = ()
@register(BaseRole)
+57 -32
View File
@@ -1,45 +1,70 @@
"""Webapp urls."""
from django.conf.urls import url
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.conf.urls import url, include
from rest_framework import routers
# from rest_framework.urlpatterns import format_suffix_patterns
# from django.conf import settings
# from django.utils.translation import ugettext_lazy as _
from webapp.views import main_index
# from webapp.views import main_index
from webapp.views import login_view
from webapp.views import logout_view
from webapp.views import about_view
from webapp.views import guild_view
from webapp.views import freshmen_view
from webapp.views import jobs_view
from webapp.views import event_calendar_view
from webapp.views import international_view
from webapp.views import sosso_view
from webapp.views import contact_view
# from webapp.views import about_view
# from webapp.views import guild_view
# from webapp.views import freshmen_view
# from webapp.views import jobs_view
# from webapp.views import event_calendar_view
# from webapp.views import international_view
# from webapp.views import sosso_view
# from webapp.views import contact_view
from webapp.views import EventViewSet, SignupFormViewSet, SignupViewSet
router = routers.DefaultRouter()
router.register(r'events', EventViewSet)
router.register(r'signupForm', SignupFormViewSet)
router.register(r'signup', SignupViewSet)
urlpatterns = [
# main
url(r'^$', main_index),
url(r'^', include(router.urls)),
# login stuff
url(r'^login$', login_view),
url(r'^logout$', logout_view),
# git revision
url(r'^about', about_view),
# pages
url(r'^guild', guild_view),
url(r'^freshmen', freshmen_view),
url(r'^event_calendar', event_calendar_view),
url(r'^international', international_view),
url(r'^sosso', sosso_view),
url(r'^contact', contact_view),
# corporate
url(r'^jobs', jobs_view),
]
# urlpatterns = [
# # main
# url(r'^$', main_index),
# url(r'^api/$', api_root),
# url(r'^api/events/$', EventList.as_view(), name='event-list'),
# url(r'^api/events/(?P<pk>[0-9]+)/$', EventDetail.as_view(), name='event-detail'),
# url(r'^api/signup/$', SignupFormList.as_view(), name='signupform-list'),
# url(r'^api/signup/(?P<pk>[0-9]+)/$', SignupFormDetail.as_view(), name='signup-detail'),
# url(r'^api/signup/create$', SignupFormCreate.as_view(), name='signupform-create'),
# # url(r'^signupform/$', SignupFormList.as_view(), name='signupform-list'),
# # url(r'^signupform/(?P<pk>[0-9]+)/$', SignupFormDetail.as_view(), name='signupform-detail'),
# # login stuff
# url(r'^login$', login_view),
# url(r'^logout$', logout_view),
# # git revision
# url(r'^about', about_view),
# # pages
# url(r'^guild', guild_view),
# url(r'^freshmen', freshmen_view),
# url(r'^event_calendar', event_calendar_view),
# url(r'^international', international_view),
# url(r'^sosso', sosso_view),
# url(r'^contact', contact_view),
# # corporate
# url(r'^jobs', jobs_view),
# ]
if settings.DEBUG:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
# if settings.DEBUG:
# from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# urlpatterns += staticfiles_urlpatterns()
+43 -10
View File
@@ -1,21 +1,52 @@
"""Webapp views."""
from django.db.models import Count
# from django.db.models import Count
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.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth.decorators import permission_required, login_required
from django.conf import settings
# from django.views.decorators.csrf import ensure_csrf_cookie
# from django.http import HttpResponse, HttpResponseRedirect
# from django.contrib.auth.decorators import permission_required, login_required
# from django.conf import settings
# from django.utils import timezone
from rest_framework.decorators import api_view
from rest_framework import viewsets
# from rest_framework import permissions, authentication
from rest_framework.response import Response
from rest_framework.reverse import reverse
import logging
import requests
# import logging
# import requests
from dealer.git import git
from webapp.models import Official
from webapp.models import Event, SignupForm, Signup, Committee
from webapp.serializers import EventSerializer, SignupFormSerializer, SignupSerializer
from members.views.utils import *
# -- REST API -- #
@api_view(['GET'])
def api_root(request, format=None):
return Response({'events': reverse('event-list', request=request, format=format), })
class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
class SignupFormViewSet(viewsets.ModelViewSet):
queryset = SignupForm.objects.all()
serializer_class = SignupFormSerializer
class SignupViewSet(viewsets.ModelViewSet):
queryset = Signup.objects.all()
serializer_class = SignupSerializer
# -- OLD CODEBASE -- #
@require_http_methods(["GET"])
def main_index(request, *args, **kwargs):
@@ -114,8 +145,10 @@ def sosso_view(request, *args, **kwargs):
@require_http_methods(["GET"])
def contact_view(request, *args, **kwargs):
"""Render "Contact" page."""
committees = Committee.objects.order_by('name')
kaikki = Official.objects.all()
context = {"kaikki": kaikki}
context = {
"committees": committees
}
return render(request, "contact.html", context)