models.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from uuid import uuid4
  2. from django.db import models
  3. from django.urls import reverse
  4. from django.utils.translation import gettext as _
  5. class UUIDManager(models.Manager):
  6. def get_by_natural_key(self, uuid):
  7. return self.get(uuid=uuid)
  8. class UUIDModel(models.Model):
  9. uuid = models.UUIDField(verbose_name="UUID", default=uuid4, unique=True)
  10. objects = UUIDManager()
  11. class Meta:
  12. abstract = True
  13. def natural_key(self):
  14. return (self.uuid,)
  15. class Artist(UUIDModel):
  16. name = models.CharField(max_length=100, help_text=_("The artist name"))
  17. class Meta:
  18. ordering = ("name",)
  19. indexes = (models.Index(fields=("name",)),)
  20. def __str__(self):
  21. return self.name
  22. def get_absolute_url(self):
  23. return reverse("admin:grunge_artist_change", kwargs={"object_id": self.pk})
  24. class Album(UUIDModel):
  25. name = models.CharField(max_length=100, help_text=_("The album name"))
  26. year = models.PositiveSmallIntegerField(
  27. help_text=_("The year the album was released")
  28. )
  29. artist = models.ForeignKey(
  30. Artist,
  31. help_text=_("The artist that produced the album"),
  32. related_name="albums",
  33. on_delete=models.CASCADE,
  34. )
  35. class Meta:
  36. ordering = ("artist", "year", "name")
  37. indexes = (models.Index(fields=("artist", "year", "name")),)
  38. def __str__(self):
  39. return self.name
  40. def get_absolute_url(self):
  41. return reverse("admin:grunge_album_change", kwargs={"object_id": self.pk})
  42. class Track(UUIDModel):
  43. name = models.CharField(max_length=100, help_text=_("The track name"))
  44. album = models.ForeignKey(
  45. Album,
  46. help_text=_("The album this track appears on"),
  47. related_name="tracks",
  48. on_delete=models.CASCADE,
  49. )
  50. number = models.PositiveSmallIntegerField(
  51. help_text=_("The track number on the album")
  52. )
  53. class Meta:
  54. ordering = ("number", "name")
  55. indexes = (models.Index(fields=("number", "name")),)
  56. constraints = (
  57. models.UniqueConstraint(
  58. fields=("album", "number"), name="unique_album_number"
  59. ),
  60. )
  61. def __str__(self):
  62. return self.name
  63. def get_absolute_url(self):
  64. return reverse("admin:grunge_track_change", kwargs={"object_id": self.pk})
  65. class Playlist(UUIDModel):
  66. name = models.CharField(max_length=100, help_text=_("The playlist name"))
  67. class Meta:
  68. ordering = ("name",)
  69. def __str__(self):
  70. return self.name
  71. def get_absolute_url(self):
  72. return reverse("admin:grunge_playlist", kwargs={"object_id": self.pk})
  73. class PlaylistTrack(models.Model):
  74. playlist = models.ForeignKey(
  75. Playlist,
  76. help_text=_("The playlist number"),
  77. related_name="playlist_track",
  78. on_delete=models.DO_NOTHING,
  79. )
  80. track = models.ForeignKey(
  81. Track,
  82. help_text=_("tracks on this playlist"),
  83. related_name="tracks",
  84. on_delete=models.DO_NOTHING,
  85. )
  86. class Meta:
  87. ordering = ("playlist", "track",)
  88. def __str__(self):
  89. return self.playlist
  90. def get_absolute_url(self):
  91. return reverse("admin:grunge_track_playlist", kwargs={"object_id": self.pk})