from django.db import models from django.db.models.signals import pre_save from django.dispatch.dispatcher import receiver from django.template.defaultfilters import slugify class Artist(models.Model): """ An Artist of the label. """ GENRE_HINT = 'lowercase please!' DESC_HINT = 'Markdown or HTML formatting supported' TYPE_HINT = 'main roster (0), side project (1)' name = models.CharField(max_length=64) slug = models.SlugField() image = models.ImageField(upload_to='artists') url_bandcamp = models.URLField(blank=True) url_soundcloud = models.URLField(blank=True) genre = models.CharField(max_length=256, help_text=GENRE_HINT) description = models.TextField(blank=True, help_text=DESC_HINT) artist_type = models.IntegerField(default=0, help_text=TYPE_HINT) def __str__(self): return self.name class Meta(object): ordering = ('name',) @receiver(pre_save, sender=Artist) def _artist_pre_save(sender, instance, **kwargs): instance.slug = slugify(instance.name) class Release(models.Model): """ A release (album, EP, ...) of the label. Each release has an associated number "ident" to use in the catalog. It has of course a title, several possible artists, and other informations. Attributes: ident: catalog number title: release title contributors: list of Artists who contributed to this release release_type: see TYPE_HINT year: year of release cover: image file associated to this release released: show this release publicly url_bandcamp: link to the release """ TYPE_HINT = 'full-length (0), EP (1), Split (2), Démo (3)' EMBED_HINT = 'HTML iframe -- for Bandcamp, add the whole tracklist' ident = models.IntegerField(unique=True) title = models.CharField(max_length=256) contributors = models.ManyToManyField(Artist) release_type = models.IntegerField(default=0, help_text=TYPE_HINT) cover = models.ImageField(upload_to='releases') year = models.IntegerField() description = models.TextField(blank=True) released = models.BooleanField(default=False) url_bandcamp = models.URLField(blank=True) def __str__(self): return self.title class Meta(object): ordering = ('-ident',) class VideoClip(models.Model): """ A video clip. """ title = models.CharField(max_length=256) artist = models.ForeignKey(Artist, on_delete=models.CASCADE, related_name='videos') year = models.IntegerField() embed = models.TextField() def __str__(self): return self.title class Meta(object): ordering = ('-year', 'title')