Changeset - f98a3f2f9a46
[Not reviewed]
0 3 0
Brian Rosner - 12 years ago 2012-09-20 01:18:29
brosner@gmail.com
added ability to remove content from slots
3 files changed with 28 insertions and 17 deletions:
0 comments (0 inline, 0 general)
symposion/schedule/forms.py
Show inline comments
 
from django import forms
 
from django.db.models import Q
 

	
 
from symposion.schedule.models import Presentation
 

	
 

	
 
class SlotEditForm(forms.Form):
 
    
 
    presentation = forms.ModelChoiceField(
 
        queryset=Presentation.objects.all(),
 
        required=True,
 
    )
 
    presentation = forms.ModelChoiceField(queryset=Presentation.objects.all())
 
    
 
    def __init__(self, *args, **kwargs):
 
        presentation = kwargs.get("initial", {}).get("presentation")
 
        content = kwargs.pop("content", None)
 
        if content:
 
            kwargs.setdefault("initial", {})["presentation"] = content
 
        super(SlotEditForm, self).__init__(*args, **kwargs)
 
        queryset = self.fields["presentation"].queryset
 
        if presentation:
 
            queryset = queryset.filter(Q(slot=None) | Q(pk=presentation.pk))
 
        if content:
 
            queryset = queryset.filter(Q(slot=None) | Q(pk=content.pk))
 
            self.fields["presentation"].required = False
 
        else:
 
            queryset = queryset.filter(slot=None)
 
            self.fields["presentation"].required = True
 
        self.fields["presentation"].queryset = queryset
symposion/schedule/models.py
Show inline comments
...
 
@@ -7,101 +7,107 @@ from model_utils.managers import InheritanceManager
 
from symposion.proposals.models import ProposalBase
 
from symposion.conference.models import Section
 

	
 

	
 
class Schedule(models.Model):
 
    
 
    section = models.OneToOneField(Section)
 
    slug = models.SlugField(unique=True)
 

	
 

	
 
class Day(models.Model):
 
    
 
    schedule = models.ForeignKey(Schedule)
 
    date = models.DateField()
 
    
 
    class Meta:
 
        unique_together = [("schedule", "date")]
 

	
 

	
 
class Room(models.Model):
 
    
 
    schedule = models.ForeignKey(Schedule)
 
    name = models.CharField(max_length=65)
 
    order = models.PositiveIntegerField()
 

	
 

	
 
class SlotKind(models.Model):
 
    """
 
    A slot kind represents what kind a slot is. For example, a slot can be a
 
    break, lunch, or X-minute talk.
 
    """
 
    
 
    schedule = models.ForeignKey(Schedule)
 
    label = models.CharField(max_length=50)
 

	
 

	
 
class Slot(models.Model):
 
    
 
    day = models.ForeignKey(Day)
 
    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.
 
        """
 
        self.unassign()
 
        content.slot = self
 
        content.save()
 
    
 
    def unassign(self):
 
        """
 
        Unassign the associated content with this slot.
 
        """
 
        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):
 
    """
 
    Links a slot with a room.
 
    """
 
    
 
    slot = models.ForeignKey(Slot)
 
    room = models.ForeignKey(Room)
 
    
 
    class Meta:
 
        unique_together = [("slot", "room")]
 

	
 

	
 
class Presentation(models.Model):
 
    
 
    slot = models.OneToOneField(Slot, null=True, blank=True, related_name="content_ptr")
 
    title = models.CharField(max_length=100)
 
    description = MarkupField()
 
    abstract = MarkupField()
 
    speaker = models.ForeignKey("speakers.Speaker", related_name="presentations")
 
    additional_speakers = models.ManyToManyField("speakers.Speaker", blank=True)
 
    cancelled = models.BooleanField(default=False)
 
    proposal_base = models.OneToOneField(ProposalBase, related_name="presentation")
 
    section = models.ForeignKey(Section, related_name="presentations")
 
    
 
    @property
 
    def number(self):
 
        return self.proposal.number
 
    
 
    @property
 
    def proposal(self):
 
        if self.proposal_base_id is None:
 
            return None
 
        return ProposalBase.objects.get_subclass(pk=self.proposal_base_id)
 
    
 
    def speakers(self):
symposion/schedule/views.py
Show inline comments
...
 
@@ -22,66 +22,70 @@ def schedule_detail(request, slug=None):
 
    ctx = {
 
        "schedule": schedule,
 
    }
 
    return render(request, "schedule/schedule_detail.html", ctx)
 

	
 

	
 
def schedule_list(request):
 
    presentations = Presentation.objects.order_by("id")
 
    ctx = {
 
        "presentations": presentations,
 
    }
 
    return render(request, "schedule/schedule_list.html", ctx)
 

	
 

	
 
@login_required
 
def schedule_edit(request, slug=None):
 
    
 
    if not request.user.is_staff:
 
        raise Http404()
 
    
 
    qs = Schedule.objects.all()
 
    
 
    if slug is None:
 
        schedule = next(iter(qs), None)
 
        if schedule is None:
 
            raise Http404()
 
    else:
 
        schedule = get_object_or_404(qs, slug=slug)
 
    
 
    days_qs = Day.objects.filter(schedule=schedule)
 
    days = [TimeTable(day) for day in days_qs]
 
    form = SlotEditForm()
 
    ctx = {
 
        "schedule": schedule,
 
        "days": days,
 
        "form": form,
 
    }
 
    return render(request, "schedule/schedule_edit.html", ctx)
 

	
 

	
 
@login_required
 
def schedule_slot_edit(request, slot_pk):
 
    
 
    if not request.user.is_staff:
 
        raise Http404()
 
    
 
    slot = get_object_or_404(Slot, pk=slot_pk)
 
    
 
    # slot content
 
    try:
 
        content = slot.content
 
    except ObjectDoesNotExist:
 
        content = None
 
    
 
    if request.method == "POST":
 
        form = SlotEditForm(request.POST)
 
        form = SlotEditForm(request.POST, content=content)
 
        if form.is_valid():
 
            presentation = form.cleaned_data["presentation"]
 
            slot.assign(presentation)
 
            if presentation is None:
 
                slot.unassign()
 
            else:
 
                slot.assign(presentation)
 
        return redirect("schedule_edit_singleton")
 
    else:
 
        initial = {}
 
        try:
 
            initial["presentation"] = slot.content
 
        except ObjectDoesNotExist:
 
            pass
 
        form = SlotEditForm(initial=initial)
 
        form = SlotEditForm(content=content)
 
        ctx = {
 
            "form": form,
 
            "slot": slot,
 
        }
 
        return render(request, "schedule/_slot_edit.html", ctx)
0 comments (0 inline, 0 general)