class AbstractProposal(models.Model): """ A proposal represents a possible future session as it will be used before and during the review process. It has one mandatory speaker and possible additional speakers as well as a certain kind (training, session, ...), target-audience and proposed duration. """ conference = models.ForeignKey("conference.Conference", verbose_name="conference", on_delete=models.PROTECT) title = models.CharField(_("title"), max_length=100) description = models.TextField(_("description"), max_length=400) abstract = models.TextField(_("abstract")) notes = models.TextField(_("notes"), blank=True) speaker = models.ForeignKey("speakers.Speaker", related_name="%(class)ss", verbose_name=_("speaker"), on_delete=models.PROTECT) additional_speakers = models.ManyToManyField("speakers.Speaker", blank=True, null=True, related_name="%(class)s_participations", verbose_name=_("additional speakers")) submission_date = models.DateTimeField(_("submission date"), editable=False, default=now) modified_date = models.DateTimeField(_("modification date"), blank=True, null=True) kind = models.ForeignKey("conference.SessionKind", verbose_name=_("type"), on_delete=models.PROTECT) audience_level = models.ForeignKey("conference.AudienceLevel", verbose_name=_("target-audience"), on_delete=models.PROTECT) duration = models.ForeignKey("conference.SessionDuration", verbose_name=_("duration"), on_delete=models.PROTECT) track = models.ForeignKey("conference.Track", verbose_name=_("track"), blank=True, null=True, on_delete=models.PROTECT) available_timeslots = models.ManyToManyField(TimeSlot, verbose_name=_("available timeslots"), null=True, blank=True) language = models.CharField(_('language'), max_length=5, blank=False, default=LANGUAGES_CHOICES[0][0], choices=LANGUAGES_CHOICES) accept_recording = models.BooleanField(default=True, blank=True) tags = TaggableManager(blank=True) objects = models.Manager() current_conference = CurrentConferenceManager() class Meta(object): abstract = True def clean(self): super(AbstractProposal, self).clean() try: if self.conference is not None and self.duration.conference != self.conference: raise forms.ValidationError(_("The duration has to be associated with the same conference as the proposal")) except: pass def get_absolute_url(self): return reverse("view_proposal", kwargs=dict(pk=self.pk)) def __unicode__(self): try: return "{0} ({1})".format(self.title, self.conference) except: return self.title
class Event(models.Model): conference = models.ForeignKey(Conference, verbose_name=_("Conference")) title = models.CharField(_("Title"), max_length=255) date = models.DateTimeField(_("Date")) end_date = models.DateTimeField(_("End date"), blank=True, null=True) link = models.URLField(_("Link"), blank=True, null=True) objects = models.Manager() current_conference = CurrentConferenceManager() class Meta(object): verbose_name = _('event') verbose_name_plural = _('events') ordering = ['date']
class SponsorLevel(models.Model): conference = models.ForeignKey(Conference, verbose_name=_("conference")) name = models.CharField(_("name"), max_length=100) order = models.IntegerField(_("order"), default=0) description = models.TextField(_("description"), blank=True) slug = models.SlugField(_("slug")) objects = models.Manager() current_conference = CurrentConferenceManager() class Meta: ordering = ["conference", "order"] verbose_name = _("sponsor level") verbose_name_plural = _("sponsor levels") def __unicode__(self): return u"%s %s" % (self.conference, self.name) def sponsors(self): return self.sponsor_set.filter(active=True).order_by("added")