diff --git a/kaehmy/models.py b/kaehmy/models.py
index dcafbf5..0347600 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 5c71ad1..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-05-22 23:51+0300\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 webapp/models.py:140
+#: 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,95 +201,95 @@ 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:15
+#: 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:175
+#: 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:159
+#: kaehmy/tables.py:13 webapp/models.py:109
msgid "Roles"
msgstr ""
@@ -726,11 +726,11 @@ msgstr "Payments in register:"
msgid "Language"
msgstr "Language"
-#: members/templates/settings.html:20 sikweb/base.py:246
+#: members/templates/settings.html:20 sikweb/base.py:247
msgid "Finnish"
msgstr "Finnish"
-#: members/templates/settings.html:21 sikweb/base.py:247
+#: members/templates/settings.html:21 sikweb/base.py:248
msgid "English"
msgstr "English"
@@ -818,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 ""
@@ -903,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"
@@ -975,91 +1019,67 @@ 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: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:134
+#: webapp/models.py:84
msgid "Committee"
msgstr ""
-#: webapp/models.py:135
+#: webapp/models.py:85
msgid "Committees"
msgstr ""
-#: webapp/models.py:138
+#: webapp/models.py:88
msgid "Committee: {}"
msgstr ""
-#: webapp/models.py:158
+#: webapp/models.py:108
msgid "Role"
msgstr ""
-#: webapp/models.py:161
+#: webapp/models.py:111
msgid "Start date"
msgstr ""
-#: webapp/models.py:162
+#: webapp/models.py:112
msgid "End date"
msgstr ""
-#: webapp/models.py:172
+#: webapp/models.py:122
msgid "Official"
msgstr ""
-#: webapp/models.py:173
+#: webapp/models.py:123
msgid "Officials"
msgstr ""
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 d758578..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-05-22 23:51+0300\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"
@@ -113,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 webapp/models.py:140
+#: 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"
@@ -202,95 +202,95 @@ msgstr "Virheellinen puhelinnumero"
msgid "Custom role with the same name already exists."
msgstr "Samanniminen virka on jo olemassa."
-#: 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 "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:15
+#: 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:175
+#: 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:159
+#: kaehmy/tables.py:13 webapp/models.py:109
msgid "Roles"
msgstr "Roolit"
@@ -728,11 +728,11 @@ msgstr "Maksutapahtumia:"
msgid "Language"
msgstr "Kieli"
-#: members/templates/settings.html:20 sikweb/base.py:246
+#: members/templates/settings.html:20 sikweb/base.py:247
msgid "Finnish"
msgstr "suomi"
-#: members/templates/settings.html:21 sikweb/base.py:247
+#: members/templates/settings.html:21 sikweb/base.py:248
msgid "English"
msgstr "englanti"
@@ -819,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. {}"
@@ -903,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"
@@ -974,91 +1018,67 @@ 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: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:134
+#: webapp/models.py:84
msgid "Committee"
msgstr "Toimikunta"
-#: webapp/models.py:135
+#: webapp/models.py:85
msgid "Committees"
msgstr "Toimikunnat"
-#: webapp/models.py:138
+#: webapp/models.py:88
msgid "Committee: {}"
msgstr "Toimikunta: {}"
-#: webapp/models.py:158
+#: webapp/models.py:108
msgid "Role"
msgstr "Rooli"
-#: webapp/models.py:161
+#: webapp/models.py:111
msgid "Start date"
msgstr "Alkupäivämäärä"
-#: webapp/models.py:162
+#: webapp/models.py:112
msgid "End date"
msgstr "Loppupäivämäärä"
-#: webapp/models.py:172
+#: webapp/models.py:122
msgid "Official"
msgstr "Toimihenkilö"
-#: webapp/models.py:173
+#: webapp/models.py:123
msgid "Officials"
msgstr "Toimihenkilöt"
@@ -1114,6 +1134,15 @@ msgstr "Sössö"
msgid "Corporate"
msgstr "Yritys"
+#~ msgid "Registration: {}"
+#~ msgstr "Registration: {}"
+
+#~ msgid "Registration"
+#~ msgstr "Ilmoittautuminen"
+
+#~ msgid "Registrations"
+#~ msgstr "Ilmoittautumiset"
+
#~ msgid "Corporate affairs"
#~ msgstr "Yrityssuhteet"
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/webapp/admin.py b/webapp/admin.py
index b39ac96..2059a1d 100644
--- a/webapp/admin.py
+++ b/webapp/admin.py
@@ -2,7 +2,7 @@
from django.contrib import admin
from webapp.models import Official, Role, Committee
-from webapp.models import Feed, Tag, BaseFeed, Event, Registration
+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,7 +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/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 55e4aa0..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,19 +72,44 @@ 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):
@@ -182,6 +207,7 @@ class Official(User):
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/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 bbb0715..2b364fa 100644
--- a/webapp/views.py
+++ b/webapp/views.py
@@ -1,22 +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.utils import timezone
+# 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, Committee
+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):