From 3c183a256be97ed7c8c4ca34bc4b90a1262f5508 Mon Sep 17 00:00:00 2001
From: Jan Philipp Timme
Date: Thu, 11 Dec 2014 15:47:47 +0100
Subject: [PATCH] [TASK] Implement check of presentation type before validating
event.
---
frontend/forms.py | 34 ++++++++++----
frontend/models.py | 34 ++++++++------
frontend/templates/index.html | 1 -
frontend/templates/presentation-add.html | 2 +
frontend/views.py | 58 ++++++++++++++----------
5 files changed, 81 insertions(+), 48 deletions(-)
diff --git a/frontend/forms.py b/frontend/forms.py
index 6a4b4d7..1b78833 100644
--- a/frontend/forms.py
+++ b/frontend/forms.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from django import forms
-from frontend.models import Project, PersonGlobalIdentity, PresentationPerson, Presentation, PresentationEvent
+from frontend.models import Project, PersonGlobalIdentity, PresentationPerson, Presentation, PresentationEvent, PresentationSubmission
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout
@@ -177,6 +177,26 @@ class PresentationEventForm(forms.ModelForm):
model = PresentationEvent
fields = [u'date', u'name', u'workshop', u'place', u'start_date', u'end_date']
+class PresentationSubmissionForm(forms.ModelForm):
+ """ Form for the PresentationSubmission"""
+ def __init__(self, *args, **kwargs):
+ super(PresentationSubmissionForm, self).__init__(*args, **kwargs)
+ self.helper = FormHelper()
+ self.helper.form_tag = False
+ self.helper.label_class = u'col-lg-2'
+ self.helper.field_class = u'col-lg-4'
+ self.helper.layout = Layout(
+ u'comment',
+ u'email',
+ )
+
+ comment = forms.CharField(label='Kommentar')
+ email = forms.EmailField(label='E-Mail Adresse')
+
+ class Meta:
+ model = PresentationSubmission
+ fields = [u'comment', u'email']
+
class PresentationForm(forms.ModelForm):
@@ -190,19 +210,13 @@ class PresentationForm(forms.ModelForm):
self.helper.layout = Layout(
u'title',
u'type',
- u'abstract',
- u'comments',
- u'email'
+ u'abstract'
)
- title = forms.CharField()
- type = forms.ChoiceField(choices=[(u'new', u'Hauptvortrag'), (u'existing', u'andere Veranstaltung')], initial=u'new', widget=forms.RadioSelect())
+ title = forms.CharField(label='Titel')
+ type = forms.ChoiceField(choices=[(u'main', u'Hauptvortrag'), (u'other', u'andere Veranstaltung')], initial=u'main', widget=forms.RadioSelect(), label='Veranstaltungstyp')
abstract = forms.TextInput()
- # Event (other event)
- comments = forms.CharField()
- email = forms.EmailField()
-
class Meta:
model = Presentation
fields = [u'title', u'type', u'abstract']
diff --git a/frontend/models.py b/frontend/models.py
index 7d6a823..fc5ff43 100644
--- a/frontend/models.py
+++ b/frontend/models.py
@@ -18,26 +18,32 @@ class Project(models.Model):
class Presentation(models.Model):
""" Presention Model for PresentationForm"""
- title = models.CharField(max_length=255)
- type = models.CharField(max_length=255)
- abstract = models.TextField()
+ title = models.CharField(max_length=255, verbose_name='Titel')
+ type = models.CharField(max_length=255, choices=((u'main', u'Hauptvortrag'), (u'other', u'andere Veranstaltung')), default=u'main', verbose_name='Veranstaltungstyp')
+ abstract = models.TextField(verbose_name=u'Zusammenfassung')
+
+class PresentationSubmission(models.Model):
+ """ Submission containing a Presentation """
+ email = models.EmailField(max_length=255, verbose_name='E-Mail Adresse')
+ comment = models.TextField(verbose_name=u'Kommentar')
+ presentation = models.ForeignKey(Presentation, blank=False, null=False, db_index=True)
class PresentationEvent(models.Model):
"""Veranstaltung"""
- date = models.DateField()
- name = models.CharField(max_length=255)
- workshop = models.BooleanField()
- place = models.CharField(max_length=255)
- start_date = models.DateField()
- end_date = models.DateField()
- presentatiom = models.ForeignKey(Presentation, blank=False, null=False, db_index=True)
+ date = models.DateField(verbose_name='Veranstaltungsdatum')
+ name = models.CharField(max_length=255, verbose_name='Name')
+ workshop = models.BooleanField(verbose_name='Workshop')
+ place = models.CharField(max_length=255, verbose_name='Ort')
+ start_date = models.DateField(verbose_name='Startdatum')
+ end_date = models.DateField(verbose_name='Enddatum')
+ presentation = models.ForeignKey(Presentation, blank=False, null=False, db_index=True)
class PresentationPerson(models.Model):
""" Person Model for PresentationForm"""
- given_name = models.CharField(max_length=255)
- additional_name = models.CharField(max_length=255)
- family_name = models.CharField(max_length=255)
- hshmembership = models.CharField(max_length=255, choices=((u'yes', u'Ja'), (u'no', u'Nein'), (u'maybe', u'Maybe')), default=u'maybe')
+ given_name = models.CharField(max_length=255, verbose_name='Vorname')
+ additional_name = models.CharField(max_length=255, verbose_name='Namenszusatz', blank=True)
+ family_name = models.CharField(max_length=255, verbose_name='Nachname')
+ hshmembership = models.CharField(max_length=255, choices=((u'yes', u'Ja'), (u'no', u'Nein'), (u'maybe', u'Maybe')), default=u'maybe', verbose_name='Hochschulangehörigkeit')
presentation = models.ForeignKey(Presentation, blank=False, null=False, db_index=True)
diff --git a/frontend/templates/index.html b/frontend/templates/index.html
index a3cbb37..32f137d 100644
--- a/frontend/templates/index.html
+++ b/frontend/templates/index.html
@@ -5,7 +5,6 @@
Feel free to discover.
diff --git a/frontend/templates/presentation-add.html b/frontend/templates/presentation-add.html
index 9fec6a6..725a595 100644
--- a/frontend/templates/presentation-add.html
+++ b/frontend/templates/presentation-add.html
@@ -68,6 +68,8 @@
{% endfor %}
+
+ {% crispy submission_form %}
diff --git a/frontend/views.py b/frontend/views.py
index 9992a7c..60e90a3 100644
--- a/frontend/views.py
+++ b/frontend/views.py
@@ -15,7 +15,7 @@ from django.contrib.auth.views import login, logout
from django.core.urlresolvers import reverse
from frontend.forms import NewProjectForm, FileUploadForm, PersonMapForm
-from frontend.forms import PresentationForm, PresentationEventForm, PresentationPersonForm
+from frontend.forms import PresentationForm, PresentationEventForm, PresentationPersonForm, PresentationSubmissionForm
from frontend.forms import PresentationEventFormHelper, PresentationPersonFormHelper
from frontend.models import Presentation, PresentationEvent, PresentationPerson
from frontend.formsets import PresentationEventInlineFormset, PresentationPersonInlineFormset
@@ -118,6 +118,7 @@ class PresentationAddView(ProtectedTemplateView):
""" These guys are passed through using get_context_data(). """
presentation_form = None
+ submission_form = None
person_formset = None
event_formset = None
person_formhelper = PresentationPersonFormHelper
@@ -142,12 +143,14 @@ class PresentationAddView(ProtectedTemplateView):
def create_blank_forms(self):
""" Create blank form + formsets for the user to fill. """
self.presentation_form = PresentationForm(prefix='presentation')
+ self.submission_form = PresentationSubmissionForm(prefix='submission')
self.person_formset = PresentationPersonInlineFormset(prefix='person')
self.event_formset = PresentationEventInlineFormset(prefix='event')
def get_context_data(self, **kwargs):
""" Add form + formsets to template context. """
kwargs[u'presentation_form'] = self.presentation_form
+ kwargs[u'submission_form'] = self.submission_form
kwargs[u'person_formset'] = self.person_formset
kwargs[u'event_formset'] = self.event_formset
kwargs[u'person_formhelper'] = self.person_formhelper
@@ -159,30 +162,39 @@ class PresentationAddView(ProtectedTemplateView):
def handle_forms(self, request, *args, **kwargs):
""" Once a POST came in, try and validate the forms, saving the data. """
presentation = None
- success = 0
- """ Check the PresentationForm first and save it. """
+ presentation_ok = False
+ person_ok = False
+ event_ok = False
+ submission_ok = False
+ """ Create all the forms and formsets based on request params to do validation. """
self.presentation_form = PresentationForm(request.POST, request.FILES, prefix='presentation')
- if self.presentation_form.is_valid():
- presentation = self.presentation_form.save()
- success += 1
- """ If the PresentationForm was good, we now have a Presentation to use for the other guys. """
- if presentation != None:
- """ Get the person formset, validate and save. """
- person_formset = PresentationPersonInlineFormset(request.POST, request.FILES, instance=presentation, prefix='person')
- if person_formset.is_valid():
- person_formset.save()
- success += 1
- """ Get the event formset, validate and save. """
- event_formset = PresentationEventInlineFormset(request.POST, request.FILES, instance=presentation, prefix='event')
- if event_formset.is_valid():
- event_formset.save()
- success += 1
+ self.person_formset = PresentationPersonInlineFormset(request.POST, request.FILES, prefix='person')
+ self.event_formset = PresentationEventInlineFormset(request.POST, request.FILES, prefix='event')
+ self.submission_form = PresentationSubmissionForm(request.POST, request.FILES, prefix='submission')
+ """ Check all for validity """
+ presentation_ok = self.presentation_form.is_valid()
+ submission_ok = self.submission_form.is_valid()
+ person_ok = self.person_formset.is_valid()
+ """ Only other event type needs a valid event formset. """
+ print(presentation_ok, person_ok, event_ok, submission_ok)
+ print(self.submission_form)
+ if presentation_ok and self.presentation_form.cleaned_data[u'type'] == 'other':
+ event_ok = self.event_formset.is_valid()
else:
- """ Create the formsets without the PresentationInstance, so their validation results can be displayed. """
- self.person_formset = PresentationPersonInlineFormset(request.POST, request.FILES, prefix='person')
- self.event_formset = PresentationEventInlineFormset(request.POST, request.FILES, prefix='event')
- """ Everything was good, go to success URI or something, i don't know. """
- if success == 3:
+ event_ok = True
+ """ Only if everything is alright, store it."""
+ if presentation_ok == True and person_ok == True and event_ok == True and submission_ok == True:
+ presentation = self.presentation_form.save()
+ """ Now we can create the other ones based on the saved presentation to save them, too. """
+ submission_form = PresentationSubmissionForm(request.POST, request.FILES, instance=presentation, prefix='submission')
+ submission_form.save()
+ person_formset = PresentationPersonInlineFormset(request.POST, request.FILES, instance=presentation, prefix='person')
+ person_formset.save()
+ """ Conditionally save the events depending on whether they are needed. """
+ if presentation.type == 'other':
+ event_formset = PresentationEventInlineFormset(request.POST, request.FILES, instance=presentation, prefix='event')
+ event_formset.save()
+ """ we're done. """
self.success = True
self.create_blank_forms()
else: