From 780e2d6acbe7a0f1f944dcf2df5af5f8b86867a3 Mon Sep 17 00:00:00 2001 From: Elias Date: Thu, 1 Mar 2018 19:28:27 +0200 Subject: [PATCH 01/18] Committee model --- webapp/models.py | 7 ++++++- webapp/templates/contact.html | 31 +++++++++++++++++++++++++++---- webapp/views.py | 6 ++++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/webapp/models.py b/webapp/models.py index c6cea6b..c2bf792 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -236,6 +236,11 @@ class KaehmyForm(MessageParent): return self.preset_roles.filter(is_board=True).exists() or self.custom_roles.filter(is_board=True) +class Committee(models.Model): + """ Committee model, has many Roles found under variable roles """ + name = models.CharField(max_length=255) + + class Role(PresetRole): """ Model for Role. @@ -253,7 +258,7 @@ class Role(PresetRole): start_date = models.DateField(_('Start date')) end_date = models.DateField(_('End date')) official = models.ForeignKey('Official', related_name='roles') - + committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, blank=True) class Official(User): """Model representing a guild official.""" diff --git a/webapp/templates/contact.html b/webapp/templates/contact.html index a7643c3..320ce45 100644 --- a/webapp/templates/contact.html +++ b/webapp/templates/contact.html @@ -5,10 +5,33 @@
-
-
+

{% trans "Contact" %}

+ {% if roolit %} + {% load static %} +

Kaikki toimihenkilöt

+ + {% for rooli in roolit %} + + + + + {% endfor %} +
+ + + +

{{rooli}} +

{{ rooli.official.first_name }} {{ rooli.official.last_name }}

+ {{ rooli.official.email }} + {{ rooli.official.phone_number }} +

+
+ {% else%} +

Ei rooleja

+ {% endif %} {% if kaikki %} {% for teekkari in kaikki %} @@ -29,8 +52,8 @@

Ei henkilöitä

{% endif %} - - + diff --git a/webapp/views.py b/webapp/views.py index 64915ad..f21c057 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -13,7 +13,7 @@ import logging import requests from dealer.git import git -from webapp.models import PresetKaehmyRole, CustomKaehmyRole, Official +from webapp.models import PresetKaehmyRole, CustomKaehmyRole, Official, Role from webapp.models import OhlhafvChallenge, KaehmyForm, TelegramChannel from webapp.forms import OhlhafvForm, KaehmyForm_Form, KaehmyCommentForm from webapp.tables import OhlhafvTable, KaehmyExportTable @@ -146,7 +146,9 @@ def contact_view(request, *args, **kwargs): """Render "Contact" page.""" kaikki = Official.objects.all() - context = {"kaikki": kaikki} + roolit = Role.objects.all() + + context = {"roolit": roolit, "kaikki": kaikki} return render(request, "contact.html", context) From 7bc277a97883a514ac1fa0eb62f7f54dab216255 Mon Sep 17 00:00:00 2001 From: Elias Date: Thu, 1 Mar 2018 20:53:31 +0200 Subject: [PATCH 02/18] korjauksia --- webapp/admin.py | 3 +- webapp/migrations/0036_auto_20180301_2011.py | 28 ++++++++++++ webapp/models.py | 9 +++- webapp/templates/contact.html | 46 ++++++++++---------- webapp/views.py | 30 +++++++++++-- 5 files changed, 85 insertions(+), 31 deletions(-) create mode 100644 webapp/migrations/0036_auto_20180301_2011.py diff --git a/webapp/admin.py b/webapp/admin.py index 0cfeb8c..3297a3c 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -1,7 +1,7 @@ """File containing webapp app admin registers.""" from django.contrib import admin -from webapp.models import Official, Role +from webapp.models import Official, Role, Committee from webapp.models import Feed, Tag, BaseFeed, Event, Registration from webapp.models import KaehmyForm, KaehmyMessage from webapp.models import CustomKaehmyRole, PresetKaehmyRole @@ -19,6 +19,7 @@ admin.site.register(Event, TranslationAdmin) admin.site.register(Registration, TranslationAdmin) admin.site.register(Official) admin.site.register(Role) +admin.site.register(Committee) admin.site.register(KaehmyForm) admin.site.register(KaehmyMessage) admin.site.register(CustomKaehmyRole) diff --git a/webapp/migrations/0036_auto_20180301_2011.py b/webapp/migrations/0036_auto_20180301_2011.py new file mode 100644 index 0000000..073a964 --- /dev/null +++ b/webapp/migrations/0036_auto_20180301_2011.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-03-01 18:11 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0035_auto_20171019_1413'), + ] + + operations = [ + migrations.CreateModel( + name='Committee', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + ), + migrations.AddField( + model_name='role', + name='committee', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index c2bf792..3010192 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -237,7 +237,12 @@ class KaehmyForm(MessageParent): class Committee(models.Model): - """ Committee model, has many Roles found under variable roles """ + """ + Committee model + + Has many Roles found under variable roles + """ + name = models.CharField(max_length=255) @@ -258,7 +263,7 @@ class Role(PresetRole): start_date = models.DateField(_('Start date')) end_date = models.DateField(_('End date')) official = models.ForeignKey('Official', related_name='roles') - committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, blank=True) + committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, null=True) class Official(User): """Model representing a guild official.""" diff --git a/webapp/templates/contact.html b/webapp/templates/contact.html index 320ce45..c400a99 100644 --- a/webapp/templates/contact.html +++ b/webapp/templates/contact.html @@ -9,21 +9,21 @@
-->

{% trans "Contact" %}

- {% if roolit %} + {% if all_roles %} {% load static %} -

Kaikki toimihenkilöt

+

Kaikki Roolit

- {% for rooli in roolit %} + {% for role in all_roles %} @@ -32,24 +32,22 @@ {% else%}

Ei rooleja

{% endif %} - {% if kaikki %} -
-

{{rooli}} -

{{ rooli.official.first_name }} {{ rooli.official.last_name }}

- {{ rooli.official.email }} - {{ rooli.official.phone_number }} +

{{role}} +

{{ role.official.first_name }} {{ rooli.official.last_name }}

+ {{ role.official.email }} + {{ role.official.phone_number }}

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

Kaikki Toimikunnat

+ {% for com in all_committees %} +

{{committee.name}}

+ {% if roles_list %} + {% for role in roles_list %} +

{{role.name}}

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

Ei ole rooleja tällä toimikunnalla

+ {% endif %} {% endfor %} -
- - -

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

- -

{{ teekkari.phone_number }}

-
- {% else %} -

Ei henkilöitä

+ {% else%} +

Ei Toimikuntia

{% endif %}
-

{% trans "Contact" %}

-
- {% if all_roles %} - {% load static %} -

Kaikki Roolit

- - {% for role in all_roles %} - - - - - {% endfor %} -
- + {% load static %} + +

{% trans "Contact" %}

+ + {% if committee_list %} + + {% for com in committee_list %} + + +

{{ com.committee.name }}

+ + + {% if com.roles_list %} + {% for role in com.roles_list %} +
+
+
-
-

{{role}} -

{{ role.official.first_name }} {{ rooli.official.last_name }}

- {{ role.official.email }} - {{ role.official.phone_number }} -

-
- {% else%} -

Ei rooleja

- {% endif %} - - {% if all_committees %} - {% load static %} -

Kaikki Toimikunnat

- {% for com in all_committees %} -

{{committee.name}}

- {% if roles_list %} - {% for role in roles_list %} -

{{role.name}}

- {% endfor %} - {% else %} -

Ei ole rooleja tällä toimikunnalla

- {% endif %} - {% endfor %} - {% else%} -

Ei Toimikuntia

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

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

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

Ei Toimikuntia

+ {% endif %} {% endblock %} diff --git a/webapp/views.py b/webapp/views.py index 9107645..6112a36 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -145,8 +145,6 @@ def sosso_view(request, *args, **kwargs): def contact_view(request, *args, **kwargs): """Render "Contact" page.""" - # TODO - # # Lajitellaan roolit toimikunnittain # in format: context = { # committee_list: [ @@ -162,15 +160,14 @@ def contact_view(request, *args, **kwargs): # ]} # - #all_officials = Official.objects.all() all_roles = Role.objects.all() - all_committees = Committee.objects.all() + all_committees = Committee.objects.order_by('name') committee_list = [] for committee in all_committees: - committee_list.append({"committee":committee, "roles_list":committee.roles}) + committee_list.append({"committee":committee, "roles_list":committee.roles.all()}) - context = {"all_roles": all_roles, "all_committees": committee_list} + context = {"all_roles": all_roles, "committee_list": committee_list} return render(request, "contact.html", context) From b95be670514abd293ce0f2d063e1c0288fc1461c Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 20:24:16 +0300 Subject: [PATCH 04/18] Fix pycodestyle --- members/tables.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/members/tables.py b/members/tables.py index a70aff6..4c6fd2d 100644 --- a/members/tables.py +++ b/members/tables.py @@ -15,10 +15,7 @@ class MemberTable(tables.Table): options = tables.TemplateColumn( ('') + - _('Edit') + - '', - verbose_name="" + 'href="/members/edit/{{ record.id }}">') + _('Edit') + '', verbose_name="" ) class Meta: @@ -45,9 +42,7 @@ class PaymentTable(tables.Table): options = tables.TemplateColumn( ('') + - _('Edit') + - '', + 'href="/members/edit_payment/{{ record.id }}">') + _('Edit') + '', verbose_name="" ) @@ -62,9 +57,7 @@ class RequestTable(tables.Table): options = tables.TemplateColumn( ('') + - _('Edit') + - '', + 'href="/members/edit_application/{{ record.id }}">') + _('Edit') + '', verbose_name="" ) From ab6b7d19fb04e9522cbfaae6cc4147ea61a59383 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 21:24:36 +0300 Subject: [PATCH 05/18] Update pyexcel --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index dcacff6..bf70437 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ six==1.10.0 django-suit==0.2.25 telepot==12.3 django-password-reset==1.0 -pyexcel==0.5.7 +pyexcel==0.5.8 pyexcel-xlsx==0.5.5 django-import-export==0.7.0 openpyxl==2.4.11 From 9e0d911f7b01d21d73603fff970fa91e2c5a585c Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 22:16:40 +0300 Subject: [PATCH 06/18] Fix date rendering --- members/tables.py | 5 +++-- members/templates/error.html | 18 ------------------ templates/error.html | 2 +- 3 files changed, 4 insertions(+), 21 deletions(-) delete mode 100644 members/templates/error.html diff --git a/members/tables.py b/members/tables.py index 4c6fd2d..a8f65e0 100644 --- a/members/tables.py +++ b/members/tables.py @@ -4,6 +4,7 @@ import django_tables2 as tables from django.utils.translation import ugettext as _ from django.core.exceptions import ObjectDoesNotExist from django.db.models import F, OuterRef, Subquery +from django.utils import timezone from members.models import Member, Payment, Request @@ -25,9 +26,9 @@ class MemberTable(tables.Table): def render_last_paid(self, record): try: - return record.payments.filter(member=record).latest('date').date.strftime('%e.%m.%Y %H:%M') + return timezone.localtime(record.payments.filter(member=record).latest('date').date).strftime('%-d.%-m.%Y %H:%M') except ObjectDoesNotExist: - return record.created.strftime('%e.%m.%Y %H:%M') + _(" (not paid)") + return timezone.localtime(record.created).strftime('%-d.%-m.%Y %H:%M') + _(" (not paid)") def order_last_paid(self, queryset, is_descending): latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') diff --git a/members/templates/error.html b/members/templates/error.html deleted file mode 100644 index 3d09501..0000000 --- a/members/templates/error.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "members:base.html" %} - -{% load static %} -{% load i18n %} -{% block content %} -
-
-

{% trans "Error" %}

-
- -
- {{ error|safe }} -
-
- -
-
-{% endblock content %} diff --git a/templates/error.html b/templates/error.html index 745eb56..3d09501 100644 --- a/templates/error.html +++ b/templates/error.html @@ -1,4 +1,4 @@ -{% extends "members_base.html" %} +{% extends "members:base.html" %} {% load static %} {% load i18n %} From 882732d0544bf40cc79f4ab093a4d643459f8a21 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Sun, 13 May 2018 12:59:50 +0300 Subject: [PATCH 07/18] Show number of paid members in member list Member filtering also applies to this feature. Moved 'last_paid' Subquery to Member method --- members/models.py | 9 +++++++-- members/tables.py | 3 +-- members/templates/member_list.html | 2 +- members/views/members.py | 4 ++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/members/models.py b/members/models.py index ff023b1..986c9d5 100644 --- a/members/models.py +++ b/members/models.py @@ -3,8 +3,7 @@ from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from django.db.models import Q - +from django.db.models import Q, F, OuterRef, Subquery import csv @@ -126,5 +125,11 @@ class Member(BaseMember): return qs + def get_members_with_latest_payment(members_query): + """Return QuerySet of given members QS with last_paid attribute.""" + latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') + return members_query.annotate(last_paid=Subquery(latest.values('date')[:1])) + + # To avoid problems with a cyclical import, this is at the bottom of the file from members.forms import MemberForm # nopep8 diff --git a/members/tables.py b/members/tables.py index a8f65e0..89ecca1 100644 --- a/members/tables.py +++ b/members/tables.py @@ -31,8 +31,7 @@ class MemberTable(tables.Table): return timezone.localtime(record.created).strftime('%-d.%-m.%Y %H:%M') + _(" (not paid)") def order_last_paid(self, queryset, is_descending): - latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') - queryset = queryset.annotate(last_paid=Subquery(latest.values('date')[:1])).order_by(('-' if is_descending else '') + 'last_paid') + queryset = Member.get_members_with_latest_payment(queryset).order_by(('-' if is_descending else '') + 'last_paid') return (queryset, True) diff --git a/members/templates/member_list.html b/members/templates/member_list.html index 8b65bb6..6952362 100644 --- a/members/templates/member_list.html +++ b/members/templates/member_list.html @@ -18,7 +18,7 @@ {% endif %}
- {% trans "Members in register:" %} {{ member_count }} + {% trans "Members in register:" %} {{ member_count }} ({{ paid_count }})
diff --git a/members/views/members.py b/members/views/members.py index 4ae9a6b..3589c52 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -7,6 +7,7 @@ from django.http import HttpResponse, HttpResponseRedirect, JsonResponse, HttpRe from django.core.mail import send_mail from django.conf import settings from django.utils.translation import ugettext as _ +from django.utils import timezone from django.forms.models import model_to_dict from dal import autocomplete @@ -44,9 +45,12 @@ def member_list(request, *args, **kwargs): table.paginate(page=request.GET.get('page', 1), per_page=25) table_html = convert_table_to_html(table, request) + + queryset = Member.get_members_with_latest_payment(members) context = { 'table': table_html, 'member_count': len(members), + 'paid_count': len(queryset.exclude(last_paid = None)), 'notification': request.GET.get('notification', None), } return render(request, 'member_list.html', context) From 7aff7c46ee47ef02e4015830845cf85adfd6f718 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Sun, 13 May 2018 13:06:19 +0300 Subject: [PATCH 08/18] Fix pycodestyle --- members/models.py | 1 - members/views/members.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/members/models.py b/members/models.py index 986c9d5..64856ba 100644 --- a/members/models.py +++ b/members/models.py @@ -124,7 +124,6 @@ class Member(BaseMember): qs = qs.filter(Q(first_name__icontains=term) | Q(last_name__icontains=term)) return qs - def get_members_with_latest_payment(members_query): """Return QuerySet of given members QS with last_paid attribute.""" latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') diff --git a/members/views/members.py b/members/views/members.py index 3589c52..00a2122 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -50,7 +50,7 @@ def member_list(request, *args, **kwargs): context = { 'table': table_html, 'member_count': len(members), - 'paid_count': len(queryset.exclude(last_paid = None)), + 'paid_count': len(queryset.exclude(last_paid=None)), 'notification': request.GET.get('notification', None), } return render(request, 'member_list.html', context) From 9225ff59671be449684f5815eb0ca1c44a0c5412 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Mon, 14 May 2018 01:36:11 +0300 Subject: [PATCH 09/18] Filter paid member fees by date --- members/views/members.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/members/views/members.py b/members/views/members.py index 00a2122..376351a 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -10,8 +10,10 @@ from django.utils.translation import ugettext as _ from django.utils import timezone from django.forms.models import model_to_dict from dal import autocomplete +from django.utils import timezone import logging +import datetime import html from rest_framework.views import APIView @@ -47,10 +49,18 @@ def member_list(request, *args, **kwargs): table_html = convert_table_to_html(table, request) queryset = Member.get_members_with_latest_payment(members) + # Member fee is valid from 1.9.-31.8. + f_day = 1 + f_month = 9 + now = timezone.now() + if (now.month >= f_month): + filter_date = datetime.date(now.year, f_month, f_day) + else: + filter_date = datetime.date(now.year - 1, f_month, f_day) context = { 'table': table_html, 'member_count': len(members), - 'paid_count': len(queryset.exclude(last_paid=None)), + 'paid_count': len(queryset.filter(last_paid__gte=filter_date)), 'notification': request.GET.get('notification', None), } return render(request, 'member_list.html', context) From 6e68e106aa857641739883db979d4b11bbb5f11c Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 16 May 2018 22:39:43 +0300 Subject: [PATCH 10/18] Update contact models and template --- webapp/migrations/0038_auto_20180516_2108.py | 34 +++++++++++++ webapp/migrations/0039_auto_20180516_2113.py | 39 +++++++++++++++ webapp/migrations/0040_auto_20180516_2124.py | 24 +++++++++ webapp/migrations/0041_auto_20180516_2204.py | 20 ++++++++ webapp/models.py | 51 +++++++++++--------- webapp/templates/contact.html | 29 +++++------ webapp/views.py | 28 ++--------- 7 files changed, 163 insertions(+), 62 deletions(-) create mode 100644 webapp/migrations/0038_auto_20180516_2108.py create mode 100644 webapp/migrations/0039_auto_20180516_2113.py create mode 100644 webapp/migrations/0040_auto_20180516_2124.py create mode 100644 webapp/migrations/0041_auto_20180516_2204.py diff --git a/webapp/migrations/0038_auto_20180516_2108.py b/webapp/migrations/0038_auto_20180516_2108.py new file mode 100644 index 0000000..b58445c --- /dev/null +++ b/webapp/migrations/0038_auto_20180516_2108.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-05-16 18:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0037_auto_20180301_2111'), + ] + + operations = [ + migrations.RemoveField( + model_name='baserole', + name='category', + ), + migrations.RemoveField( + model_name='role', + name='committee', + ), + migrations.AddField( + model_name='official', + name='committee', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'), + ), + migrations.AlterField( + model_name='role', + name='official', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='webapp.Official'), + ), + ] diff --git a/webapp/migrations/0039_auto_20180516_2113.py b/webapp/migrations/0039_auto_20180516_2113.py new file mode 100644 index 0000000..3fd2671 --- /dev/null +++ b/webapp/migrations/0039_auto_20180516_2113.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-05-16 18:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0038_auto_20180516_2108'), + ] + + operations = [ + migrations.RemoveField( + model_name='official', + name='committee', + ), + migrations.RemoveField( + model_name='role', + name='official', + ), + migrations.AddField( + model_name='official', + name='role', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Role'), + ), + migrations.AddField( + model_name='role', + name='committee', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'), + ), + migrations.AlterField( + model_name='committee', + name='name', + field=models.CharField(max_length=255, verbose_name='Name'), + ), + ] diff --git a/webapp/migrations/0040_auto_20180516_2124.py b/webapp/migrations/0040_auto_20180516_2124.py new file mode 100644 index 0000000..7370f7b --- /dev/null +++ b/webapp/migrations/0040_auto_20180516_2124.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-05-16 18:24 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0039_auto_20180516_2113'), + ] + + operations = [ + migrations.RemoveField( + model_name='official', + name='role', + ), + migrations.AddField( + model_name='official', + name='role', + field=models.ManyToManyField(null=True, related_name='roles', to='webapp.Role'), + ), + ] diff --git a/webapp/migrations/0041_auto_20180516_2204.py b/webapp/migrations/0041_auto_20180516_2204.py new file mode 100644 index 0000000..8c5ac91 --- /dev/null +++ b/webapp/migrations/0041_auto_20180516_2204.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2018-05-16 19:04 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0040_auto_20180516_2124'), + ] + + operations = [ + migrations.AlterField( + model_name='official', + name='role', + field=models.ManyToManyField(related_name='official', to='webapp.Role'), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 6f40f60..bd3ef97 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -90,26 +90,26 @@ class Registration(models.Model): class BaseRole(models.Model): """Base model for occupations/roles.""" - CATEGORIES = ( - ('corporate', _('Corporate affairs')), - ('freshman', _('Freshmen')), - ('international', _('International')), - ('external', _('External affairs')), - ('media', _('Media')), - ('tech', _('Technology')), - ('wellbeing', _('Wellbeing')), - ('elepaja', _('Elepaja')), - ('ceremonies', _('Ceremonies')), - ('culture', _('Culture')), - ('studies', _('Studies')), - ('sosso', _('Sössö magazine')), - ('alumni', _('Alumni relations')), - ('others', _('Others')), - ) + # CATEGORIES = ( + # ('corporate', _('Corporate affairs')), + # ('freshman', _('Freshmen')), + # ('international', _('International')), + # ('external', _('External affairs')), + # ('media', _('Media')), + # ('tech', _('Technology')), + # ('wellbeing', _('Wellbeing')), + # ('elepaja', _('Elepaja')), + # ('ceremonies', _('Ceremonies')), + # ('culture', _('Culture')), + # ('studies', _('Studies')), + # ('sosso', _('Sössö magazine')), + # ('alumni', _('Alumni relations')), + # ('others', _('Others')), + # ) name = models.CharField(_('Name'), max_length=255) is_board = models.BooleanField(_('Board member')) - category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255) + # category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255) def __str__(self): n = self.name.capitalize() @@ -237,10 +237,9 @@ class KaehmyForm(MessageParent): class Committee(models.Model): - """ + """ Committee model - - Has many Roles found under variable roles + Has many Roles found under variable roles """ class Meta: @@ -252,7 +251,11 @@ class Committee(models.Model): def __str__(self): return _('Committee: {}').format(self.name) - name = models.CharField(max_length=255) + name = models.CharField(_("Name"), max_length=255) + + @property + def current_roles(self): + return self.roles.all().filter(end_date__gte=timezone.now()).filter(start_date__lte=timezone.now()) class Role(PresetRole): @@ -271,9 +274,9 @@ class Role(PresetRole): start_date = models.DateField(_('Start date')) end_date = models.DateField(_('End date')) - official = models.ForeignKey('Official', related_name='roles') committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, null=True) + class Official(User): """Model representing a guild official.""" @@ -284,6 +287,10 @@ class Official(User): verbose_name_plural = _('Officials') phone_number = PhoneNumberField(_('Phone number')) + role = models.ManyToManyField('Role', related_name='official') + + def __str__(self): + return '{} {}'.format(self.first_name, self.last_name) # Ohlhafv diff --git a/webapp/templates/contact.html b/webapp/templates/contact.html index bf51df3..98ef85a 100644 --- a/webapp/templates/contact.html +++ b/webapp/templates/contact.html @@ -8,16 +8,12 @@

