diff --git a/playlist/models.py b/playlist/models.py deleted file mode 100644 index f8e7f61..0000000 --- a/playlist/models.py +++ /dev/null @@ -1,98 +0,0 @@ -from django.db import models - -class ArtistManager(models.Manager): - def from_json(self, json): - try: - return Artist.objects.get(pk=json["id"]) - except Artist.DoesNotExist: - keys = [f.name for f in Artist._meta.get_fields()] - subset = {key:json[key] for key in set(keys) & set(json.keys())} - artist = self.create(**subset) - return artist - -class Artist(models.Model): - def __str__(self): - return self.name - id = models.CharField(primary_key=True, max_length=128) - name = models.CharField(max_length=255) - popularity = models.SmallIntegerField(null=True, blank=True) - genres = models.JSONField(null=True) - - objects = ArtistManager() - -class AlbumManager(models.Manager): - def from_json(self, json): - try: - return Album.objects.get(pk=json["id"]) - except Album.DoesNotExist: - artists = [] - for artist in json["artists"]: - artists.append(Artist.objects.from_json(artist)) - del json["artists"] - keys = [f.name for f in Album._meta.get_fields()] - subset = {key:json[key] for key in set(keys) & set(json.keys())} - album = self.create(**subset) - for artist in artists: - album.artists.add(artist) - return album - -class Album(models.Model): - def __str__(self): - return self.name - id = models.CharField(primary_key=True, max_length=128) - name = models.CharField(max_length=255) - artists = models.ManyToManyField(Artist) - album_type = models.CharField(max_length=255) - total_tracks = models.PositiveSmallIntegerField(null=True) - image = models.ImageField(upload_to="albums/") - - objects = AlbumManager() - -class TrackManager(models.Manager): - def get_queryset(self): - return super().get_queryset().filter(old=False) - def from_json(self, json): - artists = [] - for artist in json["artists"]: - artists.append(Artist.objects.from_json(artist)) - del json["artists"] - - album = Album.objects.from_json(json["album"]) - del json["album"] - - keys = [f.name for f in Track._meta.get_fields()] - subset = {key:json[key] for key in set(keys) & set(json.keys())} - track = self.create(**subset) - track.album = album - for artist in artists: - track.artists.add(artist) - track.save() - return track - -class Track(models.Model): - def __str__(self): - s = f"'{self.name}'" - if self.artists.count() > 0: - artists = list(map(lambda a:a.name, self.artists.all())) - s += " by " - s += " & ".join(artists) - - if self.explicit: - s += " PARENTAL ADVISORY" - return s - id = models.CharField(primary_key=True, max_length=128) - name = models.CharField(max_length=255) - artists = models.ManyToManyField(Artist) - album = models.ForeignKey(Album, null=True, on_delete=models.SET_NULL) - - explicit = models.BooleanField(default=False) - duration_ms = models.PositiveIntegerField(null=True) - popularity = models.PositiveIntegerField(null=True) - - banter = models.TextField(blank=True) - - old = models.BooleanField(default=False) - - objects = TrackManager() - -#class TrackFeatures(models.Model): diff --git a/playlist/models/__init__.py b/playlist/models/__init__.py new file mode 100644 index 0000000..5adb237 --- /dev/null +++ b/playlist/models/__init__.py @@ -0,0 +1,3 @@ +from .track import Track +from .artist import Artist +from .album import Album diff --git a/playlist/models/album.py b/playlist/models/album.py new file mode 100644 index 0000000..a30b2f2 --- /dev/null +++ b/playlist/models/album.py @@ -0,0 +1,12 @@ +from django.db import models +from .artist import Artist + +class Album(models.Model): + def __str__(self): + return self.name + id = models.CharField(primary_key=True, max_length=128) + name = models.CharField(max_length=255) + artists = models.ManyToManyField(Artist) + album_type = models.CharField(max_length=255) + total_tracks = models.PositiveSmallIntegerField(null=True) + image = models.ImageField(upload_to="albums/") diff --git a/playlist/models/artist.py b/playlist/models/artist.py new file mode 100644 index 0000000..40debc8 --- /dev/null +++ b/playlist/models/artist.py @@ -0,0 +1,9 @@ +from django.db import models + +class Artist(models.Model): + def __str__(self): + return self.name + id = models.CharField(primary_key=True, max_length=128) + name = models.CharField(max_length=255) + popularity = models.SmallIntegerField(null=True, blank=True) + genres = models.JSONField(null=True) diff --git a/playlist/models/track.py b/playlist/models/track.py new file mode 100644 index 0000000..8a1557a --- /dev/null +++ b/playlist/models/track.py @@ -0,0 +1,32 @@ +from django.db import models +from .album import Album +from .artist import Artist +from .utils import from_json + +class TrackManager(models.Manager): + def get_queryset(self): + return super().get_queryset().filter(old=False) + +class Track(models.Model): + def __str__(self): + s = f"'{self.name}'" + if self.artists.count() > 0: + artists = list(map(lambda a:a.name, self.artists.all())) + s += " by " + s += " & ".join(artists) + return s + id = models.CharField(primary_key=True, max_length=128) + name = models.CharField(max_length=255) + artists = models.ManyToManyField(Artist) + album = models.ForeignKey(Album, null=True, on_delete=models.SET_NULL) + + explicit = models.BooleanField(default=False) + duration_ms = models.PositiveIntegerField(null=True) + popularity = models.PositiveIntegerField(null=True) + + banter = models.TextField(blank=True) + + old = models.BooleanField(default=False) + + objects = TrackManager() + all_tracks = models.Manager() diff --git a/playlist/models/utils/__init__.py b/playlist/models/utils/__init__.py new file mode 100644 index 0000000..9956987 --- /dev/null +++ b/playlist/models/utils/__init__.py @@ -0,0 +1 @@ +from .json import from_json diff --git a/playlist/models/utils/json.py b/playlist/models/utils/json.py new file mode 100644 index 0000000..85988f5 --- /dev/null +++ b/playlist/models/utils/json.py @@ -0,0 +1,8 @@ +def from_json(cls, json): + try: + return cls.objects.get(pk=json["id"]) + except cls.DoesNotExist: + keys = [f.name for f in cls._meta.get_fields()] + subset = {key:json[key] for key in set(keys) & set(json.keys())} + return cls.objects.create(**subset) + diff --git a/playlist/templates/Nominate.html b/playlist/templates/Nominate.html new file mode 100644 index 0000000..7f0a755 --- /dev/null +++ b/playlist/templates/Nominate.html @@ -0,0 +1,6 @@ +