diff --git a/src/program/forms.py b/src/program/forms.py index a8a29ae3..9f03ebdb 100644 --- a/src/program/forms.py +++ b/src/program/forms.py @@ -1,6 +1,7 @@ import logging from django import forms +from django.core.exceptions import ImproperlyConfigured from .models import SpeakerProposal, EventProposal, EventTrack, Url, UrlType @@ -178,19 +179,26 @@ class EventProposalForm(forms.ModelForm): # TODO: make sure the track is part of the current camp, needs camp as form kwarg to verify return track - def save(self, user, event_type, commit=True): - self.instance.user = user - self.instance.event_type = event_type - super().save(commit=True) - if self.cleaned_data.get('slides_url') and (self.instance.event_type.name == 'Talk' or self.instance.event_type.name == 'Lightning Talk'): - slides_url = Url() - slides_url.eventproposal = self.instance - slides_url.url = self.cleaned_data['slides_url'] - slides_url.urltype = UrlType.objects.get(name="Slides") - slides_url.save() - return self.instance + def save(self, commit=True, user=None, event_type=None): + eventproposal = super().save(commit=False) + if user: + eventproposal.user = user + if event_type: + eventproposal.event_type = event_type + eventproposal.save() + if self.cleaned_data.get('slides_url') and event_type.name in ['Talk', 'Lightning Talk']: + url = self.cleaned_data.get('slides_url') + if not eventproposal.urls.filter(url=url).exists(): + slides_url = Url() + slides_url.eventproposal = eventproposal + slides_url.url = url + slides_url.urltype = UrlType.objects.get(name="Slides") + slides_url.save() + + return eventproposal + def __init__(self, camp, eventtype=None, *args, **kwargs): # initialise form super().__init__(*args, **kwargs) @@ -274,7 +282,7 @@ class EventProposalForm(forms.ModelForm): 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.' - if eventtype.name == "Lightning Talk": + if self.fields.get('slides_url') and eventtype.name == "Lightning Talk": self.fields['slides_url'].help_text += " You will only get assigned a slot if you have provided slides (a title slide is enough if you don't use slides for the talk). You can add an URL later if need be." # no duration for talks diff --git a/src/program/views.py b/src/program/views.py index d611cca9..af900b29 100644 --- a/src/program/views.py +++ b/src/program/views.py @@ -1,11 +1,9 @@ import logging -import os from collections import OrderedDict from django.views.generic import ListView, TemplateView, DetailView, View -from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView +from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.conf import settings -from django.views.decorators.http import require_safe from django.http import Http404, HttpResponse from django.utils.decorators import method_decorator from django.contrib.admin.views.decorators import staff_member_required @@ -14,14 +12,13 @@ from django.contrib import messages from django.urls import reverse, reverse_lazy from django.template import Engine, Context from django.shortcuts import redirect -from django.core.exceptions import ImproperlyConfigured from django.shortcuts import get_object_or_404 from betterforms.multiform import MultiModelForm import icalendar from camps.mixins import CampViewMixin +from program.models import Url, UrlType from .mixins import ( - EnsureUnapprovedProposalMixin, EnsureUserOwnsProposalMixin, EnsureWritableCampMixin, EnsureCFPOpenMixin, @@ -417,11 +414,7 @@ class EventProposalCreateView(LoginRequiredMixin, CampViewMixin, EnsureWritableC def form_valid(self, form): # set camp and user for this eventproposal - eventproposal = form.save( - user=self.request.user, - event_type=self.event_type, - commit=True, - ) + eventproposal = form.save(user=self.request.user, event_type=self.event_type) # add the speakerproposal to the eventproposal eventproposal.speakers.add(self.speakerproposal) @@ -569,10 +562,7 @@ class CombinedProposalSubmitView(LoginRequiredMixin, CampViewMixin, CreateView): Save the object(s) here before redirecting """ if hasattr(self, 'speakerproposal'): - eventproposal = form.save(commit=False) - eventproposal.user = self.request.user - eventproposal.event_type = self.eventtype - eventproposal.save() + eventproposal = form.save(user=self.request.user, event_type=self.eventtype) eventproposal.speakers.add(self.speakerproposal) else: # first save the SpeakerProposal @@ -584,7 +574,7 @@ class CombinedProposalSubmitView(LoginRequiredMixin, CampViewMixin, CreateView): speakerproposal.save() # then save the eventproposal - eventproposal = form['eventproposal'].save(commit=False) + eventproposal = form['eventproposal'].save(user=self.request.user, event_type=self.eventtype) eventproposal.user = self.request.user eventproposal.event_type = self.eventtype eventproposal.save()