From 4e8adebb2dfd8875da9eae4253a40d63fb5f2831 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 5 Jun 2018 19:33:35 +0300 Subject: [PATCH 1/6] Move Event and Registration model to own app --- signup/README.md | 49 +++++++++++++++++++++++++++ signup/__init__.py | 0 signup/admin.py | 3 ++ signup/apps.py | 5 +++ signup/migrations/__init__.py | 0 signup/models.py | 63 +++++++++++++++++++++++++++++++++++ signup/tests.py | 3 ++ signup/translation.py | 17 ++++++++++ signup/urls.py | 25 ++++++++++++++ signup/views.py | 3 ++ sikweb/base.py | 1 + webapp/admin.py | 3 +- webapp/models.py | 50 --------------------------- webapp/translation.py | 16 +-------- 14 files changed, 172 insertions(+), 66 deletions(-) create mode 100644 signup/README.md create mode 100644 signup/__init__.py create mode 100644 signup/admin.py create mode 100644 signup/apps.py create mode 100644 signup/migrations/__init__.py create mode 100644 signup/models.py create mode 100644 signup/tests.py create mode 100644 signup/translation.py create mode 100644 signup/urls.py create mode 100644 signup/views.py diff --git a/signup/README.md b/signup/README.md new file mode 100644 index 0000000..686d79f --- /dev/null +++ b/signup/README.md @@ -0,0 +1,49 @@ +# Ilmotunkki + +## Terms +- Signup, Form with collection of questions +- Response, One answer to some signup +- Quota, Amount of people allowed to respond with some option selected. + - In generic case there is no option and quota is just max number of people. + +## Requirements + +- Officials may generate signups forms +- Officials may see results from signups +- Officials may see some stats from their signups + - for example distributions of multiple choice answers +- Officials should be able to edit signups wherever possible + - Propably not possible to edit after first response +- Officials should be able to delete responses +- Officials should be able to embed payment information to the signup? + - TODO: is there need for unique reference numbers for every response? +- Officials should be able to save a signup to a reusable template. + - Possibility to save templates? + +- Signup may be attached to an event + - Multiple signups to a single event should be possible (FTMK uses for museum visits? Erna asked if it was possible in old web) + - Possibility for external service (Google Form, URL will suffice) + +- Signup should support custom quotas + - Atleast quotas from multiple choices and checkboxes + - Text quotas are risky (typos everywhere!!) +- Signup should have start and end times +- Signup should support atleast following questiontypes + - Text + - multiple choice (select one) + - checkbox (boolean yes/no) + +- Signup should support reserve slots. + - TODO: quota based reserves or generic? or both? + +- Responding should send confirm email +- Response should be editable by responder and only by the responder until the closing of the signup + - TODO: is there need to custom edit period or disable? + +- Responders should see amount of quotas left. +- Responders should see some information about other responses + - TODO: names? should this be editable by officials? + - Or superadmin can edit and the one signing up within edit period + - NOTE: Quota related info is exposed if any info is printed + - When quotas need to be hidden? PoTa? + diff --git a/signup/__init__.py b/signup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/signup/admin.py b/signup/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/signup/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/signup/apps.py b/signup/apps.py new file mode 100644 index 0000000..c5dcacb --- /dev/null +++ b/signup/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class IlmotunkkiConfig(AppConfig): + name = 'ilmotunkki' diff --git a/signup/migrations/__init__.py b/signup/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/signup/models.py b/signup/models.py new file mode 100644 index 0000000..0655f45 --- /dev/null +++ b/signup/models.py @@ -0,0 +1,63 @@ +"""Signup and Event models.""" +from django.db import models +from django.utils import timezone +from webapp.models import Tag, BaseFeed +from webapp.utils import month_from_now +from django.utils.translation import ugettext_lazy as _ +from auditlog.registry import auditlog +from phonenumber_field.modelfields import PhoneNumberField +from django.contrib.postgres.fields import JSONField + +import logging + + +VERBOSE_NAME = _('Webapp') + + +class Event(BaseFeed): + """Model for event.""" + + start_time = models.DateTimeField(default=timezone.now) + end_time = models.DateTimeField(default=timezone.now) + registration = models.ForeignKey( + 'Registration', on_delete=models.CASCADE, null=True) + + def __str__(self): + return _('Event: {}').format(self.title) + + class Meta: + verbose_name = _('Event') + verbose_name_plural = _('Events') + + +class Registration(models.Model): + """Model for event registration.""" + + name = models.CharField(max_length=255) + email = models.EmailField() + options = JSONField() + + def __str__(self): + return _('Registration: {}').format(self.name) + + class Meta: + verbose_name = _('Registration') + verbose_name_plural = _('Registrations') + + +class Signup(models.Model): + start = models.DateTimeField() + end = models.DateTimeField() + + +class Question(models.Model): + pass + + +class Answer(models.Model): + signup = models.ForeignKey(Signup, on_delete=models.CASCADE) + question = models.ForeignKey(Question, on_delete=models.PROTECT) + + +auditlog.register(Event) +auditlog.register(Signup) \ No newline at end of file diff --git a/signup/tests.py b/signup/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/signup/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/signup/translation.py b/signup/translation.py new file mode 100644 index 0000000..7c9e14e --- /dev/null +++ b/signup/translation.py @@ -0,0 +1,17 @@ +"""Translation classes.""" + +from modeltranslation.translator import register, TranslationOptions +from signup.models import Event, Registration + +@register(Event) +class EventTranslationOptions(TranslationOptions): + """Class for event translation options.""" + + fields = () + + +@register(Registration) +class RegistrationTranslationOptions(TranslationOptions): + """Class for registration translation options.""" + + fields = ('name',) diff --git a/signup/urls.py b/signup/urls.py new file mode 100644 index 0000000..a3bad51 --- /dev/null +++ b/signup/urls.py @@ -0,0 +1,25 @@ +"""Signup urls.""" + +from django.conf.urls import url +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ + +# from kaehmy.views import view +# from kaehmy.views import list_view +# from kaehmy.views import submit +# from kaehmy.views import comment +# from kaehmy.views import statistics_view +# from kaehmy.views import export_view + +urlpatterns = [ + # kaehmy + # url(r'^new', new_form), + # url(r'^$', list_view), + # url(r'^submit', submit), + # url(r'^statistics', statistics_view), + # url(r'^export', export_view), +] + +if settings.DEBUG: + from django.contrib.staticfiles.urls import staticfiles_urlpatterns + urlpatterns += staticfiles_urlpatterns() diff --git a/signup/views.py b/signup/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/signup/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/sikweb/base.py b/sikweb/base.py index 94ef3eb..cbe3824 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -92,6 +92,7 @@ INSTALLED_APPS = [ 'webapp', 'members', 'infoscreen', + 'signup', 'coffee_scale', 'kaehmy', 'ohlhafv', diff --git a/webapp/admin.py b/webapp/admin.py index b39ac96..a479aa2 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -2,7 +2,8 @@ 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 +from signup.models import Event, Registration from modeltranslation.admin import TranslationAdmin from django.contrib.auth.models import Permission # this is needed so that the models get registered for translation diff --git a/webapp/models.py b/webapp/models.py index 55e4aa0..2e6a6ec 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -56,60 +56,11 @@ class Feed(BaseFeed): verbose_name_plural = _('Feeds') -class Event(BaseFeed): - """Model for event.""" - - start_time = models.DateTimeField(default=timezone.now) - end_time = models.DateTimeField(default=timezone.now) - registration = models.ForeignKey( - 'Registration', on_delete=models.CASCADE, null=True) - - def __str__(self): - return _('Event: {}').format(self.title) - - class Meta: - verbose_name = _('Event') - verbose_name_plural = _('Events') - - -class Registration(models.Model): - """Model for event registration.""" - - name = models.CharField(max_length=255) - email = models.EmailField() - options = JSONField() - - def __str__(self): - return _('Registration: {}').format(self.name) - - class Meta: - verbose_name = _('Registration') - verbose_name_plural = _('Registrations') - - 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')), - # ) - name = models.CharField(_('Name'), max_length=255) is_board = models.BooleanField(_('Board member')) - # category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255) def __str__(self): n = self.name.capitalize() @@ -181,7 +132,6 @@ class Official(User): auditlog.register(Tag) auditlog.register(Feed) -auditlog.register(Event) auditlog.register(PresetRole) auditlog.register(Role) auditlog.register(Official) diff --git a/webapp/translation.py b/webapp/translation.py index 3ab2c6e..0959e03 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 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,13 +26,6 @@ class TagTranslationOptions(TranslationOptions): fields = ('name',) -@register(Registration) -class RegistrationTranslationOptions(TranslationOptions): - """Class for registration translation options.""" - - fields = ('name',) - - @register(BaseRole) class BaseRoleTranslationOptions(TranslationOptions): """Class for base role translation options""" From 18926d16d12794876a10b02f386951b080166b77 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 19 Jun 2018 20:30:54 +0300 Subject: [PATCH 2/6] Create new signup related models --- kaehmy/models.py | 1 - locale/en/LC_MESSAGES/django.mo | Bin 14954 -> 14838 bytes locale/en/LC_MESSAGES/django.po | 176 ++++++++++-------- locale/fi/LC_MESSAGES/django.mo | Bin 17494 -> 17413 bytes locale/fi/LC_MESSAGES/django.po | 185 +++++++++++-------- ohlhafv/models.py | 1 - signup/admin.py | 10 +- signup/apps.py | 4 +- signup/migrations/0001_initial.py | 88 +++++++++ signup/migrations/0002_auto_20180619_2020.py | 62 +++++++ signup/migrations/0003_auto_20180619_2023.py | 28 +++ signup/models.py | 55 +++--- signup/translation.py | 23 ++- signup/urls.py | 8 +- signup/views.py | 8 +- sikweb/urls.py | 2 + webapp/admin.py | 3 - webapp/migrations/0043_auto_20180605_1953.py | 29 +++ webapp/models.py | 1 - 19 files changed, 489 insertions(+), 195 deletions(-) create mode 100644 signup/migrations/0001_initial.py create mode 100644 signup/migrations/0002_auto_20180619_2020.py create mode 100644 signup/migrations/0003_auto_20180619_2023.py create mode 100644 webapp/migrations/0043_auto_20180605_1953.py 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 ec01ae1fa3718a059057f7feca16fcbac9119754..943f63bb313228deb8a6aba21d40a8e2e43c8d0d 100644 GIT binary patch delta 4524 zcmYk;3v|w90LSrXvoW(V<{e{f>}oT1BSdbKXmX#K%ZLrJFR^GQnvzT2 zl>1%OayhCKPUz-1q^ph-C!M~(_kEnR|LM2S^Zft+_qo5XZco2A&AC?3Z?)k%Pa?>w z>c+Tyj0pnN;7eF7$7A<~ptXYX&s5bB#T5cgn^ zF^)M(K@Fe9I(QlN;w`L=5A5@rp~e(YccGro#z)Q(^4FYo3RQ0hcz(5WlS54LA{rY(Kr^HVlirf71q-j zPW>io1$@GoF#Ve#3L04is^LV`2-A>Bm>$>)hoWX$j2h@_)cd8VrQU>E$@ft!w+FRF zCsFU8MXlUL)O$anqXvJc;E(^JI`(bAa-j>=!3fmzd{n~|Q60{*^&(Wm%djDqqdMMi zpPxXra}hQ3E2#HxG+_OkQ@F0oFX!L?)qU>rh+b6j9I$EV3_@+84H>mU1UDMsoty@HJ#n z%x|a$0yyegnGjSvv8WE(qPDgZuEkNPt-Fs}!A!myY>i`jQP2kmVPnikEm;wAEX-P4 z--YV%G-?ITqh@@`KEI7RD?U+PLs0KUqV_rgHSi};Ta)9_;V@CqOy{DOYz3;LGGvmb z0@ctd)RLb=&EOJh=2uZO{tGqW`>5x2IdN()3^l=MR67}{{yJe4{hR(2CgN07L)WY~ zP#xYu{xkRZqZu@0U3J>iFbZ=}D>oB49%i+z@3!@Gs0sao8pvJLq4nd}%JJ+W1&ufa zb;w*e5HnE&TZ>w1zZmb*hN0e%MYhu&$0C*7)kvCs+~VD6(3?tY|Si^ zaX9*632Np`QHOAYLqQ+hWgi?uy;y1QU%;Bwui{X=i8_>B6TN$yhi#~jL%p{F*)3Cn z+L}t#0B>6ZSr(n4L<~eHlY(a47d5gxtbv875x$5zt;MLbu^u(xO4L9vq29lWTIw5E z3-6#-?jH=m8Z3w24?(T03wh5maTJ2Mk%s=*8P#zQ?1?$34mR57TTu<~Ky`S?)=#1u z{tEf$!2FEr_@RAXoqbR{F4WAMU5pG3_9cZdVNblFLvhWYUBe@ho}HG zgA&x9E-Yu?&nn)ySfXQjBzxE`98(M*m_Juz7 zg<+@xJ&XEBXa;Hq%TcGe9QFAFsFgW^YUdJa3vZ!T@D7ea7yHy3XQEc{WIF4w20!P9 zK6n}RQ+gY={(PB(FdQ|rIMn@CsD`?s2Jkd$27|Fa=AxE#GU^|p8TR=SRC_B?6WoYu=Oa|R z&VC9p6wcv9yo+imudUYtRELGA)B6%?2J28~!HrRP8MSf`Q2z*pJ?5>aqw0N86Pkn? z$aLh;I%a`=un0Ay!!0y{N-;3iW|A$d|jiZ(xpzjdrHQ9YIWgy z(w`*RdumhH1TUVSbMROp(3(}Fh0|fyi1Of7m2Pf z$jhXSDqP#iV)6=ENTP@{fi<0oUC0UY8qpbONEVSkWHhOI&7u-dg2@7+v$K^OTJi0!lkZvn2aX8`Y&jBb333Xng5KZ=z-Q+yc73;2%*KG188B4-RfO~P>eLn7k2{HceR~mj1=+2Hl<{R8LIkkOMT1tnEjHHxwcTC(u UU-ytu-uON_AkcmPu_?a)0~W=uQ2+n{ delta 4636 zcmZYB3v|w90LSsiF4<;`4OznLvKf1=**nIjFys=UX+kTKU2-XA8R2!mM()f#xm9ji zgeCRrVw6S~i4)aP;t=WRsGR!#-v2X4r~f&>eV*t4{@>^Rf4P}|X|(sd$e^W$>jb%< zY`n*q=nBTTE9t1S8=F-p*dK#% z7HV$uFp~bwDhm4I4*Nj~>cLWb|2S&KXRse$z&hBrhA|Z}3tQk2)N`w_A#TFDSc)3p zMQcb+R+xGmhS9%Cr=XelK#eR5)$mYcQA|EE88ZVDa3yNMrKo{^je7nJYRP{@t=J{h z3f@F*Rq(ye^Hoq=5rtko*ocA}OvGS(5Y=%9?2MVH4%XVwH=`QfhU&1y)_tgkPhc(l z0oCze_VXZas+}m*8K_;0_170-xzPYqP+#be0XP^nplno!!!QwF!fv8O>NgIdXj$S#KHy2S2-NOmeRz#rAKs0LRbx||+paz_3KYt9>USHG%pGCD(fKgrw6DhcG5e~&- zR73SxHyMlSuo?1^NkPq^AL_K{qYH~rD|Z0(Q~tHB->~%vew8#KH)<6fwSvrwl!5B1zw)ZvqXW#Fq``&w%&lza!!p0)m{cR z$ARd^Mc51vc_{=@xPn@N-%vjorm6GADAauy>bV4a--Dsl+hITKhB~Ahu_F4g1s+8` zr|Gk6CJePj38(>jd)UHo)S;S(VYme~^WCTc_)ra(p$7O3>TS7Bw_;~3L3I$wI_mREsD`Vd zI&|53V^q5>k$)ykXQX2@(EmC6pGQFr6{2Q73H61!$eUwUqrPwmbr_GJIy{Ez@C35T z<~(-9N-ReQ?1dg&f}B@#1hryUQQr@Efd1&;giz3X9iTPI(qe!8IG6gll1*k1q zj#Y7;{d|}G{5{lwK0^JYbQ&Y@chn&cV%_!qx~P?jMYWTL+QROr73}F@{RdMhJep-8=RxA(o8$Zd`SD==BCu#-uqh{>0pMQy(`DN>$sOLhxyrkOe zNYu#VFcQiPIS$24R6{;%DXPOV)ZzUWHG#iTXQ5^auOPNTty~uBAEmLjzRan6 z&29>s(dVdvoU&d-o!(pa^V_JI1-EjxAPh68*GCPo0JY@bqb6_z^?b$F&cMP^hcy

