diff --git a/program/migrations/0013_auto_20220221_1637.py b/program/migrations/0013_auto_20220221_1637.py new file mode 100644 index 0000000000000000000000000000000000000000..73f259bed0321909a977ed1642eb5cc6d2dd9665 --- /dev/null +++ b/program/migrations/0013_auto_20220221_1637.py @@ -0,0 +1,515 @@ +# Generated by Django 3.2.11 on 2022-02-21 15:37 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import versatileimagefield.fields + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('program', '0012_rename_fields'), + ] + + operations = [ + migrations.AlterModelOptions( + name='category', + options={'ordering': ('name',)}, + ), + migrations.AlterModelOptions( + name='fundingcategory', + options={'ordering': ('name',)}, + ), + migrations.AlterModelOptions( + name='host', + options={'ordering': ('name',)}, + ), + migrations.AlterModelOptions( + name='language', + options={'ordering': ('language',)}, + ), + migrations.AlterModelOptions( + name='musicfocus', + options={'ordering': ('name',)}, + ), + migrations.AlterModelOptions( + name='note', + options={'ordering': ('timeslot',)}, + ), + migrations.AlterModelOptions( + name='rrule', + options={'ordering': ('pk',)}, + ), + migrations.AlterModelOptions( + name='schedule', + options={'ordering': ('dstart', 'tstart')}, + ), + migrations.AlterModelOptions( + name='show', + options={'ordering': ('slug',)}, + ), + migrations.AlterModelOptions( + name='timeslot', + options={'ordering': ('start', 'end')}, + ), + migrations.AlterModelOptions( + name='topic', + options={'ordering': ('name',)}, + ), + migrations.AlterModelOptions( + name='type', + options={'ordering': ('name',)}, + ), + migrations.AlterField( + model_name='category', + name='abbrev', + field=models.CharField(max_length=4, unique=True), + ), + migrations.AlterField( + model_name='category', + name='description', + field=models.TextField(blank=True), + ), + migrations.AlterField( + model_name='category', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='category', + name='name', + field=models.CharField(max_length=32), + ), + migrations.AlterField( + model_name='category', + name='slug', + field=models.SlugField(max_length=32, unique=True), + ), + migrations.AlterField( + model_name='fundingcategory', + name='abbrev', + field=models.CharField(max_length=4, unique=True), + ), + migrations.AlterField( + model_name='fundingcategory', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='fundingcategory', + name='name', + field=models.CharField(max_length=32), + ), + migrations.AlterField( + model_name='fundingcategory', + name='slug', + field=models.SlugField(max_length=32, unique=True), + ), + migrations.AlterField( + model_name='host', + name='biography', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='host', + name='email', + field=models.EmailField(blank=True, max_length=254), + ), + migrations.AlterField( + model_name='host', + name='height', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='host', + name='image', + field=versatileimagefield.fields.VersatileImageField(blank=True, height_field='height', null=True, upload_to='host_images', width_field='width'), + ), + migrations.AlterField( + model_name='host', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='host', + name='name', + field=models.CharField(max_length=128), + ), + migrations.AlterField( + model_name='host', + name='ppoi', + field=versatileimagefield.fields.PPOIField(default='0.5x0.5', editable=False, max_length=20), + ), + migrations.AlterField( + model_name='host', + name='website', + field=models.URLField(blank=True), + ), + migrations.AlterField( + model_name='host', + name='width', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='language', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='language', + name='name', + field=models.CharField(max_length=32), + ), + migrations.AlterField( + model_name='musicfocus', + name='abbrev', + field=models.CharField(max_length=4, unique=True), + ), + migrations.AlterField( + model_name='musicfocus', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='musicfocus', + name='name', + field=models.CharField(max_length=32), + ), + migrations.AlterField( + model_name='musicfocus', + name='slug', + field=models.SlugField(max_length=32, unique=True), + ), + migrations.AlterField( + model_name='note', + name='audio_url', + field=models.TextField(blank=True, editable=False), + ), + migrations.AlterField( + model_name='note', + name='cba_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='note', + name='content', + field=models.TextField(), + ), + migrations.AlterField( + model_name='note', + name='height', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='note', + name='image', + field=versatileimagefield.fields.VersatileImageField(blank=True, height_field='height', null=True, upload_to='note_images', width_field='width'), + ), + migrations.AlterField( + model_name='note', + name='ppoi', + field=versatileimagefield.fields.PPOIField(default='0.5x0.5', editable=False, max_length=20), + ), + migrations.AlterField( + model_name='note', + name='slug', + field=models.SlugField(max_length=32, unique=True), + ), + migrations.AlterField( + model_name='note', + name='status', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='note', + name='summary', + field=models.TextField(blank=True), + ), + migrations.AlterField( + model_name='note', + name='timeslot', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='program.timeslot'), + ), + migrations.AlterField( + model_name='note', + name='title', + field=models.CharField(max_length=128), + ), + migrations.AlterField( + model_name='note', + name='width', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='rrule', + name='bysetpos', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='rrule', + name='count', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='rrule', + name='freq', + field=models.IntegerField(), + ), + migrations.AlterField( + model_name='rrule', + name='interval', + field=models.IntegerField(default=1), + ), + migrations.AlterField( + model_name='rrule', + name='name', + field=models.CharField(max_length=32, unique=True), + ), + migrations.AlterField( + model_name='schedule', + name='add_business_days_only', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='schedule', + name='add_days_no', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='schedule', + name='byweekday', + field=models.IntegerField(), + ), + migrations.AlterField( + model_name='schedule', + name='default_playlist_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='schedule', + name='dstart', + field=models.DateField(), + ), + migrations.AlterField( + model_name='schedule', + name='is_repetition', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='schedule', + name='rrule', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='program.rrule'), + ), + migrations.AlterField( + model_name='schedule', + name='show', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='program.show'), + ), + migrations.AlterField( + model_name='schedule', + name='tend', + field=models.TimeField(), + ), + migrations.AlterField( + model_name='schedule', + name='tstart', + field=models.TimeField(), + ), + migrations.AlterField( + model_name='schedule', + name='until', + field=models.DateField(), + ), + migrations.AlterField( + model_name='show', + name='category', + field=models.ManyToManyField(blank=True, related_name='shows', to='program.Category'), + ), + migrations.AlterField( + model_name='show', + name='cba_series_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='show', + name='default_playlist_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='show', + name='description', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='show', + name='email', + field=models.EmailField(blank=True, max_length=254, null=True), + ), + migrations.AlterField( + model_name='show', + name='fundingcategory', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='shows', to='program.fundingcategory'), + ), + migrations.AlterField( + model_name='show', + name='height', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='show', + name='hosts', + field=models.ManyToManyField(blank=True, related_name='shows', to='program.Host'), + ), + migrations.AlterField( + model_name='show', + name='image', + field=versatileimagefield.fields.VersatileImageField(blank=True, height_field='height', null=True, upload_to='show_images', width_field='width'), + ), + migrations.AlterField( + model_name='show', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='show', + name='is_public', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='show', + name='language', + field=models.ManyToManyField(blank=True, related_name='language', to='program.Language'), + ), + migrations.AlterField( + model_name='show', + name='logo', + field=models.ImageField(blank=True, null=True, upload_to='show_images'), + ), + migrations.AlterField( + model_name='show', + name='musicfocus', + field=models.ManyToManyField(blank=True, related_name='shows', to='program.MusicFocus'), + ), + migrations.AlterField( + model_name='show', + name='name', + field=models.CharField(max_length=255), + ), + migrations.AlterField( + model_name='show', + name='owners', + field=models.ManyToManyField(blank=True, related_name='shows', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='show', + name='ppoi', + field=versatileimagefield.fields.PPOIField(default='0.5x0.5', editable=False, max_length=20), + ), + migrations.AlterField( + model_name='show', + name='predecessor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='successors', to='program.show'), + ), + migrations.AlterField( + model_name='show', + name='short_description', + field=models.TextField(), + ), + migrations.AlterField( + model_name='show', + name='slug', + field=models.CharField(max_length=255, unique=True), + ), + migrations.AlterField( + model_name='show', + name='topic', + field=models.ManyToManyField(blank=True, related_name='shows', to='program.Topic'), + ), + migrations.AlterField( + model_name='show', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shows', to='program.type'), + ), + migrations.AlterField( + model_name='show', + name='website', + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name='show', + name='width', + field=models.PositiveIntegerField(blank=True, editable=False, null=True), + ), + migrations.AlterField( + model_name='timeslot', + name='end', + field=models.DateTimeField(), + ), + migrations.AlterField( + model_name='timeslot', + name='is_repetition', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='timeslot', + name='memo', + field=models.TextField(blank=True), + ), + migrations.AlterField( + model_name='timeslot', + name='note_id', + field=models.IntegerField(editable=False, null=True), + ), + migrations.AlterField( + model_name='timeslot', + name='playlist_id', + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name='timeslot', + name='schedule', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='timeslots', to='program.schedule'), + ), + migrations.AlterField( + model_name='timeslot', + name='start', + field=models.DateTimeField(), + ), + migrations.AlterField( + model_name='topic', + name='abbrev', + field=models.CharField(max_length=4, unique=True), + ), + migrations.AlterField( + model_name='topic', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='topic', + name='name', + field=models.CharField(max_length=32), + ), + migrations.AlterField( + model_name='topic', + name='slug', + field=models.SlugField(max_length=32, unique=True), + ), + migrations.AlterField( + model_name='type', + name='is_active', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='type', + name='name', + field=models.CharField(max_length=32), + ), + migrations.AlterField( + model_name='type', + name='slug', + field=models.SlugField(max_length=32, unique=True), + ), + ] diff --git a/program/models.py b/program/models.py index 50fe398da66e7aaa42fb42bd39a1fa60c1691309..f8cb76576561f5c89c973e60ef3bda9c428c92ac 100644 --- a/program/models.py +++ b/program/models.py @@ -36,112 +36,77 @@ from program.utils import parse_datetime, parse_date, parse_time class Type(models.Model): - name = models.CharField(_("Type"), max_length=32) - slug = models.SlugField(_("Slug"), max_length=32, unique=True) - is_active = models.BooleanField(_("Is active?"), default=True) + name = models.CharField(max_length=32) + slug = models.SlugField(max_length=32, unique=True) + is_active = models.BooleanField(default=True) class Meta: ordering = ('name',) - verbose_name = _("Type") - verbose_name_plural = _("Types") - - def __str__(self): - return '%s' % self.name class Category(models.Model): - name = models.CharField(_("Category"), max_length=32) - abbrev = models.CharField(_("Abbreviation"), max_length=4, unique=True) - slug = models.SlugField(_("Slug"), max_length=32, unique=True) - is_active = models.BooleanField(_("Is active?"), default=True) - description = models.TextField(_("Description"), blank=True) + name = models.CharField(max_length=32) + abbrev = models.CharField(max_length=4, unique=True) + slug = models.SlugField(max_length=32, unique=True) + is_active = models.BooleanField(default=True) + description = models.TextField(blank=True) class Meta: ordering = ('name',) - verbose_name = _("Category") - verbose_name_plural = _("Categories") - - def __str__(self): - return '%s' % self.name class Topic(models.Model): - name = models.CharField(_("Topic"), max_length=32) - abbrev = models.CharField(_("Abbreviation"), max_length=4, unique=True) - slug = models.SlugField(_("Slug"), max_length=32, unique=True) - is_active = models.BooleanField(_("Is active?"), default=True) + name = models.CharField(max_length=32) + abbrev = models.CharField(max_length=4, unique=True) + slug = models.SlugField(max_length=32, unique=True) + is_active = models.BooleanField(default=True) class Meta: ordering = ('name',) - verbose_name = _("Topic") - verbose_name_plural = _("Topics") - - def __str__(self): - return '%s' % self.name class MusicFocus(models.Model): - name = models.CharField(_("Focus"), max_length=32) - abbrev = models.CharField(_("Abbreviation"), max_length=4, unique=True) - slug = models.SlugField(_("Slug"), max_length=32, unique=True) - is_active = models.BooleanField(_("Is active?"), default=True) + name = models.CharField(max_length=32) + abbrev = models.CharField(max_length=4, unique=True) + slug = models.SlugField(max_length=32, unique=True) + is_active = models.BooleanField(default=True) class Meta: ordering = ('name',) - verbose_name = _("Music focus") - verbose_name_plural = _("Music focus") - - def __str__(self): - return '%s' % self.name class FundingCategory(models.Model): - name = models.CharField(_("Funding Category"), max_length=32) - abbrev = models.CharField(_("Abbreviation"), max_length=4, unique=True) - slug = models.SlugField(_("Slug"), max_length=32, unique=True) - is_active = models.BooleanField(_("Is active?"), default=True) + name = models.CharField(max_length=32) + abbrev = models.CharField(max_length=4, unique=True) + slug = models.SlugField(max_length=32, unique=True) + is_active = models.BooleanField(default=True) class Meta: ordering = ('name',) - verbose_name = _("Funding Category") - verbose_name_plural = _("Funding Categories") - - def __str__(self): - return '%s' % self.name class Language(models.Model): - name = models.CharField(_("Language"), max_length=32) - is_active = models.BooleanField(_("Is active?"), default=True) + name = models.CharField(max_length=32) + is_active = models.BooleanField(default=True) class Meta: ordering = ('language',) - verbose_name = _("Language") - verbose_name_plural = _("Languages") - - def __str__(self): - return '%s' % self.name class Host(models.Model): - name = models.CharField(_("Name"), max_length=128) - is_active = models.BooleanField(_("Is active?"), default=True) - email = models.EmailField(_("E-Mail"), blank=True) - website = models.URLField(_("Website"), blank=True) - biography = models.TextField(_("Biography"), blank=True, null=True) - ppoi = PPOIField('Image PPOI') - height = models.PositiveIntegerField('Image Height', blank=True, null=True, editable=False) - width = models.PositiveIntegerField('Image Width', blank=True, null=True, editable=False) - image = VersatileImageField(_("Profile picture"), blank=True, null=True, upload_to='host_images', width_field='width', + name = models.CharField(max_length=128) + is_active = models.BooleanField(default=True) + email = models.EmailField(blank=True) + website = models.URLField(blank=True) + biography = models.TextField(blank=True, null=True) + ppoi = PPOIField() + height = models.PositiveIntegerField(blank=True, null=True, editable=False) + width = models.PositiveIntegerField(blank=True, null=True, editable=False) + image = VersatileImageField(blank=True, null=True, upload_to='host_images', width_field='width', height_field='height', ppoi_field='ppoi') class Meta: ordering = ('name',) - verbose_name = _("Host") - verbose_name_plural = _("Hosts") - - def __str__(self): - return '%s' % self.name def save(self, *args, **kwargs): super(Host, self).save(*args, **kwargs) @@ -170,51 +135,38 @@ class Link(models.Model): description = models.CharField(max_length=8) url = models.URLField() - def __str__(self): - return '%s: %s' % (self.description, self.url) - class Show(models.Model): - predecessor = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='successors', - verbose_name=_("Predecessor")) - hosts = models.ManyToManyField(Host, blank=True, related_name='shows', verbose_name=_("Hosts")) - owners = models.ManyToManyField(User, blank=True, related_name='shows', verbose_name=_("Owners")) - language = models.ManyToManyField(Language, blank=True, related_name='language', verbose_name=_("Language")) - type = models.ForeignKey(Type, on_delete=models.CASCADE, related_name='shows', verbose_name=_("Type")) - category = models.ManyToManyField(Category, blank=True, related_name='shows', verbose_name=_("Category")) - fundingcategory = models.ForeignKey(FundingCategory, null=True, on_delete=models.CASCADE, blank=True, related_name='shows', - verbose_name=_("Funding Category")) - topic = models.ManyToManyField(Topic, blank=True, related_name='shows', verbose_name=_("Topic")) - musicfocus = models.ManyToManyField(MusicFocus, blank=True, related_name='shows', verbose_name=_("Music focus")) - name = models.CharField(_("Name"), max_length=255) - slug = models.CharField(_("Slug"), max_length=255, unique=True) - ppoi = PPOIField('Image PPOI') - height = models.PositiveIntegerField('Image Height', blank=True, null=True, editable=False) - width = models.PositiveIntegerField('Image Width', blank=True, null=True, editable=False) - image = VersatileImageField(_("Image"), blank=True, null=True, upload_to='show_images', width_field='width', - height_field='height', ppoi_field='ppoi') - logo = models.ImageField(_("Logo"), blank=True, null=True, upload_to='show_images') - short_description = models.TextField(_("Short description")) - description = models.TextField(_("Description"), blank=True, null=True) - email = models.EmailField(_("E-Mail"), blank=True, null=True) - website = models.URLField(_("Website"), blank=True, null=True) - cba_series_id = models.IntegerField(_("CBA Series ID"), blank=True, null=True) - default_playlist_id = models.IntegerField(_("Default Playlist ID"), blank=True, null=True) + predecessor = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='successors') + hosts = models.ManyToManyField(Host, blank=True, related_name='shows') + owners = models.ManyToManyField(User, blank=True, related_name='shows') + language = models.ManyToManyField(Language, blank=True, related_name='language') + type = models.ForeignKey(Type, on_delete=models.CASCADE, related_name='shows') + category = models.ManyToManyField(Category, blank=True, related_name='shows') + fundingcategory = models.ForeignKey(FundingCategory, null=True, on_delete=models.CASCADE, blank=True, related_name='shows') + topic = models.ManyToManyField(Topic, blank=True, related_name='shows') + musicfocus = models.ManyToManyField(MusicFocus, blank=True, related_name='shows') + name = models.CharField(max_length=255) + slug = models.CharField(max_length=255, unique=True) + ppoi = PPOIField() + height = models.PositiveIntegerField(blank=True, null=True, editable=False) + width = models.PositiveIntegerField(blank=True, null=True, editable=False) + image = VersatileImageField(blank=True, null=True, upload_to='show_images', width_field='width', height_field='height', + ppoi_field='ppoi') + logo = models.ImageField(blank=True, null=True, upload_to='show_images') + short_description = models.TextField() + description = models.TextField(blank=True, null=True) + email = models.EmailField(blank=True, null=True) + website = models.URLField(blank=True, null=True) + cba_series_id = models.IntegerField(blank=True, null=True) + default_playlist_id = models.IntegerField(blank=True, null=True) created = models.DateTimeField(auto_now_add=True, editable=False) last_updated = models.DateTimeField(auto_now=True, editable=False) - is_active = models.BooleanField(_("Is active?"), default=True) - is_public = models.BooleanField(_("Is Public?"), default=False) + is_active = models.BooleanField(default=True) + is_public = models.BooleanField(default=False) class Meta: ordering = ('slug',) - verbose_name = _("Show") - verbose_name_plural = _("Shows") - - def __str__(self): - if self.id is None: - return '%s' % self.name - - return '%04d | %s' % (self.id, self.name) # FIXME: this does not belong here @staticmethod @@ -231,79 +183,33 @@ class Show(models.Model): class RRule(models.Model): - FREQ_CHOICES = ( - (1, _("Monthly")), - (2, _("Weekly")), - (3, _("Daily")), - ) - - BYSETPOS_CHOICES = ( - (1, _("First")), - (2, _("Second")), - (3, _("Third")), - (4, _("Fourth")), - (5, _("Fifth")), - (-1, _("Last")), - ) - name = models.CharField(_("Name"), max_length=32, unique=True) - freq = models.IntegerField(_("Frequency"), choices=FREQ_CHOICES) - interval = models.IntegerField(_("Interval"), default=1) - bysetpos = models.IntegerField(_("Set position"), blank=True, choices=BYSETPOS_CHOICES, null=True) - count = models.IntegerField(_("Count"), blank=True, null=True) + name = models.CharField(max_length=32, unique=True) + freq = models.IntegerField() + interval = models.IntegerField(default=1) + bysetpos = models.IntegerField(blank=True, null=True) + count = models.IntegerField(blank=True, null=True) class Meta: ordering = ('pk',) - verbose_name = _("Recurrence rule") - verbose_name_plural = _("Recurrence rules") - - def __str__(self): - return '%s' % self.name class Schedule(models.Model): - BYWEEKDAY_CHOICES = ( - (0, _("Monday")), - (1, _("Tuesday")), - (2, _("Wednesday")), - (3, _("Thursday")), - (4, _("Friday")), - (5, _("Saturday")), - (6, _("Sunday")), - ) - - rrule = models.ForeignKey(RRule, on_delete=models.CASCADE, related_name='schedules', verbose_name=_("Recurrence rule")) - byweekday = models.IntegerField(_("Weekday"), choices=BYWEEKDAY_CHOICES) - show = models.ForeignKey(Show, on_delete=models.CASCADE, related_name='schedules', verbose_name=_("Show")) - dstart = models.DateField(_("First date")) - tstart = models.TimeField(_("Start time")) - tend = models.TimeField(_("End time")) - until = models.DateField(_("Last date")) - is_repetition = models.BooleanField(_("Is repetition"), default=False) - add_days_no = models.IntegerField(_("Add days"), blank=True, null=True) - add_business_days_only = models.BooleanField(_("Only add business days?"), default=False) - default_playlist_id = models.IntegerField(_("Default Playlist ID"), blank=True, null=True) - # -> both see https://stackoverflow.com/questions/1737017/django-auto-now-and-auto-now-add - created = models.DateTimeField(auto_now_add=True, editable=False, - null=True) + rrule = models.ForeignKey(RRule, on_delete=models.CASCADE, related_name='schedules') + byweekday = models.IntegerField() + show = models.ForeignKey(Show, on_delete=models.CASCADE, related_name='schedules') + dstart = models.DateField() + tstart = models.TimeField() + tend = models.TimeField() + until = models.DateField() + is_repetition = models.BooleanField(default=False) + add_days_no = models.IntegerField(blank=True, null=True) + add_business_days_only = models.BooleanField(default=False) + default_playlist_id = models.IntegerField(blank=True, null=True) + created = models.DateTimeField(auto_now_add=True, editable=False, null=True) last_updated = models.DateTimeField(auto_now=True, editable=False, null=True) class Meta: ordering = ('dstart', 'tstart') - verbose_name = _("Schedule") - verbose_name_plural = _("Schedules") - - def __str__(self): - weekday = self.BYWEEKDAY_CHOICES[self.byweekday][1] - tend = self.tend.strftime('%H:%M') - dstart = self.dstart.strftime('%d. %b %Y') - tstart = self.tstart.strftime('%H:%M') - - if self.rrule.freq == 0: - return '%s %s, %s - %s' % (self.rrule, dstart, tstart, tend) - if self.rrule.freq == 3: - return '%s, %s - %s' % (self.rrule, tstart, tend) - else: - return '%s, %s, %s - %s' % (weekday, self.rrule, tstart, tend) # FIXME: this does not belong here @staticmethod @@ -964,36 +870,26 @@ class TimeSlotManager(models.Manager): class TimeSlot(models.Model): - schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE, related_name='timeslots', verbose_name=_("Schedule")) - start = models.DateTimeField(_("Start time")) - # Removed 'unique=True' because new Timeslots need to be created before deleting the old ones (otherwise linked notes get - # deleted first) - end = models.DateTimeField(_("End time")) + schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE, related_name='timeslots') + start = models.DateTimeField() + end = models.DateTimeField() show = models.ForeignKey(Show, editable=False, on_delete=models.CASCADE, related_name='timeslots') - memo = models.TextField(_("Memo"), blank=True) - is_repetition = models.BooleanField(_("Is repetition?"), default=False) - playlist_id = models.IntegerField(_("Playlist ID"), null=True) - note_id = models.IntegerField(_("Note ID"), null=True, editable=False) + memo = models.TextField(blank=True) + is_repetition = models.BooleanField(default=False) + playlist_id = models.IntegerField(null=True) + note_id = models.IntegerField(null=True, editable=False) objects = TimeSlotManager() class Meta: ordering = ('start', 'end') - verbose_name = _("Time slot") - verbose_name_plural = _("Time slots") - - def __str__(self): - start = self.start.strftime('%a, %d.%m.%Y %H:%M') - end = self.end.strftime('%H:%M') - is_repetition = ' ' + _('(REP)') if self.schedule.is_repetition is True else '' - - return '%s - %s %s (%s)' % (start, end, is_repetition, self.show.name) def save(self, *args, **kwargs): self.show = self.schedule.show super(TimeSlot, self).save(*args, **kwargs) return self + # FIXME: this should be a property def generate(self): """Returns the object instance without saving""" @@ -1007,26 +903,21 @@ class TimeSlot(models.Model): class Note(models.Model): - STATUS_CHOICES = ( - (0, _("Cancellation")), - (1, _("Recommendation")), - (2, _("Repetition")), - ) - timeslot = models.OneToOneField(TimeSlot, on_delete=models.CASCADE, verbose_name=_("Time slot"), unique=True) - title = models.CharField(_("Title"), max_length=128) - slug = models.SlugField(_("Slug"), max_length=32, unique=True) - summary = models.TextField(_("Summary"), blank=True) - content = models.TextField(_("Content")) - ppoi = PPOIField('Image PPOI') - height = models.PositiveIntegerField('Image Height', blank=True, null=True, editable=False) - width = models.PositiveIntegerField('Image Width', blank=True, null=True, editable=False) - image = VersatileImageField(_("Featured image"), blank=True, null=True, upload_to='note_images', width_field='width', - height_field='height', ppoi_field='ppoi') - status = models.IntegerField(_("Status"), choices=STATUS_CHOICES, default=1) + timeslot = models.OneToOneField(TimeSlot, on_delete=models.CASCADE, unique=True) + title = models.CharField(max_length=128) + slug = models.SlugField(max_length=32, unique=True) + summary = models.TextField(blank=True) + content = models.TextField() + ppoi = PPOIField() + height = models.PositiveIntegerField(blank=True, null=True, editable=False) + width = models.PositiveIntegerField(blank=True, null=True, editable=False) + image = VersatileImageField(blank=True, null=True, upload_to='note_images', width_field='width', height_field='height', + ppoi_field='ppoi') + status = models.IntegerField(default=1) start = models.DateTimeField(editable=False) show = models.ForeignKey(Show, on_delete=models.CASCADE, related_name='notes', editable=True) - cba_id = models.IntegerField(_("CBA ID"), blank=True, null=True) - audio_url = models.TextField(_("Direct URL to a linked audio file"), blank=True, editable=False) + cba_id = models.IntegerField(blank=True, null=True) + audio_url = models.TextField(blank=True, editable=False) created = models.DateTimeField(auto_now_add=True, editable=False) last_updated = models.DateTimeField(auto_now=True, editable=False) user = models.ForeignKey(User, editable=False, on_delete=models.CASCADE, related_name='users', default=1) @@ -1034,11 +925,6 @@ class Note(models.Model): class Meta: ordering = ('timeslot',) - verbose_name = _("Note") - verbose_name_plural = _("Notes") - - def __str__(self): - return '%s - %s' % (self.title, self.timeslot) def save(self, *args, **kwargs): self.start = self.timeslot.start