diff --git a/symposion/schedule/forms.py b/symposion/schedule/forms.py index 1ab7de0f..6b4bf100 100644 --- a/symposion/schedule/forms.py +++ b/symposion/schedule/forms.py @@ -1,4 +1,5 @@ from django import forms +from django.db.models import Q from symposion.schedule.models import Presentation @@ -6,6 +7,16 @@ from symposion.schedule.models import Presentation class SlotEditForm(forms.Form): presentation = forms.ModelChoiceField( - queryset=Presentation.objects.filter(slot__isnull=True), + queryset=Presentation.objects.all(), required=True, ) + + def __init__(self, *args, **kwargs): + presentation = kwargs.get("initial", {}).get("presentation") + super(SlotEditForm, self).__init__(*args, **kwargs) + queryset = self.fields["presentation"].queryset + if presentation: + queryset = queryset.filter(Q(slot=None) | Q(pk=presentation.pk)) + else: + queryset = queryset.filter(slot=None) + self.fields["presentation"].queryset = queryset diff --git a/symposion/schedule/models.py b/symposion/schedule/models.py index d837f448..9e9e9159 100644 --- a/symposion/schedule/models.py +++ b/symposion/schedule/models.py @@ -1,6 +1,8 @@ +from django.core.exceptions import ObjectDoesNotExist from django.db import models from markitup.fields import MarkupField +from model_utils.managers import InheritanceManager from symposion.proposals.models import ProposalBase from symposion.conference.models import Section @@ -44,6 +46,28 @@ class Slot(models.Model): kind = models.ForeignKey(SlotKind) start = models.TimeField() end = models.TimeField() + + def assign(self, content): + """ + Assign the given content to this slot and if a previous slot content + was given we need to unlink it to avoid integrity errors. + """ + if self.content and self.content.slot_id: + self.content.slot = None + self.content.save() + content.slot = self + content.save() + + @property + def content(self): + """ + Return the content this slot represents. + @@@ hard-coded for presentation for now + """ + try: + return self.content_ptr + except ObjectDoesNotExist: + return None class SlotRoom(models.Model): @@ -60,7 +84,7 @@ class SlotRoom(models.Model): class Presentation(models.Model): - slot = models.OneToOneField(Slot, null=True, blank=True, related_name="presentation") + slot = models.OneToOneField(Slot, null=True, blank=True, related_name="content_ptr") title = models.CharField(max_length=100) description = MarkupField() abstract = MarkupField() diff --git a/symposion/schedule/views.py b/symposion/schedule/views.py index 08a96227..3c4e0b42 100644 --- a/symposion/schedule/views.py +++ b/symposion/schedule/views.py @@ -1,3 +1,4 @@ +from django.core.exceptions import ObjectDoesNotExist from django.http import Http404 from django.shortcuts import render, get_object_or_404, redirect @@ -65,10 +66,22 @@ def schedule_slot_edit(request, slot_pk): raise Http404() slot = get_object_or_404(Slot, pk=slot_pk) - form = SlotEditForm(request.POST) - if form.is_valid(): - presentation = form.cleaned_data["presentation"] - presentation.slot = slot - presentation.save() - return redirect("schedule_edit_singleton") + if request.method == "POST": + form = SlotEditForm(request.POST) + if form.is_valid(): + presentation = form.cleaned_data["presentation"] + slot.assign(presentation) + return redirect("schedule_edit_singleton") + else: + initial = {} + try: + initial["presentation"] = slot.content + except ObjectDoesNotExist: + pass + form = SlotEditForm(initial=initial) + ctx = { + "form": form, + "slot": slot, + } + return render(request, "schedule/_slot_edit.html", ctx) diff --git a/symposion/templates/schedule/_grid.html b/symposion/templates/schedule/_grid.html index 2df4ede2..f3337b3c 100644 --- a/symposion/templates/schedule/_grid.html +++ b/symposion/templates/schedule/_grid.html @@ -11,11 +11,11 @@ {% for slot in row.slots %}