Make content submission form stuff much nicer. More DRY and more nice. Use one class with a form __init__ kwargs which sets eventtype
This commit is contained in:
parent
3180ec457d
commit
02a7af6303
|
@ -1,27 +1,132 @@
|
|||
from django import forms
|
||||
import logging
|
||||
from betterforms.multiform import MultiModelForm
|
||||
from collections import OrderedDict
|
||||
from .models import SpeakerProposal, EventProposal, EventTrack
|
||||
|
||||
from django import forms
|
||||
from django.forms.widgets import TextInput
|
||||
from django.utils.dateparse import parse_duration
|
||||
import logging
|
||||
|
||||
from .models import SpeakerProposal, EventProposal, EventTrack
|
||||
|
||||
logger = logging.getLogger("bornhack.%s" % __name__)
|
||||
|
||||
|
||||
class BaseSpeakerProposalForm(forms.ModelForm):
|
||||
class SpeakerProposalForm(forms.ModelForm):
|
||||
"""
|
||||
The BaseSpeakerProposalForm is not used directly.
|
||||
It is subclassed for each eventtype, where fields are removed or get new labels and help_text as needed
|
||||
The SpeakerProposalForm. Takes an EventType in __init__ and changes fields accordingly.
|
||||
"""
|
||||
class Meta:
|
||||
model = SpeakerProposal
|
||||
fields = ['name', 'biography', 'needs_oneday_ticket', 'submission_notes']
|
||||
|
||||
def __init__(self, camp, eventtype=None, *args, **kwargs):
|
||||
# initialise the form
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
class BaseEventProposalForm(forms.ModelForm):
|
||||
# adapt form based on EventType?
|
||||
if not eventtype:
|
||||
return
|
||||
|
||||
if eventtype.name == 'Debate':
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Guest Name'
|
||||
self.fields['name'].help_text = 'The name of a debate guest. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Guest Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the guest.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Guest Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this guest. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no free tickets for workshops
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
elif eventtype.name == 'Lightning Talk':
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Speaker Name'
|
||||
self.fields['name'].help_text = 'The name of the speaker. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Speaker Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the speaker.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Speaker Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this speaker. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no free tickets for lightning talks
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
elif eventtype.name == 'Music Act':
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Artist Name'
|
||||
self.fields['name'].help_text = 'The name of the artist. Can be a real name or artist alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Artist Description'
|
||||
self.fields['biography'].help_text = 'The description of the artist.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Artist Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this artist. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no oneday tickets for music acts
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
elif eventtype.name == 'Recreational Event':
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Host Name'
|
||||
self.fields['name'].help_text = 'The name of the event host. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Host Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the host.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Host Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this host. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no oneday tickets for music acts
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
elif eventtype.name == 'Talk':
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Speaker Name'
|
||||
self.fields['name'].help_text = 'The name of the speaker. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Speaker Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the speaker.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Speaker Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this speaker. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
elif eventtype.name == 'Workshop':
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Host Name'
|
||||
self.fields['name'].help_text = 'The name of the workshop host. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Host Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the host.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Host Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this host. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no free tickets for workshops
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
else:
|
||||
raise ImproperlyConfigured("Unsupported event type, don't know which form class to use")
|
||||
|
||||
|
||||
class EventProposalForm(forms.ModelForm):
|
||||
"""
|
||||
The BaseEventProposalForm is not used directly.
|
||||
It is subclassed for each eventtype, where fields are removed or get new labels and help_text as needed
|
||||
The EventProposalForm. Takes an EventType in __init__ and changes fields accordingly.
|
||||
"""
|
||||
class Meta:
|
||||
model = EventProposal
|
||||
|
@ -38,143 +143,34 @@ class BaseEventProposalForm(forms.ModelForm):
|
|||
# TODO: make sure the track is part of the current camp, needs camp as form kwarg to verify
|
||||
return track
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
def __init__(self, camp, eventtype=None, *args, **kwargs):
|
||||
# initialise form
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# disable the empty_label for the track select box
|
||||
self.fields['track'].empty_label = None
|
||||
self.fields['track'].queryset = EventTrack.objects.filter(camp=camp)
|
||||
|
||||
# make sure video_recording checkbox defaults to checked
|
||||
self.fields['allow_video_recording'].initial = True
|
||||
|
||||
|
||||
################################ EventType "Talk" ################################################
|
||||
|
||||
|
||||
class TalkEventProposalForm(BaseEventProposalForm):
|
||||
"""
|
||||
EventProposalForm with field names and help_text adapted to talk submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
if eventtype.name == 'Debate':
|
||||
# fix label and help_text for the title field
|
||||
self.fields['title'].label = 'Title of Talk'
|
||||
self.fields['title'].help_text = 'The title of this talk/presentation.'
|
||||
self.fields['title'].label = 'Title of debate'
|
||||
self.fields['title'].help_text = 'The title of this debate'
|
||||
|
||||
# fix label and help_text for the abstract field
|
||||
self.fields['abstract'].label = 'Abstract of Talk'
|
||||
self.fields['abstract'].help_text = 'The description/abstract of this talk/presentation. Explain what the audience will experience.'
|
||||
self.fields['abstract'].label = 'Description'
|
||||
self.fields['abstract'].help_text = 'The description of this debate'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Talk Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this talk. Only visible to yourself and the BornHack organisers.'
|
||||
self.fields['submission_notes'].label = 'Debate Act Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this debate. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no duration for talks
|
||||
del(self.fields['duration'])
|
||||
|
||||
|
||||
class TalkSpeakerProposalForm(BaseSpeakerProposalForm):
|
||||
"""
|
||||
SpeakerProposalForm with field labels and help_text adapted for talk submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Speaker Name'
|
||||
self.fields['name'].help_text = 'The name of the speaker. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Speaker Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the speaker.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Speaker Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this speaker. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
|
||||
################################ EventType "Lightning Talk" ################################################
|
||||
|
||||
|
||||
class LightningTalkEventProposalForm(TalkEventProposalForm):
|
||||
"""
|
||||
LightningTalkEventProposalForm is identical to TalkEventProposalForm for now. Keeping the class here for easy customisation later.
|
||||
"""
|
||||
pass
|
||||
|
||||
class LightningTalkSpeakerProposalForm(TalkSpeakerProposalForm):
|
||||
"""
|
||||
LightningTalkSpeakerProposalForm is identical to TalkSpeakerProposalForm except for no free tickets
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# no free tickets for lightning talks
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
|
||||
################################ EventType "Workshop" ################################################
|
||||
|
||||
|
||||
class WorkshopEventProposalForm(BaseEventProposalForm):
|
||||
"""
|
||||
EventProposalForm with field names and help_text adapted for workshop submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# fix label and help_text for the title field
|
||||
self.fields['title'].label = 'Workshop Title'
|
||||
self.fields['title'].help_text = 'The title of this workshop.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Workshop Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this workshop. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# fix label and help_text for the abstract field
|
||||
self.fields['abstract'].label = 'Workshop Abstract'
|
||||
self.fields['abstract'].help_text = 'The description/abstract of this workshop. Explain what the participants will learn.'
|
||||
|
||||
# no video recording for workshops
|
||||
del(self.fields['allow_video_recording'])
|
||||
|
||||
# duration field
|
||||
self.fields['duration'].label = 'Workshop Duration'
|
||||
self.fields['duration'].help_text = 'How much time (in minutes) should we set aside for this workshop? Please keep it between 60 and 180 minutes (1-3 hours).'
|
||||
|
||||
class WorkshopSpeakerProposalForm(BaseSpeakerProposalForm):
|
||||
"""
|
||||
SpeakerProposalForm with field labels and help_text adapted for workshop submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Host Name'
|
||||
self.fields['name'].help_text = 'The name of the workshop host. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Host Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the host.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Host Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this host. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no free tickets for workshops
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
|
||||
################################ EventType "Music" ################################################
|
||||
|
||||
|
||||
class MusicEventProposalForm(BaseEventProposalForm):
|
||||
"""
|
||||
EventProposalForm with field names and help_text adapted to music submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# better placeholder text for duration field
|
||||
self.fields['duration'].widget.attrs['placeholder'] = 'Debate Duration (minutes)'
|
||||
|
||||
elif eventtype.name == 'Music Act':
|
||||
# fix label and help_text for the title field
|
||||
self.fields['title'].label = 'Title of music act'
|
||||
self.fields['title'].help_text = 'The title of this music act/concert/set.'
|
||||
|
@ -193,40 +189,7 @@ class MusicEventProposalForm(BaseEventProposalForm):
|
|||
# better placeholder text for duration field
|
||||
self.fields['duration'].widget.attrs['placeholder'] = 'Duration (minutes)'
|
||||
|
||||
|
||||
class MusicSpeakerProposalForm(BaseSpeakerProposalForm):
|
||||
"""
|
||||
SpeakerProposalForm with field labels and help_text adapted for music submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Artist Name'
|
||||
self.fields['name'].help_text = 'The name of the artist. Can be a real name or artist alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Artist Description'
|
||||
self.fields['biography'].help_text = 'The description of the artist.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Artist Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this artist. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no oneday tickets for music acts
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
|
||||
|
||||
################################ EventType "Slacking Off" ################################################
|
||||
|
||||
|
||||
class SlackEventProposalForm(BaseEventProposalForm):
|
||||
"""
|
||||
EventProposalForm with field names and help_text adapted to slacking off submissions
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
elif eventtype.name == 'Recreational Event':
|
||||
# fix label and help_text for the title field
|
||||
self.fields['title'].label = 'Event Title'
|
||||
self.fields['title'].help_text = 'The title of this recreational event'
|
||||
|
@ -246,26 +209,42 @@ class SlackEventProposalForm(BaseEventProposalForm):
|
|||
self.fields['duration'].label = 'Event Duration'
|
||||
self.fields['duration'].widget.attrs['placeholder'] = 'Duration (minutes)'
|
||||
|
||||
elif eventtype.name == 'Talk' or eventtype.name == 'Lightning Talk':
|
||||
# fix label and help_text for the title field
|
||||
self.fields['title'].label = 'Title of Talk'
|
||||
self.fields['title'].help_text = 'The title of this talk/presentation.'
|
||||
|
||||
class SlackSpeakerProposalForm(BaseSpeakerProposalForm):
|
||||
"""
|
||||
SpeakerProposalForm with field labels and help_text adapted for recreational events
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# fix label and help_text for the name field
|
||||
self.fields['name'].label = 'Host Name'
|
||||
self.fields['name'].help_text = 'The name of the event host. Can be a real name or an alias.'
|
||||
|
||||
# fix label and help_text for the biograpy field
|
||||
self.fields['biography'].label = 'Host Biography'
|
||||
self.fields['biography'].help_text = 'The biography of the host.'
|
||||
# fix label and help_text for the abstract field
|
||||
self.fields['abstract'].label = 'Abstract of Talk'
|
||||
self.fields['abstract'].help_text = 'The description/abstract of this talk/presentation. Explain what the audience will experience.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Host Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this host. Only visible to yourself and the BornHack organisers.'
|
||||
self.fields['submission_notes'].label = 'Talk Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this talk. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# no oneday tickets for music acts
|
||||
del(self.fields['needs_oneday_ticket'])
|
||||
# no duration for talks
|
||||
del(self.fields['duration'])
|
||||
|
||||
elif eventtype.name == 'Workshop':
|
||||
# fix label and help_text for the title field
|
||||
self.fields['title'].label = 'Workshop Title'
|
||||
self.fields['title'].help_text = 'The title of this workshop.'
|
||||
|
||||
# fix label and help_text for the submission_notes field
|
||||
self.fields['submission_notes'].label = 'Workshop Notes'
|
||||
self.fields['submission_notes'].help_text = 'Private notes regarding this workshop. Only visible to yourself and the BornHack organisers.'
|
||||
|
||||
# fix label and help_text for the abstract field
|
||||
self.fields['abstract'].label = 'Workshop Abstract'
|
||||
self.fields['abstract'].help_text = 'The description/abstract of this workshop. Explain what the participants will learn.'
|
||||
|
||||
# no video recording for workshops
|
||||
del(self.fields['allow_video_recording'])
|
||||
|
||||
# duration field
|
||||
self.fields['duration'].label = 'Workshop Duration'
|
||||
self.fields['duration'].help_text = 'How much time (in minutes) should we set aside for this workshop? Please keep it between 60 and 180 minutes (1-3 hours).'
|
||||
|
||||
else:
|
||||
raise ImproperlyConfigured("Unsupported event type, don't know which form class to use")
|
||||
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
from django.core.exceptions import ImproperlyConfigured
|
||||
from .forms import *
|
||||
|
||||
def get_speakerproposal_form_class(eventtype):
|
||||
"""
|
||||
Return a SpeakerProposal form class suitable for the provided EventType
|
||||
"""
|
||||
if eventtype.name == 'Music Act':
|
||||
return MusicSpeakerProposalForm
|
||||
elif eventtype.name == 'Talk':
|
||||
return TalkSpeakerProposalForm
|
||||
elif eventtype.name == 'Workshop':
|
||||
return WorkshopSpeakerProposalForm
|
||||
elif eventtype.name == 'Lightning Talk':
|
||||
return LightningTalkSpeakerProposalForm
|
||||
elif eventtype.name == 'Recreational Event':
|
||||
return SlackSpeakerProposalForm
|
||||
else:
|
||||
raise ImproperlyConfigured("Unsupported event type, don't know which form class to use")
|
||||
|
||||
|
||||
def get_eventproposal_form_class(eventtype):
|
||||
"""
|
||||
Return an EventProposal form class suitable for the provided EventType
|
||||
"""
|
||||
if eventtype.name == 'Music Act':
|
||||
return MusicEventProposalForm
|
||||
elif eventtype.name == 'Talk':
|
||||
return TalkEventProposalForm
|
||||
elif eventtype.name == 'Workshop':
|
||||
return WorkshopEventProposalForm
|
||||
elif eventtype.name == 'Lightning Talk':
|
||||
return LightningTalkEventProposalForm
|
||||
elif eventtype.name == 'Recreational Event':
|
||||
return SlackEventProposalForm
|
||||
else:
|
||||
raise ImproperlyConfigured("Unsupported event type, don't know which form class to use")
|
||||
|
|
@ -34,8 +34,7 @@ from .email import (
|
|||
add_eventproposal_updated_email
|
||||
)
|
||||
from . import models
|
||||
from .utils import get_speakerproposal_form_class, get_eventproposal_form_class
|
||||
from .forms import BaseSpeakerProposalForm
|
||||
from .forms import SpeakerProposalForm, EventProposalForm
|
||||
|
||||
|
||||
logger = logging.getLogger("bornhack.%s" % __name__)
|
||||
|
@ -129,6 +128,7 @@ class SpeakerProposalCreateView(LoginRequiredMixin, CampViewMixin, EnsureWritabl
|
|||
""" This view allows a user to create a new SpeakerProposal linked to an existing EventProposal """
|
||||
model = models.SpeakerProposal
|
||||
template_name = 'speakerproposal_form.html'
|
||||
form_class = SpeakerProposalForm
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
""" Get the eventproposal object """
|
||||
|
@ -138,8 +138,16 @@ class SpeakerProposalCreateView(LoginRequiredMixin, CampViewMixin, EnsureWritabl
|
|||
def get_success_url(self):
|
||||
return reverse('program:proposal_list', kwargs={'camp_slug': self.camp.slug})
|
||||
|
||||
def get_form_class(self):
|
||||
return get_speakerproposal_form_class(eventtype=self.eventproposal.event_type)
|
||||
def get_form_kwargs(self):
|
||||
"""
|
||||
Set camp and eventtype for the form
|
||||
"""
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs.update({
|
||||
'camp': self.camp,
|
||||
'eventtype': self.eventproposal.event_type
|
||||
})
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
@ -170,22 +178,34 @@ class SpeakerProposalUpdateView(LoginRequiredMixin, CampViewMixin, EnsureWritabl
|
|||
"""
|
||||
model = models.SpeakerProposal
|
||||
template_name = 'speakerproposal_form.html'
|
||||
form_class = SpeakerProposalForm
|
||||
|
||||
|
||||
def get_form_class(self):
|
||||
""" Get the appropriate form class based on the eventtype """
|
||||
def get_form_kwargs(self):
|
||||
"""
|
||||
Set camp and eventtype for the form
|
||||
"""
|
||||
kwargs = super().get_form_kwargs()
|
||||
if self.get_object().eventproposals.count() == 1:
|
||||
# determine which form to use based on the type of event associated with the proposal
|
||||
return get_speakerproposal_form_class(self.get_object().eventproposals.get().event_type)
|
||||
eventtype = self.get_object().eventproposals.get().event_type
|
||||
else:
|
||||
# more than one eventproposal. If all events are the same type we can still show a non-generic form here
|
||||
eventtypes = set()
|
||||
for ep in self.get_object().eventproposals.all():
|
||||
eventtypes.add(ep.event_type)
|
||||
if len(eventtypes) == 1:
|
||||
return get_speakerproposal_form_class(ep.event_type)
|
||||
eventtype = self.get_object().eventproposals.get().event_type
|
||||
else:
|
||||
# more than one type of event for this person, return the generic speakerproposal form
|
||||
return BaseSpeakerProposalForm
|
||||
eventtype = None
|
||||
|
||||
# add camp and eventtype to form kwargs
|
||||
kwargs.update({
|
||||
'camp': self.camp,
|
||||
'eventtype': eventtype
|
||||
})
|
||||
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
"""
|
||||
|
@ -365,10 +385,7 @@ class EventProposalCreateView(LoginRequiredMixin, CampViewMixin, EnsureWritableC
|
|||
"""
|
||||
model = models.EventProposal
|
||||
template_name = 'eventproposal_form.html'
|
||||
|
||||
def get_form_class(self):
|
||||
""" Get the appropriate form class based on the eventtype """
|
||||
return get_eventproposal_form_class(self.event_type)
|
||||
form_class = EventProposalForm
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
""" Get the speakerproposal object """
|
||||
|
@ -383,16 +400,16 @@ class EventProposalCreateView(LoginRequiredMixin, CampViewMixin, EnsureWritableC
|
|||
context['event_type'] = self.event_type
|
||||
return context
|
||||
|
||||
def get_form(self):
|
||||
def get_form_kwargs(self):
|
||||
"""
|
||||
Override get_form() method so we can set the queryset for the track selector.
|
||||
Usually this kind of thing would go into get_initial() but that does not work for some reason, so we do it here instead.
|
||||
Set camp and eventtype for the form
|
||||
"""
|
||||
form_class = self.get_form_class()
|
||||
form = form_class(**self.get_form_kwargs())
|
||||
form.fields['track'].queryset = models.EventTrack.objects.filter(camp=self.camp)
|
||||
return form
|
||||
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs.update({
|
||||
'camp': self.camp,
|
||||
'eventtype': self.event_type
|
||||
})
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
# set camp and user for this eventproposal
|
||||
|
@ -418,11 +435,18 @@ class EventProposalCreateView(LoginRequiredMixin, CampViewMixin, EnsureWritableC
|
|||
class EventProposalUpdateView(LoginRequiredMixin, CampViewMixin, EnsureWritableCampMixin, EnsureUserOwnsProposalMixin, EnsureCFPOpenMixin, UpdateView):
|
||||
model = models.EventProposal
|
||||
template_name = 'eventproposal_form.html'
|
||||
form_class = EventProposalForm
|
||||
|
||||
def get_form_class(self):
|
||||
""" Get the appropriate form class based on the eventtype """
|
||||
return get_eventproposal_form_class(self.get_object().event_type)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
"""
|
||||
Set camp and eventtype for the form
|
||||
"""
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs.update({
|
||||
'camp': self.camp,
|
||||
'eventtype': self.get_object().event_type
|
||||
})
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
""" Make speakerproposal and eventtype objects available in the template """
|
||||
|
@ -430,16 +454,6 @@ class EventProposalUpdateView(LoginRequiredMixin, CampViewMixin, EnsureWritableC
|
|||
context['event_type'] = self.get_object().event_type
|
||||
return context
|
||||
|
||||
def get_form(self):
|
||||
"""
|
||||
Override get_form() method so we can set the queryset for the track selector.
|
||||
Usually this kind of thing would go into get_initial() but that does not work for some reason, so we do it here instead.
|
||||
"""
|
||||
form_class = self.get_form_class()
|
||||
form = form_class(**self.get_form_kwargs())
|
||||
form.fields['track'].queryset = models.EventTrack.objects.filter(camp=self.camp)
|
||||
return form
|
||||
|
||||
def form_valid(self, form):
|
||||
# set status to pending and save eventproposal
|
||||
form.instance.proposal_status = models.EventProposal.PROPOSAL_PENDING
|
||||
|
@ -588,11 +602,7 @@ class CombinedProposalSubmitView(LoginRequiredMixin, CampViewMixin, CreateView):
|
|||
"""
|
||||
if hasattr(self, 'speakerproposal'):
|
||||
# we already have a speakerproposal, just show an eventproposal form
|
||||
return get_eventproposal_form_class(eventtype=self.eventtype)
|
||||
|
||||
# get the two forms we need to build the MultiModelForm
|
||||
SpeakerProposalForm = get_speakerproposal_form_class(eventtype=self.eventtype)
|
||||
EventProposalForm = get_eventproposal_form_class(eventtype=self.eventtype)
|
||||
return EventProposalForm
|
||||
|
||||
# build our MultiModelForm
|
||||
class CombinedProposalSubmitForm(MultiModelForm):
|
||||
|
@ -604,15 +614,16 @@ class CombinedProposalSubmitView(LoginRequiredMixin, CampViewMixin, CreateView):
|
|||
# return the form class
|
||||
return CombinedProposalSubmitForm
|
||||
|
||||
def get_form(self):
|
||||
def get_form_kwargs(self):
|
||||
"""
|
||||
Override get_form() method so we can set the queryset for the track selector.
|
||||
Usually this kind of thing would go into get_initial() but that does not work for some reason, so we do it here instead.
|
||||
Set camp and eventtype for the form
|
||||
"""
|
||||
form_class = self.get_form_class()
|
||||
form = form_class(**self.get_form_kwargs())
|
||||
form.forms['eventproposal'].fields['track'].queryset = models.EventTrack.objects.filter(camp=self.camp)
|
||||
return form
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs.update({
|
||||
'camp': self.camp,
|
||||
'eventtype': self.eventtype
|
||||
})
|
||||
return kwargs
|
||||
|
||||
|
||||
###################################################################################################
|
||||
|
|
Loading…
Reference in a new issue