diff --git a/kaehmy/models.py b/kaehmy/models.py index 237c349..24f8a60 100644 --- a/kaehmy/models.py +++ b/kaehmy/models.py @@ -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 diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index ec01ae1..943f63b 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index f3d30c9..f0cecbc 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -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 %(email)s %(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" diff --git a/locale/fi/LC_MESSAGES/django.mo b/locale/fi/LC_MESSAGES/django.mo index 6ed19a4..669eeea 100644 Binary files a/locale/fi/LC_MESSAGES/django.mo and b/locale/fi/LC_MESSAGES/django.mo differ diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index 03f7e96..235c146 100644 --- a/locale/fi/LC_MESSAGES/django.po +++ b/locale/fi/LC_MESSAGES/django.po @@ -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 %(email)s %(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" diff --git a/members/models.py b/members/models.py index ff023b1..64856ba 100644 --- a/members/models.py +++ b/members/models.py @@ -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 diff --git a/members/tables.py b/members/tables.py index a70aff6..89ecca1 100644 --- a/members/tables.py +++ b/members/tables.py @@ -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( ('') + - _('Edit') + - '', - verbose_name="" + 'href="/members/edit/{{ record.id }}">') + _('Edit') + '', 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( ('') + - _('Edit') + - '', + 'href="/members/edit_payment/{{ record.id }}">') + _('Edit') + '', verbose_name="" ) @@ -62,9 +57,7 @@ class RequestTable(tables.Table): options = tables.TemplateColumn( ('') + - _('Edit') + - '', + 'href="/members/edit_application/{{ record.id }}">') + _('Edit') + '', verbose_name="" ) diff --git a/members/templates/error.html b/members/templates/error.html deleted file mode 100644 index 3d09501..0000000 --- a/members/templates/error.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "members:base.html" %} - -{% load static %} -{% load i18n %} -{% block content %} -
-
-

{% trans "Error" %}

