forked from rc/aircox
cfr #121 Co-authored-by: Christophe Siraut <d@tobald.eu.org> Co-authored-by: bkfox <thomas bkfox net> Co-authored-by: Thomas Kairos <thomas@bkfox.net> Reviewed-on: rc/aircox#131 Co-authored-by: Chris Tactic <ctactic@noreply.git.radiocampus.be> Co-committed-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
73 lines
2.1 KiB
Python
73 lines
2.1 KiB
Python
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
from taggit.managers import TaggableManager
|
|
|
|
|
|
from .episode import Episode
|
|
from .sound import Sound
|
|
|
|
|
|
__all__ = ("Track",)
|
|
|
|
|
|
class Track(models.Model):
|
|
"""Track of a playlist of an object.
|
|
|
|
The position can either be expressed as the position in the playlist
|
|
or as the moment in seconds it started.
|
|
"""
|
|
|
|
episode = models.ForeignKey(
|
|
Episode,
|
|
models.CASCADE,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name=_("episode"),
|
|
)
|
|
sound = models.ForeignKey(
|
|
Sound,
|
|
models.CASCADE,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name=_("sound"),
|
|
)
|
|
position = models.PositiveSmallIntegerField(
|
|
_("order"),
|
|
default=0,
|
|
help_text=_("position in the playlist"),
|
|
)
|
|
timestamp = models.PositiveSmallIntegerField(
|
|
_("timestamp"),
|
|
blank=True,
|
|
null=True,
|
|
help_text=_("position (in seconds)"),
|
|
)
|
|
title = models.CharField(_("title"), max_length=128)
|
|
artist = models.CharField(_("artist"), max_length=128)
|
|
album = models.CharField(_("album"), max_length=128, null=True, blank=True)
|
|
tags = TaggableManager(verbose_name=_("tags"), blank=True)
|
|
year = models.IntegerField(_("year"), blank=True, null=True)
|
|
# FIXME: remove?
|
|
info = models.CharField(
|
|
_("information"),
|
|
max_length=128,
|
|
blank=True,
|
|
null=True,
|
|
help_text=_(
|
|
"additional informations about this track, such as " "the version, if is it a remix, features, etc."
|
|
),
|
|
)
|
|
|
|
class Meta:
|
|
verbose_name = _("Track")
|
|
verbose_name_plural = _("Tracks")
|
|
ordering = ("position",)
|
|
|
|
def __str__(self):
|
|
return "{self.artist} -- {self.title} -- {self.position}".format(self=self)
|
|
|
|
def save(self, *args, **kwargs):
|
|
if (self.sound is None and self.episode is None) or (self.sound is not None and self.episode is not None):
|
|
raise ValueError("sound XOR episode is required")
|
|
super().save(*args, **kwargs)
|