Files @ 0fb224cbf6e2
Branch filter:

Location: symposion_app/symposion/schedule/models.py - annotation

Sheila Miguez
Merge pull request #62 from codersquid/json_endpoint

Adds a schedule_json view
c4db94b7e5fd
c4db94b7e5fd
7c102aefa3a5
143dbbce2891
143dbbce2891
7324d0303162
7324d0303162
5b7087f47829
5b7087f47829
5b7087f47829
143dbbce2891
143dbbce2891
36ab6d599ffc
143dbbce2891
c7592bc33e26
c7592bc33e26
36ab6d599ffc
3b46ba3012a4
3b46ba3012a4
36ab6d599ffc
1b579610618f
1b579610618f
143dbbce2891
143dbbce2891
143dbbce2891
36ab6d599ffc
77dc781e0d8b
143dbbce2891
36ab6d599ffc
3b46ba3012a4
3b46ba3012a4
36ab6d599ffc
77dc781e0d8b
77dc781e0d8b
1b579610618f
143dbbce2891
143dbbce2891
77dc781e0d8b
36ab6d599ffc
77dc781e0d8b
143dbbce2891
77dc781e0d8b
36ab6d599ffc
f698d00fc85f
f698d00fc85f
77dc781e0d8b
77dc781e0d8b
77dc781e0d8b
77dc781e0d8b
77dc781e0d8b
77dc781e0d8b
77dc781e0d8b
36ab6d599ffc
77dc781e0d8b
77dc781e0d8b
36ab6d599ffc
3b46ba3012a4
3b46ba3012a4
143dbbce2891
143dbbce2891
143dbbce2891
36ab6d599ffc
143dbbce2891
77dc781e0d8b
143dbbce2891
143dbbce2891
9977393d88d4
36ab6d599ffc
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
36ab6d599ffc
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
f98a3f2f9a46
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
36ab6d599ffc
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
7c102aefa3a5
36ab6d599ffc
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
0ebcc2f1247a
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
0ebcc2f1247a
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
c4db94b7e5fd
0ebcc2f1247a
f30dce6a61a8
f30dce6a61a8
f30dce6a61a8
36ab6d599ffc
3b46ba3012a4
3b46ba3012a4
36ab6d599ffc
d98f9b82a85b
d98f9b82a85b
2c954c3a055b
2c954c3a055b
2c954c3a055b
2c954c3a055b
2c954c3a055b
2c954c3a055b
36ab6d599ffc
2c954c3a055b
2c954c3a055b
36ab6d599ffc
3b46ba3012a4
3b46ba3012a4
36ab6d599ffc
2c954c3a055b
2c954c3a055b
d98f9b82a85b
7324d0303162
7324d0303162
7324d0303162
36ab6d599ffc
7c102aefa3a5
7324d0303162
fe29c708b911
fe29c708b911
7324d0303162
36ab6d599ffc
36ab6d599ffc
7324d0303162
db66749046bd
40aede0839a0
36ab6d599ffc
402a02097fb6
402a02097fb6
402a02097fb6
36ab6d599ffc
5b7087f47829
5b7087f47829
db66749046bd
db66749046bd
db66749046bd
36ab6d599ffc
7324d0303162
7324d0303162
7324d0303162
582597b7b85d
582597b7b85d
36ab6d599ffc
7324d0303162
402a02097fb6
36ab6d599ffc
d98f9b82a85b
d98f9b82a85b
import datetime

from django.core.exceptions import ObjectDoesNotExist
from django.db import models

from markitup.fields import MarkupField

from symposion.proposals.models import ProposalBase
from symposion.conference.models import Section


class Schedule(models.Model):

    section = models.OneToOneField(Section)
    published = models.BooleanField(default=True)
    hidden = models.BooleanField("Hide schedule from overall conference view", default=False)

    def __unicode__(self):
        return "%s Schedule" % self.section

    class Meta:
        ordering = ["section"]


class Day(models.Model):

    schedule = models.ForeignKey(Schedule)
    date = models.DateField()

    def __unicode__(self):
        return "%s" % self.date

    class Meta:
        unique_together = [("schedule", "date")]
        ordering = ["date"]


class Room(models.Model):

    schedule = models.ForeignKey(Schedule)
    name = models.CharField(max_length=65)
    order = models.PositiveIntegerField()

    def __unicode__(self):
        return self.name


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)

    def __unicode__(self):
        return self.label


class Slot(models.Model):

    day = models.ForeignKey(Day)
    kind = models.ForeignKey(SlotKind)
    start = models.TimeField()
    end = models.TimeField()
    content_override = MarkupField(blank=True)

    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()

    @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

    @property
    def start_datetime(self):
        return datetime.datetime(
            self.day.date.year,
            self.day.date.month,
            self.day.date.day,
            self.start.hour,
            self.start.minute)

    @property
    def end_datetime(self):
        return datetime.datetime(
            self.day.date.year,
            self.day.date.month,
            self.day.date.day,
            self.end.hour,
            self.end.minute)

    @property
    def length_in_minutes(self):
        return int(
            (self.end_datetime - self.start_datetime).total_seconds() / 60)

    @property
    def rooms(self):
        return Room.objects.filter(pk__in=self.slotroom_set.values("room"))

    def __unicode__(self):
        return "%s %s (%s - %s)" % (self.day, self.kind, self.start, self.end)

    class Meta:
        ordering = ["day", "start", "end"]


class SlotRoom(models.Model):
    """
    Links a slot with a room.
    """

    slot = models.ForeignKey(Slot)
    room = models.ForeignKey(Room)

    def __unicode__(self):
        return "%s %s" % (self.room, self.slot)

    class Meta:
        unique_together = [("slot", "room")]
        ordering = ["slot", "room__order"]


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", related_name="copresentations",
                                                 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):
        yield self.speaker
        for speaker in self.additional_speakers.all():
            if speaker.user:
                yield speaker

    def __unicode__(self):
        return "#%s %s (%s)" % (self.number, self.title, self.speaker)

    class Meta:
        ordering = ["slot"]