-
- -
- {{ error|safe }} -
-
- -
-
-{% endblock content %} diff --git a/members/templates/member_list.html b/members/templates/member_list.html index 8b65bb6..6952362 100644 --- a/members/templates/member_list.html +++ b/members/templates/member_list.html @@ -18,7 +18,7 @@ {% endif %}
- {% trans "Members in register:" %} {{ member_count }} + {% trans "Members in register:" %} {{ member_count }} ({{ paid_count }})
diff --git a/members/views/members.py b/members/views/members.py index 4ae9a6b..376351a 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -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) diff --git a/ohlhafv/models.py b/ohlhafv/models.py index 1b06a19..3691ff7 100644 --- a/ohlhafv/models.py +++ b/ohlhafv/models.py @@ -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 diff --git a/requirements.txt b/requirements.txt index b2152fa..02d5cf6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 diff --git a/templates/error.html b/templates/error.html index 745eb56..3d09501 100644 --- a/templates/error.html +++ b/templates/error.html @@ -1,4 +1,4 @@ -{% extends "members_base.html" %} +{% extends "members:base.html" %} {% load static %} {% load i18n %} diff --git a/webapp/admin.py b/webapp/admin.py index 3443c61..2059a1d 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -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) diff --git a/webapp/migrations/0036_auto_20180301_2011.py b/webapp/migrations/0036_auto_20180301_2011.py new file mode 100644 index 0000000..073a964 --- /dev/null +++ b/webapp/migrations/0036_auto_20180301_2011.py @@ -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'), + ), + ] diff --git a/webapp/migrations/0037_auto_20180301_2111.py b/webapp/migrations/0037_auto_20180301_2111.py new file mode 100644 index 0000000..b5cab47 --- /dev/null +++ b/webapp/migrations/0037_auto_20180301_2111.py @@ -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'}, + ), + ] diff --git a/webapp/migrations/0038_auto_20180516_2108.py b/webapp/migrations/0038_auto_20180516_2108.py new file mode 100644 index 0000000..b58445c --- /dev/null +++ b/webapp/migrations/0038_auto_20180516_2108.py @@ -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'), + ), + ] diff --git a/webapp/migrations/0039_auto_20180516_2113.py b/webapp/migrations/0039_auto_20180516_2113.py new file mode 100644 index 0000000..3fd2671 --- /dev/null +++ b/webapp/migrations/0039_auto_20180516_2113.py @@ -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'), + ), + ] diff --git a/webapp/migrations/0040_auto_20180516_2124.py b/webapp/migrations/0040_auto_20180516_2124.py new file mode 100644 index 0000000..7370f7b --- /dev/null +++ b/webapp/migrations/0040_auto_20180516_2124.py @@ -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'), + ), + ] diff --git a/webapp/migrations/0041_auto_20180516_2204.py b/webapp/migrations/0041_auto_20180516_2204.py new file mode 100644 index 0000000..8c5ac91 --- /dev/null +++ b/webapp/migrations/0041_auto_20180516_2204.py @@ -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'), + ), + ] diff --git a/webapp/migrations/0042_merge_20180516_2249.py b/webapp/migrations/0042_merge_20180516_2249.py new file mode 100644 index 0000000..289c272 --- /dev/null +++ b/webapp/migrations/0042_merge_20180516_2249.py @@ -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 = [ + ] diff --git a/webapp/migrations/0043_auto_20180605_1953.py b/webapp/migrations/0043_auto_20180605_1953.py new file mode 100644 index 0000000..d449b36 --- /dev/null +++ b/webapp/migrations/0043_auto_20180605_1953.py @@ -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', + ), + ] diff --git a/webapp/migrations/0044_auto_20180705_1851.py b/webapp/migrations/0044_auto_20180705_1851.py new file mode 100644 index 0000000..7b43419 --- /dev/null +++ b/webapp/migrations/0044_auto_20180705_1851.py @@ -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'), + ), + ] diff --git a/webapp/migrations/0045_auto_20180710_1901.py b/webapp/migrations/0045_auto_20180710_1901.py new file mode 100644 index 0000000..eeced4e --- /dev/null +++ b/webapp/migrations/0045_auto_20180710_1901.py @@ -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', + ), + ] diff --git a/webapp/migrations/0046_auto_20180710_2041.py b/webapp/migrations/0046_auto_20180710_2041.py new file mode 100644 index 0000000..161e88d --- /dev/null +++ b/webapp/migrations/0046_auto_20180710_2041.py @@ -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, + ), + ] diff --git a/webapp/migrations/0047_auto_20180710_2110.py b/webapp/migrations/0047_auto_20180710_2110.py new file mode 100644 index 0000000..3f0732e --- /dev/null +++ b/webapp/migrations/0047_auto_20180710_2110.py @@ -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'), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 7549942..d455b0a 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -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) diff --git a/webapp/serializers.py b/webapp/serializers.py new file mode 100644 index 0000000..1e9745f --- /dev/null +++ b/webapp/serializers.py @@ -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', + } + } diff --git a/webapp/static/css/contact.css b/webapp/static/css/contact.css new file mode 100644 index 0000000..d935e46 --- /dev/null +++ b/webapp/static/css/contact.css @@ -0,0 +1,6 @@ + +.role-container { + background-color: aqua; + width: 200px; + text-align: center; +} \ No newline at end of file diff --git a/webapp/templates/contact.html b/webapp/templates/contact.html index d52661a..f0d6707 100644 --- a/webapp/templates/contact.html +++ b/webapp/templates/contact.html @@ -4,34 +4,37 @@ {% load i18n %}
-
-
-
-

{% trans "Contact" %}

-
- {% if kaikki %} - - {% for teekkari in kaikki %} - {% load static %} - - - - - {% endfor %} -
+ {% load static %} + +

{% trans "Contact" %}

+ + {% if committees %} + {% for committee in committees %} + +

{{ committee.name }}

+ {% for role in committee.current_roles %} + {% for official in role.official.all %} +
+
+
-
-

{{ teekkari.first_name }} {{ teekkari.last_name }}

- -

{{ teekkari.phone_number }}

-
- {% else %} -

Ei henkilöitä

- {% endif %} -
-
-
-
+
+
+
+
+
{{role.name}}
+

{{official.first_name}} + {{official.last_name}} + {{official.email}}

+
+
+ + {% endfor %} + {% endfor %} + {% endfor %} + {% else%} +

Ei Toimikuntia

+ {% endif %} {% endblock %} diff --git a/webapp/translation.py b/webapp/translation.py index 3ab2c6e..73713ca 100644 --- a/webapp/translation.py +++ b/webapp/translation.py @@ -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) diff --git a/webapp/urls.py b/webapp/urls.py index 8095c52..dfd12a9 100644 --- a/webapp/urls.py +++ b/webapp/urls.py @@ -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[0-9]+)/$', EventDetail.as_view(), name='event-detail'), +# url(r'^api/signup/$', SignupFormList.as_view(), name='signupform-list'), +# url(r'^api/signup/(?P[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[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() diff --git a/webapp/views.py b/webapp/views.py index e663a58..74dfd78 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -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)