|X%$@2SqSmPA+aNECe-L0^*B`FEWHxz6 z6)qO$&efI@N5E{-`(J}RM|3^xV20p_WP`2qn_-?OpAZdh9a%{3B~KE@W?mwX5-oH2 zHHpGgWFXPyb1;2z7x6CQ&jiwk=sM(JmLYGG{}AcccJc<9PP&spMArvI+ZId45pBT} zL}x?SD55t^OTL>dC;E}o%BJb}|7i-k9&+&ieU-l($z$XhvX9(-Euiu)$suJ#|DvrR zn@JZ^Omv-a@c(_8zpF_va)b;c>fd|}i%C5)p2U$EB%5g8$C7-~iNuqSh)%Sw#|gip zrZFiY2g!Ugg#?rGs~v@{w$dNllT~CU{ri6ybTT`VPsw{EgXEDY(wp#>`Y)a67&43K z@NvjZE-Al?C_G4plUn2`Sx+XCMnrGgVWO)8QU7kWCA#iYi`yvdAP2}?vWDn--~X52eB4joB6CQ6vV;_pSI9B)EO~_J za{2!{|9+^rlT0OBRIyh#TuSC?X#(v{@fpdwtKN|Eo1{(oz2dBD`zwSFD;Pc^&oyeu zu;Siv?%?9oT1UgGW*pv|pMQ9-Yxtm?LF4j93@Hw5=nJUqX_lDeN=!;k_QWS96`zcm S8StMkCrAAMd(%=z1^f#*^27T8 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 6ed19a4d062930022b1685116466562aff002780..669eeea80798d26b672bf48c8912cdea1914d262 100644 GIT binary patch delta 5978 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 delta 6054 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 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/signup/admin.py b/signup/admin.py index 8c38f3f..ad64a0e 100644 --- a/signup/admin.py +++ b/signup/admin.py @@ -1,3 +1,11 @@ from django.contrib import admin +from signup.models import 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 +import webapp.translation -# Register your models here. +admin.site.register(Event, TranslationAdmin) +admin.site.register(SignupForm, TranslationAdmin) +admin.site.register(Signup, TranslationAdmin) +admin.site.register(TemplateQuestion, TranslationAdmin) diff --git a/signup/apps.py b/signup/apps.py index c5dcacb..a27ecbf 100644 --- a/signup/apps.py +++ b/signup/apps.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -class IlmotunkkiConfig(AppConfig): - name = 'ilmotunkki' +class SignupConfig(AppConfig): + name = 'Sign-up' diff --git a/signup/migrations/0001_initial.py b/signup/migrations/0001_initial.py new file mode 100644 index 0000000..57a2e33 --- /dev/null +++ b/signup/migrations/0001_initial.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-06-19 17:09 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('webapp', '0043_auto_20180605_1953'), + ] + + operations = [ + migrations.CreateModel( + name='Answer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('answer', models.CharField(max_length=255)), + ], + ), + 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', models.DateTimeField(default=django.utils.timezone.now)), + ('end', models.DateTimeField(default=django.utils.timezone.now)), + ], + options={ + 'verbose_name': 'Event', + 'verbose_name_plural': 'Events', + }, + bases=('webapp.basefeed',), + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('questions', models.CharField(max_length=255)), + ], + ), + 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)), + ], + ), + migrations.CreateModel( + name='SignupForm', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start', models.DateTimeField()), + ('end', models.DateTimeField()), + ('questions', models.ManyToManyField(to='signup.Question')), + ], + options={ + 'verbose_name': 'SignupForm', + 'verbose_name_plural': 'SignupForm', + }, + ), + migrations.CreateModel( + name='TemplateQuestion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('questions', models.CharField(max_length=255)), + ], + ), + migrations.AddField( + model_name='signup', + name='signupForm', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='signup.SignupForm'), + ), + migrations.AddField( + model_name='event', + name='signupForm', + field=models.ManyToManyField(blank=True, to='signup.SignupForm'), + ), + migrations.AddField( + model_name='answer', + name='signup', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='signup.Signup'), + ), + ] diff --git a/signup/migrations/0002_auto_20180619_2020.py b/signup/migrations/0002_auto_20180619_2020.py new file mode 100644 index 0000000..2fbedd3 --- /dev/null +++ b/signup/migrations/0002_auto_20180619_2020.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-06-19 17:20 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('signup', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='answer', + options={'verbose_name': 'Sign-up answer', 'verbose_name_plural': 'Sign-up answers'}, + ), + migrations.AlterModelOptions( + name='signup', + options={'verbose_name': 'Sign-up', 'verbose_name_plural': 'Sign-ups'}, + ), + migrations.AlterModelOptions( + name='templatequestion', + options={'verbose_name': 'Template question', 'verbose_name_plural': 'Template questions'}, + ), + migrations.RenameField( + model_name='templatequestion', + old_name='questions', + new_name='question', + ), + migrations.RemoveField( + model_name='signupform', + name='questions', + ), + migrations.AddField( + model_name='signupform', + name='question', + field=models.CharField(default='', max_length=255), + preserve_default=False, + ), + migrations.AddField( + model_name='templatequestion', + name='name', + field=models.CharField(default='', max_length=255), + preserve_default=False, + ), + migrations.AlterField( + model_name='signupform', + name='end', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='signupform', + name='start', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.DeleteModel( + name='Question', + ), + ] diff --git a/signup/migrations/0003_auto_20180619_2023.py b/signup/migrations/0003_auto_20180619_2023.py new file mode 100644 index 0000000..48535f2 --- /dev/null +++ b/signup/migrations/0003_auto_20180619_2023.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-06-19 17:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('signup', '0002_auto_20180619_2020'), + ] + + operations = [ + migrations.RemoveField( + model_name='answer', + name='signup', + ), + migrations.AddField( + model_name='signup', + name='answer', + field=models.CharField(default='', max_length=255), + preserve_default=False, + ), + migrations.DeleteModel( + name='Answer', + ), + ] diff --git a/signup/models.py b/signup/models.py index 0655f45..614c769 100644 --- a/signup/models.py +++ b/signup/models.py @@ -17,10 +17,10 @@ VERBOSE_NAME = _('Webapp') class Event(BaseFeed): """Model for event.""" - start_time = models.DateTimeField(default=timezone.now) - end_time = models.DateTimeField(default=timezone.now) - registration = models.ForeignKey( - 'Registration', on_delete=models.CASCADE, null=True) + start = models.DateTimeField(default=timezone.now) + end = models.DateTimeField(default=timezone.now) + signupForm = models.ManyToManyField( + 'SignupForm', blank=True) def __str__(self): return _('Event: {}').format(self.title) @@ -30,34 +30,45 @@ 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() + question = models.CharField(max_length=255) + + class Meta: + verbose_name = _('Signup form') + verbose_name_plural = _('Signup forms') class Signup(models.Model): - start = models.DateTimeField() - end = models.DateTimeField() + 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 Question(models.Model): - pass - - -class Answer(models.Model): - signup = models.ForeignKey(Signup, on_delete=models.CASCADE) - question = models.ForeignKey(Question, on_delete=models.PROTECT) + class Meta: + verbose_name = _('Sign-up') + verbose_name_plural = _('Sign-ups') auditlog.register(Event) -auditlog.register(Signup) \ No newline at end of file +auditlog.register(Signup) diff --git a/signup/translation.py b/signup/translation.py index 7c9e14e..47b7a1f 100644 --- a/signup/translation.py +++ b/signup/translation.py @@ -1,7 +1,8 @@ """Translation classes.""" from modeltranslation.translator import register, TranslationOptions -from signup.models import Event, Registration +from signup.models import Event, Signup, SignupForm, TemplateQuestion + @register(Event) class EventTranslationOptions(TranslationOptions): @@ -10,8 +11,22 @@ class EventTranslationOptions(TranslationOptions): fields = () -@register(Registration) -class RegistrationTranslationOptions(TranslationOptions): +@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 = () diff --git a/signup/urls.py b/signup/urls.py index a3bad51..8dc4e8d 100644 --- a/signup/urls.py +++ b/signup/urls.py @@ -4,7 +4,7 @@ from django.conf.urls import url from django.conf import settings from django.utils.translation import ugettext_lazy as _ -# from kaehmy.views import view +from signup.views import new_signup # , open_signups # from kaehmy.views import list_view # from kaehmy.views import submit # from kaehmy.views import comment @@ -12,8 +12,10 @@ from django.utils.translation import ugettext_lazy as _ # from kaehmy.views import export_view urlpatterns = [ - # kaehmy - # url(r'^new', new_form), + # signup + # url(r'^$', open_signups), + # url(r'^list$', open_signups), + url(r'^(?P\d+)$', new_signup), # url(r'^$', list_view), # url(r'^submit', submit), # url(r'^statistics', statistics_view), diff --git a/signup/views.py b/signup/views.py index 91ea44a..50d8d05 100644 --- a/signup/views.py +++ b/signup/views.py @@ -1,3 +1,9 @@ from django.shortcuts import render +from django.views.decorators.http import require_http_methods +from django.views.decorators.csrf import ensure_csrf_cookie +from members.views.utils import * +from signup.models import SignupForm -# Create your views here. + +def new_signup(request, *args, **kwargs): + pass diff --git a/sikweb/urls.py b/sikweb/urls.py index 065a7a3..5efc4d9 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -27,6 +27,7 @@ import infoscreen.urls import members.urls import coffee_scale.urls import password_reset.urls +import signup.urls urlpatterns = [ url(r'', include('webapp.urls')), @@ -35,6 +36,7 @@ urlpatterns = [ url(r'^coffee/', include('coffee_scale.urls')), url(r'^kaehmy/', include('kaehmy.urls')), url(r'^ohlhafv/', include('ohlhafv.urls')), + url(r'^signup/', include('signup.urls')), # admin url(r'^admin/', admin.site.urls), diff --git a/webapp/admin.py b/webapp/admin.py index a479aa2..5d84858 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -3,7 +3,6 @@ from django.contrib import admin from webapp.models import Official, Role, Committee from webapp.models import Feed, Tag, BaseFeed -from signup.models import Event, Registration from modeltranslation.admin import TranslationAdmin from django.contrib.auth.models import Permission # this is needed so that the models get registered for translation @@ -13,8 +12,6 @@ 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(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/models.py b/webapp/models.py index 2e6a6ec..1447d30 100644 --- a/webapp/models.py +++ b/webapp/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 From c31f454c78b1f11f8f39f3bf6b4425d82adc0cb2 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 5 Jul 2018 18:58:33 +0300 Subject: [PATCH 3/6] Move signup models back to webapp --- signup/README.md | 49 ------------ signup/__init__.py | 0 signup/admin.py | 11 --- signup/apps.py | 5 -- signup/migrations/0002_auto_20180619_2020.py | 62 --------------- signup/migrations/0003_auto_20180619_2023.py | 28 ------- signup/migrations/__init__.py | 0 signup/models.py | 74 ------------------ signup/tests.py | 3 - signup/translation.py | 32 -------- signup/urls.py | 27 ------- signup/views.py | 9 --- sikweb/base.py | 1 - sikweb/urls.py | 2 - webapp/admin.py | 6 +- .../migrations/0044_auto_20180705_1851.py | 53 +++++-------- webapp/models.py | 78 +++++++++++++++++++ webapp/translation.py | 31 +++++++- 18 files changed, 134 insertions(+), 337 deletions(-) delete mode 100644 signup/README.md delete mode 100644 signup/__init__.py delete mode 100644 signup/admin.py delete mode 100644 signup/apps.py delete mode 100644 signup/migrations/0002_auto_20180619_2020.py delete mode 100644 signup/migrations/0003_auto_20180619_2023.py delete mode 100644 signup/migrations/__init__.py delete mode 100644 signup/models.py delete mode 100644 signup/tests.py delete mode 100644 signup/translation.py delete mode 100644 signup/urls.py delete mode 100644 signup/views.py rename signup/migrations/0001_initial.py => webapp/migrations/0044_auto_20180705_1851.py (62%) diff --git a/signup/README.md b/signup/README.md deleted file mode 100644 index 686d79f..0000000 --- a/signup/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Ilmotunkki - -## Terms -- Signup, Form with collection of questions -- Response, One answer to some signup -- Quota, Amount of people allowed to respond with some option selected. - - In generic case there is no option and quota is just max number of people. - -## Requirements - -- Officials may generate signups forms -- Officials may see results from signups -- Officials may see some stats from their signups - - for example distributions of multiple choice answers -- Officials should be able to edit signups wherever possible - - Propably not possible to edit after first response -- Officials should be able to delete responses -- Officials should be able to embed payment information to the signup? - - TODO: is there need for unique reference numbers for every response? -- Officials should be able to save a signup to a reusable template. - - Possibility to save templates? - -- Signup may be attached to an event - - Multiple signups to a single event should be possible (FTMK uses for museum visits? Erna asked if it was possible in old web) - - Possibility for external service (Google Form, URL will suffice) - -- Signup should support custom quotas - - Atleast quotas from multiple choices and checkboxes - - Text quotas are risky (typos everywhere!!) -- Signup should have start and end times -- Signup should support atleast following questiontypes - - Text - - multiple choice (select one) - - checkbox (boolean yes/no) - -- Signup should support reserve slots. - - TODO: quota based reserves or generic? or both? - -- Responding should send confirm email -- Response should be editable by responder and only by the responder until the closing of the signup - - TODO: is there need to custom edit period or disable? - -- Responders should see amount of quotas left. -- Responders should see some information about other responses - - TODO: names? should this be editable by officials? - - Or superadmin can edit and the one signing up within edit period - - NOTE: Quota related info is exposed if any info is printed - - When quotas need to be hidden? PoTa? - diff --git a/signup/__init__.py b/signup/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/signup/admin.py b/signup/admin.py deleted file mode 100644 index ad64a0e..0000000 --- a/signup/admin.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.contrib import admin -from signup.models import 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 -import webapp.translation - -admin.site.register(Event, TranslationAdmin) -admin.site.register(SignupForm, TranslationAdmin) -admin.site.register(Signup, TranslationAdmin) -admin.site.register(TemplateQuestion, TranslationAdmin) diff --git a/signup/apps.py b/signup/apps.py deleted file mode 100644 index a27ecbf..0000000 --- a/signup/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class SignupConfig(AppConfig): - name = 'Sign-up' diff --git a/signup/migrations/0002_auto_20180619_2020.py b/signup/migrations/0002_auto_20180619_2020.py deleted file mode 100644 index 2fbedd3..0000000 --- a/signup/migrations/0002_auto_20180619_2020.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-06-19 17:20 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('signup', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='answer', - options={'verbose_name': 'Sign-up answer', 'verbose_name_plural': 'Sign-up answers'}, - ), - migrations.AlterModelOptions( - name='signup', - options={'verbose_name': 'Sign-up', 'verbose_name_plural': 'Sign-ups'}, - ), - migrations.AlterModelOptions( - name='templatequestion', - options={'verbose_name': 'Template question', 'verbose_name_plural': 'Template questions'}, - ), - migrations.RenameField( - model_name='templatequestion', - old_name='questions', - new_name='question', - ), - migrations.RemoveField( - model_name='signupform', - name='questions', - ), - migrations.AddField( - model_name='signupform', - name='question', - field=models.CharField(default='', max_length=255), - preserve_default=False, - ), - migrations.AddField( - model_name='templatequestion', - name='name', - field=models.CharField(default='', max_length=255), - preserve_default=False, - ), - migrations.AlterField( - model_name='signupform', - name='end', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.AlterField( - model_name='signupform', - name='start', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.DeleteModel( - name='Question', - ), - ] diff --git a/signup/migrations/0003_auto_20180619_2023.py b/signup/migrations/0003_auto_20180619_2023.py deleted file mode 100644 index 48535f2..0000000 --- a/signup/migrations/0003_auto_20180619_2023.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-06-19 17:23 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('signup', '0002_auto_20180619_2020'), - ] - - operations = [ - migrations.RemoveField( - model_name='answer', - name='signup', - ), - migrations.AddField( - model_name='signup', - name='answer', - field=models.CharField(default='', max_length=255), - preserve_default=False, - ), - migrations.DeleteModel( - name='Answer', - ), - ] diff --git a/signup/migrations/__init__.py b/signup/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/signup/models.py b/signup/models.py deleted file mode 100644 index 614c769..0000000 --- a/signup/models.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Signup and Event models.""" -from django.db import models -from django.utils import timezone -from webapp.models import Tag, BaseFeed -from webapp.utils import month_from_now -from django.utils.translation import ugettext_lazy as _ -from auditlog.registry import auditlog -from phonenumber_field.modelfields import PhoneNumberField -from django.contrib.postgres.fields import JSONField - -import logging - - -VERBOSE_NAME = _('Webapp') - - -class Event(BaseFeed): - """Model for event.""" - - start = models.DateTimeField(default=timezone.now) - end = models.DateTimeField(default=timezone.now) - signupForm = models.ManyToManyField( - 'SignupForm', blank=True) - - def __str__(self): - return _('Event: {}').format(self.title) - - class Meta: - verbose_name = _('Event') - verbose_name_plural = _('Events') - - -class TemplateQuestion(models.Model): - """Stores template questions for signup forms as JSONB""" - # question = JSONField() - name = models.CharField(max_length=255) - question = models.CharField(max_length=255) - - def __str__(self): - return _('Template questions: {}').format(self.name) - - class Meta: - 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() - question = 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') - - -auditlog.register(Event) -auditlog.register(Signup) diff --git a/signup/tests.py b/signup/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/signup/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/signup/translation.py b/signup/translation.py deleted file mode 100644 index 47b7a1f..0000000 --- a/signup/translation.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Translation classes.""" - -from modeltranslation.translator import register, TranslationOptions -from signup.models import Event, Signup, SignupForm, TemplateQuestion - - -@register(Event) -class EventTranslationOptions(TranslationOptions): - """Class for event translation options.""" - - fields = () - - -@register(Signup) -class SignupTranslationOptions(TranslationOptions): - """Class for registration translation options.""" - - fields = () - - -@register(SignupForm) -class SignupFormTranslationOptions(TranslationOptions): - """Class for registration translation options.""" - - fields = () - - -@register(TemplateQuestion) -class TemplateQuestionTranslationOptions(TranslationOptions): - """Class for registration translation options.""" - - fields = () diff --git a/signup/urls.py b/signup/urls.py deleted file mode 100644 index 8dc4e8d..0000000 --- a/signup/urls.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Signup urls.""" - -from django.conf.urls import url -from django.conf import settings -from django.utils.translation import ugettext_lazy as _ - -from signup.views import new_signup # , open_signups -# from kaehmy.views import list_view -# from kaehmy.views import submit -# from kaehmy.views import comment -# from kaehmy.views import statistics_view -# from kaehmy.views import export_view - -urlpatterns = [ - # signup - # url(r'^$', open_signups), - # url(r'^list$', open_signups), - url(r'^(?P\d+)$', new_signup), - # url(r'^$', list_view), - # url(r'^submit', submit), - # url(r'^statistics', statistics_view), - # url(r'^export', export_view), -] - -if settings.DEBUG: - from django.contrib.staticfiles.urls import staticfiles_urlpatterns - urlpatterns += staticfiles_urlpatterns() diff --git a/signup/views.py b/signup/views.py deleted file mode 100644 index 50d8d05..0000000 --- a/signup/views.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.shortcuts import render -from django.views.decorators.http import require_http_methods -from django.views.decorators.csrf import ensure_csrf_cookie -from members.views.utils import * -from signup.models import SignupForm - - -def new_signup(request, *args, **kwargs): - pass diff --git a/sikweb/base.py b/sikweb/base.py index cbe3824..94ef3eb 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -92,7 +92,6 @@ INSTALLED_APPS = [ 'webapp', 'members', 'infoscreen', - 'signup', 'coffee_scale', 'kaehmy', 'ohlhafv', diff --git a/sikweb/urls.py b/sikweb/urls.py index 5efc4d9..065a7a3 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -27,7 +27,6 @@ import infoscreen.urls import members.urls import coffee_scale.urls import password_reset.urls -import signup.urls urlpatterns = [ url(r'', include('webapp.urls')), @@ -36,7 +35,6 @@ urlpatterns = [ url(r'^coffee/', include('coffee_scale.urls')), url(r'^kaehmy/', include('kaehmy.urls')), url(r'^ohlhafv/', include('ohlhafv.urls')), - url(r'^signup/', include('signup.urls')), # admin url(r'^admin/', admin.site.urls), diff --git a/webapp/admin.py b/webapp/admin.py index 5d84858..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 +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 @@ -12,6 +12,10 @@ admin.site.register(Permission) admin.site.register(Feed, TranslationAdmin) admin.site.register(Tag, TranslationAdmin) +admin.site.register(Event, 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/signup/migrations/0001_initial.py b/webapp/migrations/0044_auto_20180705_1851.py similarity index 62% rename from signup/migrations/0001_initial.py rename to webapp/migrations/0044_auto_20180705_1851.py index 57a2e33..7b43419 100644 --- a/signup/migrations/0001_initial.py +++ b/webapp/migrations/0044_auto_20180705_1851.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-06-19 17:09 +# Generated by Django 1.11 on 2018-07-05 15:51 from __future__ import unicode_literals from django.db import migrations, models @@ -9,26 +9,17 @@ import django.utils.timezone class Migration(migrations.Migration): - initial = True - dependencies = [ ('webapp', '0043_auto_20180605_1953'), ] operations = [ - migrations.CreateModel( - name='Answer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('answer', models.CharField(max_length=255)), - ], - ), 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', models.DateTimeField(default=django.utils.timezone.now)), - ('end', models.DateTimeField(default=django.utils.timezone.now)), + ('start_time', models.DateTimeField(default=django.utils.timezone.now)), + ('end_time', models.DateTimeField(default=django.utils.timezone.now)), ], options={ 'verbose_name': 'Event', @@ -36,53 +27,51 @@ class Migration(migrations.Migration): }, bases=('webapp.basefeed',), ), - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('questions', models.CharField(max_length=255)), - ], - ), 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()), - ('end', models.DateTimeField()), - ('questions', models.ManyToManyField(to='signup.Question')), + ('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': 'SignupForm', - 'verbose_name_plural': 'SignupForm', + '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')), - ('questions', models.CharField(max_length=255)), + ('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='signup.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='signup.SignupForm'), - ), - migrations.AddField( - model_name='answer', - name='signup', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='signup.Signup'), + field=models.ManyToManyField(blank=True, to='webapp.SignupForm'), ), ] diff --git a/webapp/models.py b/webapp/models.py index 1447d30..ead39ba 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -9,6 +9,7 @@ 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 @@ -55,11 +56,86 @@ class Feed(BaseFeed): verbose_name_plural = _('Feeds') +class Event(BaseFeed): + """Model for event.""" + + start_time = models.DateTimeField(default=timezone.now) + end_time = models.DateTimeField(default=timezone.now) + signupForm = models.ManyToManyField( + 'SignupForm', blank=True) + + def __str__(self): + return _('Event: {}').format(self.title) + + class Meta: + verbose_name = _('Event') + verbose_name_plural = _('Events') + + +class TemplateQuestion(models.Model): + """Stores template questions for signup forms as JSONB""" + # question = JSONField() + name = models.CharField(max_length=255) + question = models.CharField(max_length=255) + + def __str__(self): + return _('Template questions: {}').format(self.name) + + class Meta: + 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() + question = 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')), + # ) + name = models.CharField(_('Name'), max_length=255) is_board = models.BooleanField(_('Board member')) + # category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255) def __str__(self): n = self.name.capitalize() @@ -131,6 +207,8 @@ 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/translation.py b/webapp/translation.py index 0959e03..88b2089 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 +from webapp.models import BaseFeed, Feed, Tag, Event, Signup, SignupForm, TemplateQuestion from webapp.models import PresetRole, BaseRole @@ -26,6 +26,35 @@ class TagTranslationOptions(TranslationOptions): fields = ('name',) +@register(Event) +class EventTranslationOptions(TranslationOptions): + """Class for event translation options.""" + + fields = () + + +@register(Signup) +class SignupTranslationOptions(TranslationOptions): + """Class for registration translation options.""" + + 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) class BaseRoleTranslationOptions(TranslationOptions): """Class for base role translation options""" From c66c8e73675d02be7838ac5ffdba8b5e95ff90fa Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 10 Jul 2018 22:25:11 +0300 Subject: [PATCH 4/6] Rest framework for Event and SignupForm --- sikweb/base.py | 3 +- webapp/migrations/0045_auto_20180710_1901.py | 20 +++++ webapp/migrations/0046_auto_20180710_2041.py | 26 ++++++ webapp/migrations/0047_auto_20180710_2110.py | 24 ++++++ webapp/models.py | 11 ++- webapp/serializers.py | 42 +++++++++ webapp/translation.py | 1 - webapp/urls.py | 89 +++++++++++++------- webapp/views.py | 48 +++++++++-- 9 files changed, 215 insertions(+), 49 deletions(-) create mode 100644 webapp/migrations/0045_auto_20180710_1901.py create mode 100644 webapp/migrations/0046_auto_20180710_2041.py create mode 100644 webapp/migrations/0047_auto_20180710_2110.py create mode 100644 webapp/serializers.py diff --git a/sikweb/base.py b/sikweb/base.py index 94ef3eb..2b590dd 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -220,7 +220,8 @@ REST_FRAMEWORK = { 'rest_framework.permissions.IsAdminUser', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.TokenAuthentication', + 'rest_framework.authentication.SessionAuthentication', + 'rest_framework.authentication.BasicAuthentication', ), 'DEFAULT_THROTTLE_CLASSES': ( 'members.throttles.BurstRateThrottle', 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 ead39ba..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') @@ -92,7 +92,7 @@ class SignupForm(models.Model): start = models.DateTimeField(default=timezone.now) end = models.DateTimeField(default=timezone.now) # question = JSONField() - question = models.CharField(max_length=255) + questions = models.CharField(max_length=255) class Meta: verbose_name = _('Signup form') @@ -112,7 +112,6 @@ class Signup(models.Model): verbose_name_plural = _('Sign-ups') - class BaseRole(models.Model): """Base model for occupations/roles.""" diff --git a/webapp/serializers.py b/webapp/serializers.py new file mode 100644 index 0000000..d1f3cb8 --- /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.HyperlinkedModelSerializer): + 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 88b2089..73713ca 100644 --- a/webapp/translation.py +++ b/webapp/translation.py @@ -54,7 +54,6 @@ class TemplateQuestionTranslationOptions(TranslationOptions): fields = () - @register(BaseRole) class BaseRoleTranslationOptions(TranslationOptions): """Class for base role translation options""" 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): From efde69984d0345bbd3d5e9192843390b9de4f2be Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 10 Jul 2018 22:42:05 +0300 Subject: [PATCH 5/6] Revert changes to base.py --- sikweb/base.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sikweb/base.py b/sikweb/base.py index 2b590dd..94ef3eb 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -220,8 +220,7 @@ REST_FRAMEWORK = { 'rest_framework.permissions.IsAdminUser', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.SessionAuthentication', - 'rest_framework.authentication.BasicAuthentication', + 'rest_framework.authentication.TokenAuthentication', ), 'DEFAULT_THROTTLE_CLASSES': ( 'members.throttles.BurstRateThrottle', From 129b8e4601908a40ffc2ef097f323354b62d7a84 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 10 Jul 2018 22:42:37 +0300 Subject: [PATCH 6/6] Use id instead of url for SignUpSerializer --- webapp/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/serializers.py b/webapp/serializers.py index d1f3cb8..1e9745f 100644 --- a/webapp/serializers.py +++ b/webapp/serializers.py @@ -31,7 +31,7 @@ class EventSerializer(serializers.HyperlinkedModelSerializer): return event -class SignupSerializer(serializers.HyperlinkedModelSerializer): +class SignupSerializer(serializers.ModelSerializer): class Meta: model = Signup fields = ('id', 'signupForm', 'answer')