Source code for pretalx.submission.models.track

# SPDX-FileCopyrightText: 2017-present Tobias Kunze
# SPDX-License-Identifier: AGPL-3.0-only WITH LicenseRef-Pretalx-AGPL-3.0-Terms

from django.core.validators import RegexValidator
from django.db import models
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
from i18nfield.fields import I18nCharField, I18nTextField

from pretalx.agenda.rules import is_agenda_visible
from pretalx.common.models.mixins import OrderedModel, PretalxModel
from pretalx.common.urls import EventUrls
from pretalx.event.rules import can_change_event_settings
from pretalx.submission.rules import (
    is_cfp_open,
    orga_can_change_submissions,
    use_tracks,
)
from pretalx.submission.validators.track import validate_unique_track_name


[docs] class Track(OrderedModel, PretalxModel): """A track groups :class:`~pretalx.submission.models.submission.Submission` objects within an :class:`~pretalx.event.models.event.Event`, e.g. by topic. :param color: The track colour, in the format #012345. """ event = models.ForeignKey( to="event.Event", on_delete=models.PROTECT, related_name="tracks" ) name = I18nCharField(max_length=200, verbose_name=_("Name")) description = I18nTextField(verbose_name=_("Description"), blank=True) color = models.CharField( max_length=7, verbose_name=_("Colour"), validators=[RegexValidator("#([0-9A-Fa-f]{3}){1,2}")], ) position = models.PositiveIntegerField( null=True, blank=True, help_text="The position field is used to determine the order that tracks are displayed in (lowest first).", ) requires_access_code = models.BooleanField( verbose_name=_("Requires access code"), help_text=_( "This track will only be shown to submitters with a matching access code." ), default=False, ) attendee_signup_required = models.BooleanField( verbose_name=_("Requires signup"), help_text=_( "Sessions will require attendee signup by default. " "You can always override this setting for individual sessions." ), default=False, ) log_prefix = "pretalx.track" class Meta: ordering = ("position",) rules_permissions = { "list": use_tracks & (is_agenda_visible | orga_can_change_submissions), "view": use_tracks & (is_cfp_open | is_agenda_visible | orga_can_change_submissions), "orga_list": use_tracks & orga_can_change_submissions, "orga_view": use_tracks & orga_can_change_submissions, "create": use_tracks & can_change_event_settings, "update": use_tracks & can_change_event_settings, "delete": use_tracks & can_change_event_settings, } class urls(EventUrls): base = edit = "{self.event.cfp.urls.tracks}{self.pk}/" delete = "{base}delete/" prefilled_cfp = "{self.event.cfp.urls.public}?track={self.slug}" def __str__(self) -> str: return str(self.name) @property def log_parent(self): return self.event @staticmethod def get_order_queryset(event): return event.tracks.all() def delete(self, *args, **kwargs): from pretalx.submission.domain.access_code import ( # noqa: PLC0415 -- thin method delete_orphan_access_codes, ) delete_orphan_access_codes(self.submitter_access_codes, "tracks") return super().delete(*args, **kwargs) delete.alters_data = True @property def slug(self) -> str: """The slug makes tracks more readable in URLs. It consists of the ID, followed by a slugified (and, in lookups, optional) form of the track name. """ return f"{self.id}-{slugify(self.name)}" def clean(self): super().clean() validate_unique_track_name(self)