import datetime
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model
from django.db import models
from django.utils.translation import ugettext_lazy as _
from symposion.managers import DefaultSelectRelatedManager
from symposion.text_parser import parse
from symposion.proposals.models import ProposalBase
from symposion.conference.models import Section
from symposion.speakers.models import Speaker
User = get_user_model()
class Schedule(models.Model):
objects = DefaultSelectRelatedManager()
section = models.OneToOneField(Section, verbose_name=_("Section"))
section = models.OneToOneField(
Section,
verbose_name=_("Section"),
on_delete=models.CASCADE,
)
published = models.BooleanField(default=True, verbose_name=_("Published"))
hidden = models.BooleanField(_("Hide schedule from overall conference view"), default=False)
def __str__(self):
return "%s Schedule" % self.section
@@ -32,13 +38,17 @@ class Schedule(models.Model):
class Day(models.Model):
schedule = models.ForeignKey(Schedule, verbose_name=_("Schedule"))
schedule = models.ForeignKey(
Schedule,
verbose_name=_("Schedule"),
date = models.DateField(verbose_name=_("Date"))
return "%s: %s" % (self.schedule.section.name, self.date)
class SymposionMeta:
@@ -50,13 +60,17 @@ class Day(models.Model):
verbose_name = _("date")
verbose_name_plural = _("dates")
class Room(models.Model):
name = models.CharField(max_length=65, verbose_name=_("Name"))
order = models.PositiveIntegerField(verbose_name=_("Order"))
def __unicode__(self):
return self.name
@@ -67,14 +81,14 @@ class Room(models.Model):
verbose_name = _("Room")
verbose_name_plural = _("Rooms")
class Track(models.Model):
name = models.CharField(max_length=80, verbose_name=_("Track"))
room = models.ForeignKey(Room)
day = models.ForeignKey(Day)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
day = models.ForeignKey(Day, on_delete=models.CASCADE)
class Meta:
unique_together = [('room', 'day')]
@@ -85,13 +99,17 @@ class Track(models.Model):
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, verbose_name=_("schedule"))
verbose_name=_("schedule"),
label = models.CharField(max_length=50, verbose_name=_("Label"))
return ": ".join((self.schedule.section.name, self.label))
@@ -100,14 +118,22 @@ class SlotKind(models.Model):
class Slot(models.Model):
name = models.CharField(max_length=512, editable=False)
day = models.ForeignKey(Day, verbose_name=_("Day"))
kind = models.ForeignKey(SlotKind, verbose_name=_("Kind"))
day = models.ForeignKey(
Day,
verbose_name=_("Day"),
kind = models.ForeignKey(
SlotKind,
verbose_name=_("Kind"),
start = models.TimeField(verbose_name=_("Start"))
end = models.TimeField(verbose_name=_("End"))
exclusive = models.BooleanField(
default=False,
help_text=_("Set to true if this is the only event during this "
"timeslot"),
@@ -191,14 +217,22 @@ class Slot(models.Model):
class SlotRoom(models.Model):
Links a slot with a room.
slot = models.ForeignKey(Slot, verbose_name=_("Slot"))
room = models.ForeignKey(Room, verbose_name=_("Room"))
slot = models.ForeignKey(
Slot,
verbose_name=_("Slot"),
room = models.ForeignKey(
Room,
verbose_name=_("Room"),
return "%s %s" % (self.room, self.slot)
unique_together = [("slot", "room")]
@@ -207,26 +241,48 @@ class SlotRoom(models.Model):
verbose_name_plural = _("Slot rooms")
class Presentation(models.Model):
slot = models.OneToOneField(Slot, null=True, blank=True, related_name="content_ptr", verbose_name=_("Slot"))
slot = models.OneToOneField(
null=True,
blank=True,
related_name="content_ptr",
title = models.CharField(max_length=100, verbose_name=_("Title"))
abstract = models.TextField(verbose_name=_("Abstract"))
abstract_html = models.TextField(blank=True)
speaker = models.ForeignKey(Speaker, related_name="presentations", verbose_name=_("Speaker"))
speaker = models.ForeignKey(
Speaker,
related_name="presentations",
verbose_name=_("Speaker"),
additional_speakers = models.ManyToManyField(Speaker, related_name="copresentations",
blank=True, verbose_name=_("Additional speakers"))
unpublish = models.BooleanField(
verbose_name=_("Do not publish"),
cancelled = models.BooleanField(default=False, verbose_name=_("Cancelled"))
proposal_base = models.OneToOneField(ProposalBase, related_name="presentation", verbose_name=_("Proposal base"))
section = models.ForeignKey(Section, related_name="presentations", verbose_name=_("Section"))
proposal_base = models.OneToOneField(
ProposalBase,
related_name="presentation",
verbose_name=_("Proposal base"),
section = models.ForeignKey(
def save(self, *args, **kwargs):
self.abstract_html = parse(self.abstract)
return super(Presentation, self).save(*args, **kwargs)
@property
@@ -253,13 +309,18 @@ class Presentation(models.Model):
verbose_name = _("presentation")
verbose_name_plural = _("presentations")
class Session(models.Model):
day = models.ForeignKey(Day, related_name="sessions", verbose_name=_("Day"))
related_name="sessions",
slots = models.ManyToManyField(Slot, related_name="sessions", verbose_name=_("Slots"))
def sorted_slots(self):
return self.slots.order_by("start")
def start(self):
@@ -315,14 +376,22 @@ class SessionRole(models.Model):
SESSION_ROLE_TYPES = [
(SESSION_ROLE_CHAIR, _("Session Chair")),
(SESSION_ROLE_RUNNER, _("Session Runner")),
]
session = models.ForeignKey(Session, verbose_name=_("Session"))
user = models.ForeignKey(User, verbose_name=_("User"))
session = models.ForeignKey(
Session,
verbose_name=_("Session"),
user = models.ForeignKey(
User,
verbose_name=_("User"),
role = models.IntegerField(choices=SESSION_ROLE_TYPES, verbose_name=_("Role"))
status = models.NullBooleanField(verbose_name=_("Status"))
submitted = models.DateTimeField(default=datetime.datetime.now)