from django.db import models from django.utils import timezone from .verbose_names import verbose_names from django.core.validators import MinValueValidator, MaxValueValidator, ValidationError class Song(models.Model): song_title = models.CharField(max_length=200, verbose_name=verbose_names['song_title']) release_year = models.CharField(max_length=4, verbose_name=verbose_names['release_year']) duration = models.DurationField(null=True, verbose_name=verbose_names['duration']) created_at = models.DateTimeField(default=timezone.now, verbose_name=verbose_names['created_at'], editable=False) modified_at = models.DateTimeField(auto_now=True, verbose_name='Data ostatniej modyfikacji') class Meta: verbose_name = 'Song' verbose_name_plural = 'Songs' unique_together = ('song_title', 'release_year') def __str__(self): return f"{self.song_title}, ({self.release_year})" class Artist(models.Model): artist_name = models.CharField(max_length=255, verbose_name=verbose_names['artist_name']) songs = models.ManyToManyField(Song) class Meta: verbose_name = 'Artist' verbose_name_plural = 'Artists' def __str__(self): return self.artist_name class MusicAlbum(models.Model): MEDIUM_TYPE = ( ('audiocd', 'Audio CD'), ('audiocd_r', 'Audio CD-R'), ('sacd', 'Super Audio CD') ) album_title = models.CharField(max_length=255, verbose_name=verbose_names['album_title']) medium_type = models.CharField(max_length=50, choices=MEDIUM_TYPE, verbose_name=verbose_names['medium_type']) disc_number = models.PositiveIntegerField( validators=[MinValueValidator(1), MaxValueValidator(50)],verbose_name=verbose_names['disk_number'] ) total_disc = models.PositiveIntegerField( validators=[MinValueValidator(1), MaxValueValidator(50)],verbose_name=verbose_names['total_disk'] ) songs = models.ManyToManyField(Song) def __str__(self): return f"{self.album_title} - Album {self.disc_number}" def clean(self): if self.disc_number and self.total_disc and self.disc_number > self.total_disc: raise ValidationError("Numer kolejny disku nie może być większy od całkowitej ilości dysków w albumie.")