From da1670489a4bab1ddda0b5db067c461574ed2a7c Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Mon, 21 Feb 2022 11:38:42 -0400
Subject: [PATCH] Remove verbose_names, *_CHOICES and str methods

---
 program/migrations/0013_auto_20220221_1637.py | 515 ++++++++++++++++++
 program/models.py                             | 302 ++++------
 2 files changed, 609 insertions(+), 208 deletions(-)
 create mode 100644 program/migrations/0013_auto_20220221_1637.py

diff --git a/program/migrations/0013_auto_20220221_1637.py b/program/migrations/0013_auto_20220221_1637.py
new file mode 100644
index 00000000..73f259be
--- /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 50fe398d..f8cb7657 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
-- 
GitLab