{% trans "Contact" %}

- {% if committee_list %} - - {% for com in committee_list %} - + {% if committees %} + {% for committee in committees %} -

{{ com.committee.name }}

- - - {% if com.roles_list %} - {% for role in com.roles_list %} +

{{ committee.name }}

+ {% for role in committee.current_roles %} + {% for official in role.official.all %}
@@ -25,17 +21,16 @@
-
-
{{role.name}}
-

{{role.official.first_name}} - {{role.official.last_name}} - {{role.official.email}}

-
+
+
{{role.name}}
+

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

+
{% endfor %} - {%endif%} - + {% endfor %} {% endfor %} {% else%}

Ei Toimikuntia

diff --git a/webapp/views.py b/webapp/views.py index 6112a36..6523eb0 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -8,6 +8,7 @@ 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 import logging import requests @@ -144,30 +145,11 @@ def sosso_view(request, *args, **kwargs): @require_http_methods(["GET"]) def contact_view(request, *args, **kwargs): """Render "Contact" page.""" + committees = Committee.objects.order_by('name') - # Lajitellaan roolit toimikunnittain - # in format: context = { - # committee_list: [ - # {"committee": 'toimikunta_object', - # "roles_list": [ {role:'Taittaja', officer:'Pekka'}, - # {role:'PJ', officer:'Pentti'}, - # {role:'X-Vastaava', officer:'Petra'} - # ]}, - # {roles_list: [ {role:'Taittaja', officer:'Pekka'}, - # {role:'PJ', officer:'Pentti'}, - # {role:'X-Vastaava', officer:'Petra'} - # ]} - # ]} - # - - all_roles = Role.objects.all() - all_committees = Committee.objects.order_by('name') - - committee_list = [] - for committee in all_committees: - committee_list.append({"committee":committee, "roles_list":committee.roles.all()}) - - context = {"all_roles": all_roles, "committee_list": committee_list} + context = { + "committees": committees + } return render(request, "contact.html", context) From 5caacd8f44dd92ea0c321b69bc1d881292aad9d2 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 22 May 2018 23:54:58 +0300 Subject: [PATCH 11/18] Add and fix translations --- locale/en/LC_MESSAGES/django.po | 168 ++++++++++--------------- locale/fi/LC_MESSAGES/django.po | 209 +++++++++++++++----------------- 2 files changed, 165 insertions(+), 212 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index f3d30c9..5c71ad1 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-02 02:43+0200\n" +"POT-Creation-Date: 2018-05-22 23:51+0300\n" "PO-Revision-Date: 2017-11-02 23:09+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -113,7 +113,7 @@ msgid "Delete" msgstr "Delete" #: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:39 -#: kaehmy/templates/list.html:36 webapp/models.py:110 +#: kaehmy/templates/list.html:36 webapp/models.py:110 webapp/models.py:140 msgid "Name" msgstr "Name" @@ -221,7 +221,7 @@ msgstr "Custom kaehmy role" msgid "Custom kaehmy roles" msgstr "Custom kaehmy roles" -#: kaehmy/models.py:40 kaehmy/templates/list.html:40 members/models.py:16 +#: kaehmy/models.py:40 kaehmy/templates/list.html:40 members/models.py:15 msgid "Email" msgstr "Email" @@ -249,7 +249,7 @@ msgstr "Kaehmy application" msgid "Kaehmylomakkeet" msgstr "Kaehmy applications" -#: kaehmy/models.py:81 webapp/models.py:153 +#: kaehmy/models.py:81 webapp/models.py:175 msgid "Phone number" msgstr "" @@ -289,17 +289,15 @@ msgstr "" msgid "Telegram channels" msgstr "" -#: kaehmy/tables.py:13 webapp/models.py:137 +#: kaehmy/tables.py:13 webapp/models.py:159 msgid "Roles" msgstr "" -#: kaehmy/templates/error.html:8 members/templates/error.html:8 -#: templates/error.html:8 +#: kaehmy/templates/error.html:8 templates/error.html:8 msgid "Error" msgstr "Error" -#: kaehmy/templates/error.html:15 members/templates/error.html:15 -#: templates/error.html:15 +#: kaehmy/templates/error.html:15 templates/error.html:15 msgid "Back" msgstr "Back" @@ -436,7 +434,7 @@ msgstr "New application" msgid "Statistics" msgstr "" -#: members/forms.py:107 members/models.py:103 members/tables.py:46 +#: members/forms.py:107 members/models.py:102 members/tables.py:41 msgid "Member" msgstr "Member" @@ -448,65 +446,65 @@ msgstr "I'm a member of AYY" msgid "I want to receive a weekly newsletter" msgstr "I want to receive a weekly newsletter" -#: members/models.py:14 +#: members/models.py:13 msgid "First name" msgstr "First name" -#: members/models.py:15 +#: members/models.py:14 msgid "Last name" msgstr "Last name" -#: members/models.py:17 +#: members/models.py:16 msgid "Place of residence" msgstr "Place of residence" -#: members/models.py:19 members/models.py:70 +#: members/models.py:18 members/models.py:69 #: members/templates/member_add_many.html:39 msgid "AYY" msgstr "AYY" -#: members/models.py:20 +#: members/models.py:19 msgid "JAS" msgstr "JAS" -#: members/models.py:51 +#: members/models.py:50 msgid "Submitted" msgstr "Submitted" -#: members/models.py:68 +#: members/models.py:67 msgid "Date" msgstr "Date" -#: members/models.py:69 +#: members/models.py:68 msgid "Source" msgstr "Source" -#: members/models.py:71 +#: members/models.py:70 msgid "Cash" msgstr "Cash" -#: members/models.py:72 members/templates/member_add_many.html:40 +#: members/models.py:71 members/templates/member_add_many.html:40 msgid "Bank transfer" msgstr "Bank transfer" -#: members/models.py:96 +#: members/models.py:95 msgid "Created" msgstr "Created" -#: members/models.py:104 members/templates/base.html:52 +#: members/models.py:103 members/templates/base.html:52 #: members/templates/member_add_many_confirm.html:12 msgid "Members" msgstr "Members" -#: members/tables.py:14 +#: members/tables.py:15 msgid "Last paid" msgstr "Last paid" -#: members/tables.py:19 members/tables.py:51 members/tables.py:68 +#: members/tables.py:19 members/tables.py:45 members/tables.py:60 msgid "Edit" msgstr "Edit" -#: members/tables.py:33 +#: members/tables.py:31 msgid " (not paid)" msgstr " (not paid)" @@ -728,11 +726,11 @@ msgstr "Payments in register:" msgid "Language" msgstr "Language" -#: members/templates/settings.html:20 sikweb/base.py:232 +#: members/templates/settings.html:20 sikweb/base.py:246 msgid "Finnish" msgstr "Finnish" -#: members/templates/settings.html:21 sikweb/base.py:233 +#: members/templates/settings.html:21 sikweb/base.py:247 msgid "English" msgstr "English" @@ -762,32 +760,32 @@ msgstr "Successfully deleted application" msgid "Could not delete application object" msgstr "Could not delete application object" -#: members/views/members.py:73 members/views/members.py:175 -#: members/views/members.py:199 +#: members/views/members.py:87 members/views/members.py:189 +#: members/views/members.py:213 msgid "No member id specified" msgstr "No member id specified" -#: members/views/members.py:114 +#: members/views/members.py:128 msgid "Failed to import members" msgstr "Failed to import members" -#: members/views/members.py:128 +#: members/views/members.py:142 msgid "Successfully added member" msgstr "Successfully added member" -#: members/views/members.py:149 +#: members/views/members.py:163 msgid "Member missing 'id' field." msgstr "Member missing 'id' field." -#: members/views/members.py:158 +#: members/views/members.py:172 msgid "Successfully updated member" msgstr "Successfully updated member" -#: members/views/members.py:179 +#: members/views/members.py:193 msgid "Successfully deleted member" msgstr "Successfully deleted member" -#: members/views/members.py:188 +#: members/views/members.py:202 msgid "Could not delete member object" msgstr "Could not delete member object" @@ -1025,68 +1023,6 @@ msgstr "" msgid "Registrations" msgstr "" -#: webapp/models.py:94 -msgid "Corporate affairs" -msgstr "" - -#: webapp/models.py:95 webapp/templates/freshmen.html:10 -#: webapp/templates/navigation.html:8 -msgid "Freshmen" -msgstr "Freshmen" - -#: webapp/models.py:96 webapp/templates/international.html:10 -#: webapp/templates/navigation.html:14 -msgid "International" -msgstr "International" - -#: webapp/models.py:97 -msgid "External affairs" -msgstr "" - -#: webapp/models.py:98 -msgid "Media" -msgstr "" - -#: webapp/models.py:99 -msgid "Technology" -msgstr "" - -#: webapp/models.py:100 -msgid "Wellbeing" -msgstr "" - -#: webapp/models.py:101 -msgid "Elepaja" -msgstr "" - -#: webapp/models.py:102 -msgid "Ceremonies" -msgstr "" - -#: webapp/models.py:103 -msgid "Culture" -msgstr "" - -#: webapp/models.py:104 -msgid "Studies" -msgstr "" - -#: webapp/models.py:105 -msgid "Sössö magazine" -msgstr "Sössö magazine" - -#: webapp/models.py:106 -msgid "Alumni relations" -msgstr "Alumni relations" - -#: webapp/models.py:107 -msgid "Others" -msgstr "" - -#: webapp/models.py:112 -msgid "Category" -msgstr "" - #: webapp/models.py:116 msgid "board member" msgstr "board member" @@ -1095,27 +1031,39 @@ msgstr "board member" msgid "Description" msgstr "Description" -#: webapp/models.py:136 +#: webapp/models.py:134 +msgid "Committee" +msgstr "" + +#: webapp/models.py:135 +msgid "Committees" +msgstr "" + +#: webapp/models.py:138 +msgid "Committee: {}" +msgstr "" + +#: webapp/models.py:158 msgid "Role" msgstr "" -#: webapp/models.py:139 +#: webapp/models.py:161 msgid "Start date" msgstr "" -#: webapp/models.py:140 +#: webapp/models.py:162 msgid "End date" msgstr "" -#: webapp/models.py:150 +#: webapp/models.py:172 msgid "Official" msgstr "" -#: webapp/models.py:151 +#: webapp/models.py:173 msgid "Officials" msgstr "" -#: webapp/templates/contact.html:10 webapp/templates/navigation.html:20 +#: webapp/templates/contact.html:9 webapp/templates/navigation.html:20 msgid "Contact" msgstr "Contact" @@ -1123,6 +1071,10 @@ msgstr "Contact" msgid "Event calendar" msgstr "Event calendar" +#: webapp/templates/freshmen.html:10 webapp/templates/navigation.html:8 +msgid "Freshmen" +msgstr "Freshmen" + #: webapp/templates/guild.html:10 msgid "Kilta" msgstr "Guild" @@ -1143,6 +1095,10 @@ msgstr "Infoscreen Admin Pane" msgid "Kaehmy application" msgstr "Kaehmy application" +#: webapp/templates/international.html:10 webapp/templates/navigation.html:14 +msgid "International" +msgstr "International" + #: webapp/templates/jobs.html:10 webapp/templates/navigation.html:27 msgid "Jobs" msgstr "Jobs" @@ -1159,6 +1115,12 @@ msgstr "Sössö" msgid "Corporate" msgstr "Corporate" +#~ msgid "Sössö magazine" +#~ msgstr "Sössö magazine" + +#~ msgid "Alumni relations" +#~ msgstr "Alumni relations" + #~ msgid "SIK Admin" #~ msgstr "SIK Admin" diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index 03f7e96..d758578 100644 --- a/locale/fi/LC_MESSAGES/django.po +++ b/locale/fi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-02 02:43+0200\n" +"POT-Creation-Date: 2018-05-22 23:51+0300\n" "PO-Revision-Date: 2017-11-02 23:04+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -51,10 +51,8 @@ msgid "External image" msgstr "Ulkoinen kuva" #: infoscreen/templates/infoscreen_admin.html:10 -#, fuzzy -#| msgid "Infoscreen admin pane" msgid "Infoscreen admin" -msgstr "Infonäyttöjen hallintapaneeli" +msgstr "Infonäyttöjen hallinta" #: infoscreen/templates/infoscreen_admin.html:26 members/templates/base.html:79 msgid "Log out" @@ -116,7 +114,7 @@ msgid "Delete" msgstr "Poista" #: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:39 -#: kaehmy/templates/list.html:36 webapp/models.py:110 +#: kaehmy/templates/list.html:36 webapp/models.py:110 webapp/models.py:140 msgid "Name" msgstr "Nimi" @@ -205,10 +203,8 @@ msgid "Custom role with the same name already exists." msgstr "Samanniminen virka on jo olemassa." #: kaehmy/models.py:18 -#, fuzzy -#| msgid "Kaehmylomake" msgid "Kaehmy" -msgstr "Kaehmylomake" +msgstr "Kaehmy" #: kaehmy/models.py:25 msgid "Preset kaehmy role" @@ -226,7 +222,7 @@ msgstr "Uusi virka" msgid "Custom kaehmy roles" msgstr "Uudet kaehmyvirat" -#: kaehmy/models.py:40 kaehmy/templates/list.html:40 members/models.py:16 +#: kaehmy/models.py:40 kaehmy/templates/list.html:40 members/models.py:15 msgid "Email" msgstr "Sähköposti" @@ -254,7 +250,7 @@ msgstr "Kaehmylomake" msgid "Kaehmylomakkeet" msgstr "Kaehmylomakkeet" -#: kaehmy/models.py:81 webapp/models.py:153 +#: kaehmy/models.py:81 webapp/models.py:175 msgid "Phone number" msgstr "Puhelinnumero" @@ -294,17 +290,15 @@ msgstr "Telegram-kanava" msgid "Telegram channels" msgstr "Telegram-kanavat" -#: kaehmy/tables.py:13 webapp/models.py:137 +#: kaehmy/tables.py:13 webapp/models.py:159 msgid "Roles" msgstr "Roolit" -#: kaehmy/templates/error.html:8 members/templates/error.html:8 -#: templates/error.html:8 +#: kaehmy/templates/error.html:8 templates/error.html:8 msgid "Error" msgstr "Virhe" -#: kaehmy/templates/error.html:15 members/templates/error.html:15 -#: templates/error.html:15 +#: kaehmy/templates/error.html:15 templates/error.html:15 msgid "Back" msgstr "Takaisin" @@ -444,7 +438,7 @@ msgstr "Uusi kaehmy" msgid "Statistics" msgstr "Kaehmytilastot" -#: members/forms.py:107 members/models.py:103 members/tables.py:46 +#: members/forms.py:107 members/models.py:102 members/tables.py:41 msgid "Member" msgstr "Jäsen" @@ -456,65 +450,65 @@ msgstr "Olen AYY:n jäsen" msgid "I want to receive a weekly newsletter" msgstr "Haluan saada viikottaisen jäsentiedotteen" -#: members/models.py:14 +#: members/models.py:13 msgid "First name" msgstr "Etunimi" -#: members/models.py:15 +#: members/models.py:14 msgid "Last name" msgstr "Sukunimi" -#: members/models.py:17 +#: members/models.py:16 msgid "Place of residence" msgstr "Asuinpaikka" -#: members/models.py:19 members/models.py:70 +#: members/models.py:18 members/models.py:69 #: members/templates/member_add_many.html:39 msgid "AYY" msgstr "AYY" -#: members/models.py:20 +#: members/models.py:19 msgid "JAS" msgstr "JAS" -#: members/models.py:51 +#: members/models.py:50 msgid "Submitted" msgstr "Lisätty" -#: members/models.py:68 +#: members/models.py:67 msgid "Date" msgstr "Päivämäärä" -#: members/models.py:69 +#: members/models.py:68 msgid "Source" msgstr "Lähde" -#: members/models.py:71 +#: members/models.py:70 msgid "Cash" msgstr "Käteinen" -#: members/models.py:72 members/templates/member_add_many.html:40 +#: members/models.py:71 members/templates/member_add_many.html:40 msgid "Bank transfer" msgstr "Tilisiirto" -#: members/models.py:96 +#: members/models.py:95 msgid "Created" msgstr "Lisätty" -#: members/models.py:104 members/templates/base.html:52 +#: members/models.py:103 members/templates/base.html:52 #: members/templates/member_add_many_confirm.html:12 msgid "Members" msgstr "Jäsenet" -#: members/tables.py:14 +#: members/tables.py:15 msgid "Last paid" msgstr "Viimeksi maksettu" -#: members/tables.py:19 members/tables.py:51 members/tables.py:68 +#: members/tables.py:19 members/tables.py:45 members/tables.py:60 msgid "Edit" msgstr "Muokkaa" -#: members/tables.py:33 +#: members/tables.py:31 msgid " (not paid)" msgstr " (ei maksua)" @@ -734,11 +728,11 @@ msgstr "Maksutapahtumia:" msgid "Language" msgstr "Kieli" -#: members/templates/settings.html:20 sikweb/base.py:232 +#: members/templates/settings.html:20 sikweb/base.py:246 msgid "Finnish" msgstr "suomi" -#: members/templates/settings.html:21 sikweb/base.py:233 +#: members/templates/settings.html:21 sikweb/base.py:247 msgid "English" msgstr "englanti" @@ -767,32 +761,32 @@ msgstr "Onnistuneesti poistettiin hakemus" msgid "Could not delete application object" msgstr "Hakemusobjektia ei voitu poistaa" -#: members/views/members.py:73 members/views/members.py:175 -#: members/views/members.py:199 +#: members/views/members.py:87 members/views/members.py:189 +#: members/views/members.py:213 msgid "No member id specified" msgstr "Jäsenen ID ei määritelty" -#: members/views/members.py:114 +#: members/views/members.py:128 msgid "Failed to import members" msgstr "Jäsenten tuonti epäonnistui" -#: members/views/members.py:128 +#: members/views/members.py:142 msgid "Successfully added member" msgstr "Onnistuneesti lisättiin jäsen" -#: members/views/members.py:149 +#: members/views/members.py:163 msgid "Member missing 'id' field." msgstr "Jäsenen ID ei määritelty." -#: members/views/members.py:158 +#: members/views/members.py:172 msgid "Successfully updated member" msgstr "Onnistuneesti päivitettiin jäsen" -#: members/views/members.py:179 +#: members/views/members.py:193 msgid "Successfully deleted member" msgstr "Onnistuneesti poistettiin jäsen" -#: members/views/members.py:188 +#: members/views/members.py:202 msgid "Could not delete member object" msgstr "Jäsenobjektia ei voitu poistaa" @@ -1028,68 +1022,6 @@ msgstr "Ilmoittautuminen" msgid "Registrations" msgstr "Ilmoittautumiset" -#: webapp/models.py:94 -msgid "Corporate affairs" -msgstr "Yrityssuhteet" - -#: webapp/models.py:95 webapp/templates/freshmen.html:10 -#: webapp/templates/navigation.html:8 -msgid "Freshmen" -msgstr "Fuksit" - -#: webapp/models.py:96 webapp/templates/international.html:10 -#: webapp/templates/navigation.html:14 -msgid "International" -msgstr "International" - -#: webapp/models.py:97 -msgid "External affairs" -msgstr "Ulkosuhteet" - -#: webapp/models.py:98 -msgid "Media" -msgstr "Media" - -#: webapp/models.py:99 -msgid "Technology" -msgstr "Teknologia" - -#: webapp/models.py:100 -msgid "Wellbeing" -msgstr "Hyvinvointi" - -#: webapp/models.py:101 -msgid "Elepaja" -msgstr "Elepaja" - -#: webapp/models.py:102 -msgid "Ceremonies" -msgstr "Hupitapahtumat" - -#: webapp/models.py:103 -msgid "Culture" -msgstr "Kulttuuri" - -#: webapp/models.py:104 -msgid "Studies" -msgstr "Opinnot" - -#: webapp/models.py:105 -msgid "Sössö magazine" -msgstr "Kiltalehti Sössö" - -#: webapp/models.py:106 -msgid "Alumni relations" -msgstr "Alumnisuhteet" - -#: webapp/models.py:107 -msgid "Others" -msgstr "Muut" - -#: webapp/models.py:112 -msgid "Category" -msgstr "Kategoria" - #: webapp/models.py:116 msgid "board member" msgstr "hallituksen jäsen" @@ -1098,27 +1030,39 @@ msgstr "hallituksen jäsen" msgid "Description" msgstr "Kuvaus" -#: webapp/models.py:136 +#: webapp/models.py:134 +msgid "Committee" +msgstr "Toimikunta" + +#: webapp/models.py:135 +msgid "Committees" +msgstr "Toimikunnat" + +#: webapp/models.py:138 +msgid "Committee: {}" +msgstr "Toimikunta: {}" + +#: webapp/models.py:158 msgid "Role" msgstr "Rooli" -#: webapp/models.py:139 +#: webapp/models.py:161 msgid "Start date" msgstr "Alkupäivämäärä" -#: webapp/models.py:140 +#: webapp/models.py:162 msgid "End date" msgstr "Loppupäivämäärä" -#: webapp/models.py:150 +#: webapp/models.py:172 msgid "Official" msgstr "Toimihenkilö" -#: webapp/models.py:151 +#: webapp/models.py:173 msgid "Officials" msgstr "Toimihenkilöt" -#: webapp/templates/contact.html:10 webapp/templates/navigation.html:20 +#: webapp/templates/contact.html:9 webapp/templates/navigation.html:20 msgid "Contact" msgstr "Yhteystiedot" @@ -1126,6 +1070,10 @@ msgstr "Yhteystiedot" msgid "Event calendar" msgstr "Tapahtumakalenteri" +#: webapp/templates/freshmen.html:10 webapp/templates/navigation.html:8 +msgid "Freshmen" +msgstr "Fuksit" + #: webapp/templates/guild.html:10 msgid "Kilta" msgstr "Kilta" @@ -1146,6 +1094,10 @@ msgstr "Infonäyttöjen hallintapaneeli" msgid "Kaehmy application" msgstr "Kaehmy" +#: webapp/templates/international.html:10 webapp/templates/navigation.html:14 +msgid "International" +msgstr "International" + #: webapp/templates/jobs.html:10 webapp/templates/navigation.html:27 msgid "Jobs" msgstr "Työpaikat" @@ -1162,6 +1114,45 @@ msgstr "Sössö" msgid "Corporate" msgstr "Yritys" +#~ msgid "Corporate affairs" +#~ msgstr "Yrityssuhteet" + +#~ msgid "External affairs" +#~ msgstr "Ulkosuhteet" + +#~ msgid "Media" +#~ msgstr "Media" + +#~ msgid "Technology" +#~ msgstr "Teknologia" + +#~ msgid "Wellbeing" +#~ msgstr "Hyvinvointi" + +#~ msgid "Elepaja" +#~ msgstr "Elepaja" + +#~ msgid "Ceremonies" +#~ msgstr "Hupitapahtumat" + +#~ msgid "Culture" +#~ msgstr "Kulttuuri" + +#~ msgid "Studies" +#~ msgstr "Opinnot" + +#~ msgid "Sössö magazine" +#~ msgstr "Kiltalehti Sössö" + +#~ msgid "Alumni relations" +#~ msgstr "Alumnisuhteet" + +#~ msgid "Others" +#~ msgstr "Muut" + +#~ msgid "Category" +#~ msgstr "Kategoria" + #~ msgid "Challenger email" #~ msgstr "Haastajan sähköpostiosoite" From 0207bdf22b448798d5c68cf3a2edff926ff03db4 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 31 May 2018 17:26:49 +0300 Subject: [PATCH 12/18] Upgrade psycopg2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bf70437..9e8ba82 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ djangorestframework==3.5.3 coverage==4.3.4 django-nose==1.4.4 nose-exclude==0.5.0 -psycopg2==2.7.1 +psycopg2==2.7.3.1 django-bootstrap3==8.2.3 django-tables2==1.6.1 pycodestyle==2.3.1 From 4e8adebb2dfd8875da9eae4253a40d63fb5f2831 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 5 Jun 2018 19:33:35 +0300 Subject: [PATCH 13/18] 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 14/18] 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 zcmZwJ34Bz=0mt##O(0z1lpB)e3P%FwA_yoUAfTZrQHmF$3tb>?Hi;xb5OGy1i9%6$ zO65{)C{j>CRuHAA92zbWu|!0PVo{)4l`0suw*CG0O)A*F5C42;X5TT_zNNat^I(N1 zT+=f4al`Q==|sMbGbYbt%z4w!-?DZQDnp zuFJ*dI363}RBU2Q*i5%4gi+6&k2-NVHpOS{=i6`!^(y;$zqZCCQqM+iWNyPWEU-R_ zDbx>PU;GJUF}a;F@tBG&dA=D!K{v?5hB(olFb#FV4EyP9$!^ ztj1i7V*!Wbb*N3Y1bg5v)Ks5AUH=p6!7;337i@~Ery^eY{#BZTy=rHQ*_n~e77&T*`qNe@})MorQYLB#GBgrH@#n(KXML}zpK=<@P zGG^jn)Ch`E51N7M*nPJCkk!E!w68>6zX5f>*Q^In19%_Ru~Voe`4Sm;*qpZ~#IYbc zp*3m>J0bhhq@r#-8nx?hLEWGXH6wFueKBe#mm&Ymdj33t2T?ONm9LaKQh-{5yRo^x z{|{1NpP417soI3RE6iS7KYY5Ox1K zs6F+Ve}KB-7pSQ{hw4~NlG~xSsLvBo z*Y!fZC;HoZP7?DUq~RJG>fAA?FT=gM(pk7z9QpLKPp+M3#OsgdX{xQYH3!Y)^;Q6 z`YOC051+N=I0cs#?QTN#trl8HR8+GBk$XC@IMNQRr*Z^btxIeE=kb9cTkV!Cp ztdA9_DSpJ(SD@}!iCUVqI3Bm4&WlfWUv%LP6h?d4IJlD!@>ARsQu?|h9*DX@E^4N3 zL{2pmP#vp4P3asm=5w)2rQ8V%q zY6+@Qd*BpiVZ%$^7uHZ5OuY=%u@|rrzJks04b+2=pl0ASHq!V190m1UFL-^>2sNc` zQJW|Mb;H3p1+PS%zaF&|n^6y{!KQcy8)GeM0I_T!-M1a;XTAsO{cB{BfqAw*8TBSCM0IEpHp7*u>z>1~da{Lr z+>SbNH`c>LsI{#|-MGg3HL3&N47WoqP_OC)9EJl??~{8_4_bt}-!jz9t-_YLE`#~k zrr1t{Mz9}Muf|q*67@!_MRlYNzf9_20;=8zHKKIX1BTi5t59#!vFO7or~#Ivp0m)_ zmu52mx^NW@8qpeL+016l#n13^Ok?4+B!$=qm!oFnP1M)ysP#Ci!=IqmTsu@t8;|-A zOJ7?biTXB82~*Ik_72p@A3#mzqxOXLs43fE>o225upKp`J=V8vdo^lCPFT;Pe&;;{ z+zy?&%>Dd4GB(zKpgRMDQ4h+o_0g!c%R`OyX4DK7pdK*W*5{)-z6>?uwW#wq+x9AK zP5lV!y3bJ^{}G$>eB&MDe$85;PDsToa44z+_o7Bzj=FF$>V`{EyL$ubcm6PHDT2HN zv`31q_h1|96{w|o3OnL?f1*axm<87j+N0Wgpk^l1)`wtw>SK@*n5n3a z&P46%`>`87h8oaT)b)F8{V?jfPcWY6n{OznM;?Z)2Y0siw)VH?pk`tWcE%e~Gcp6U ziRak*TvUf1Mm^ZE^_8eM=Ni=J+k;^}_<%j(H0nlYQ62dX^)-wc;@+q&YHhnEk|wc6?hlEi0W`kwtL@ls4b?+MfZR-x|uB5IRvN6qBEp<(xT{s;}JG{ok(Yt|n%vJt2Y z#@qJEs2i4`MpBMraUtH0A7M`%I?SE1X&9XmYdPw=6_|jPVG5doov6+74kqIX?1k~e z-QW2v)b73&^&**s8o_MTlFdVHz6E$KK4t4)p_jV%O7<82i9AErl6=DWFFxL-`XHG` zipdJ1;}4`ad7bF!K_-zulAFj>qGKbuj(n~P2QR|t@dbasBhQghWIs8g=P#q6H9Jjq z5ISuBLi!RN-H1rdd8w_B)A)~5d4p(&)(~Dy z(RV(W=gF<)ZB;lPB8$mtRX7&7ME@4q@|_q@>XG^6x8y7GBl$CVjJ!!Uk%YSWzn{u2 zL`M#Z5N(`YWFILYI`rmyjohe;J+$5*6TRjBN;Z(s$U^cB(fY>`KhY6GlA(>NS-Enw(TwaJsCi{l7Eo8<7x_tTL0!0 z){sldC!`fgC3T0s9h+@sEZ$(tw_ESVdA7U=^=f{fXl6ep9f*!}7gLE7Y>&^HZ(uw?<^dt9?C4`q`^eE(SOHx6C(H7nVIG)TRRb&-8Lmno7Ck@og zx?>Q9VRaS!fixz!kq5{Ya^Z25N;9&O^dg7I43bOUAv$)F7UX4BIKC%6Nh5NKgx}-O ztK=Y=OTH$xB$G5DUC3^t;{%uI-)H%If?Q8NB5ldHM8_kfd$h!F2`(pt$u+j^Lo6Zd z+*NX4iHB);l8h#g6CKk@N77Cej&m*-{e6mBmTk$#*b6>=$(Bdrm1MT9AG4m+*8CNf z%SfqhT#tK5hOKYMA+{`Lk~xt;>usJ$TH75Sr+)j5zECK?v@{Sf!;5TbkZ<;!pKB#f zq!|NNv5h*t?DtZ zC_j`REGsPao1cr(F4k2G{iRMQ?KbCF+DT_m`hI75#@G%z893dO%W405&=r1cR3*{FE3e80gC4tiaX^1}U;#J)QCC+g_vd(>_lAf619r{fkpKVy delta 6054 zcmZwK33OD|9mnxI*$9%b6M+DU5Mm%K*#yHHL_~}P1XzL(+?L6s365@@y$z{w>EwtB|vUbKCK`%DLQAx&dh?!uWg3jAKPv$Y~j2pF|>zjQvF2jSUfm(JnrWJO?ZrBUE;8@h1 zR#=xHrT!R{54r)#3 zq1JLSYH3!WD)A)h`1Ppq!l>ikK#lhVos^=gVw=HL@yZBWhxAqsHHd8ut^_c%OBm{<`2vcBq7BQ3FP^ zKwYsd>csx2&kHaL3sD0Vp$57hvv3+-gUfI@9zi{P-B`cwI2Kj<8r1oVgETboQoICL z+WxD^8)tS|52Ge>8Z+=`)EcMrK(xg?)SZq(Rj3H{T28k6i%}(aqaH#(>RAciXB#WA zk@tQbYRy8-MhC3IJlueq@p04zPM{`q#`e!!<0+dS-qxt|(@^8(S%;w}UW6=R&=k|q z5==vteuh1u4kIN(t@Tn=>FSXO*{nld;7!z9@Bv1a5>=72wx7r=q;cCJyG%MhgrhJ< z@BimCG^0k;Qk+4ZVA71?xiqa%CF_lRrdvR42A*xbA62PUsN*)G zCbSKC9?fpMzY!zv|7jYkKy12G@-`Slzk}^}K}{eHb%(v}=lxNo9)xjt9jZc;QRi3M z{Q-U^M-E?dOY8clIFm!FtTbH&M^d zS=9N_J)9+Ni#k3X$73ey27{;xolv7GjV3*v6I!9xyc_Do9OP9u{ZU`36EPld#Y~)m zT+`GeMKfDbm1#tk{2SZ<5p|s?PSUsusLBUh(U?dh1$9CVM&UdxbaChSI{kgUoX?l{ zcJ8nNH9#0up>4>aW(R75r%)9=hmi|YF5OsyHQ6y}deTVbgM8FeJklO;BkKM3+I}tS zxP>?mSD>Dmj(wd9^+A<>H0oKHg8gtV>I-Z$4#cle6U@lclCl2TG+MA@5NZO~qAGDq zH zaT@w+Jc-S)O|Das6x6_dQ4_n|Iuv!>RTzuoP-{IIHSknx6>1{)*v~_#39dwag|E$} z{#Vf0&JKN%#IaDiU@~gpG}O#{Vr$GpRc0h=;uBC4nQHg@unqm$sBgLlP!oFwb=*eV z--=rDU3t`B7y8J4a2WL!`vs=rPpCWZ%=+kpX{df*)Or0-cQ^=HW>bjQU>y#^oyd!0 zVt5jJVm7Km#i-Y?JZKx$s2SgZD$xqm+OD>4N4;i8QD3o*s7m~TDrI7S=kp9y#d_I( zKh(qrpe8=T_OC@%AUMf3N>RW6vrrSbCEq!~hZMooq3-y3)CD%%{x;N-?L^(#yQqqM zj=I1p+jk9cCfpJ=ei!8Upvkl!490eRP>4Fwjk@6NsF}~gmiRl=YqkV++%q^BUqMae z9O{mvdD(SdbJV!)P!D+~>i540BftNRH1u$MWj%{Y^kY~+ElDyaV?Jtt38*`~1GNMT zQ0FhV`=3BnXoKy)gdOPbM%}waU0#R9qP{VQ3H*#{qd*)rlBtE zM@{T*)C3;4K5gA(eH~Sicd#>lj2h>AjQsw`4{>&MK$WZ~s`S~m-yc=lA*czBwEgQ) zU$r-)9?m+{gy!1MA4QGxBx-`|P_O4^)Hr*Fu>N{z4zQyWHsUOd8R|@=4t2sjRLSd6 z@AFgE^{9z$LRD@Hrr=TJyUauvI1}uLsq`mf2G*jMvY{a8yq7!Jp@C1LE_fETBniWu z3#6c)+6+`FFT*}qfLT~!_pd@N-8xi>Uq)4QFOJ3caVnKT57JO6p2fDf*}4~X z;%C?ezeH7_$#CZaNtj7L9d$?JFdgTh93ahRkDer}T zB@Mn&O)9yG6qD)X!gh+r%_NOz{YDUN-#JA7Qb_Yh;uk8Jve zI!x-xd*oU&k!V}s5c%7mzvszbyYEH3n;a)^kX0m(Xl*x=3)?3&^qj0F@#J3e2nlZI z&!glJ@eyrp9n4!+@c_|t@-KDRzI8A^<1(U$Q(vp|$PS_{np{G@QO9o8cop%IX}bU3 zG-AkODLeV7t6N4L^t^>d78XHc9Xk^wtNS(4gX}@P4FUeko<%6A?=B_Ar9s` z+0u3vVh^>$iS1r?HTMN(mU~mHJU+MITTvd~k@SYEwcGD0t*ELs!#!1=nHA+;PjzTP z`xipR9ZFhMRaR8-ajLtd#O==KUrz$)(t%<8gskhqCkX+o1^Zd6nAa%~2zu8e8 zn%;e5XiWN|Sbt!;*AqUFeu=B)`0bmjtG91To#`%h&-RvkLT4@w#7`?Lukclr)`m(m z(!;wm4!W97^7wqWdc5VOp@yDY6LWiK<)mii49LsP%*qK@WNwH`7#1l*b)d}e@q|0~ zIp=C$=oG>0HdhBKy?%G4yUZV$>Gp?`vUY`HvZo~8Q04X4Ry(KoL+$H!{dj#U9AhfKEK=NDf4?%ZFNH7 nf_vg;L~7!7hw_GX4KEn>i>ukywKd-InhI~Z-y51geC~e$8B*hM 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 15/18] 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 16/18] 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 17/18] 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 18/18] 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')