Moves from_json to utils and splits the models to files in a module
This commit is contained in:
2024-02-06 15:31:05 +01:00
parent e7ee92868f
commit aad9343569
10 changed files with 132 additions and 111 deletions
-98
View File
@@ -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):
+3
View File
@@ -0,0 +1,3 @@
from .track import Track
from .artist import Artist
from .album import Album
+12
View File
@@ -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/")
+9
View File
@@ -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)
+32
View File
@@ -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()
+1
View File
@@ -0,0 +1 @@
from .json import from_json
+8
View File
@@ -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)
+6
View File
@@ -0,0 +1,6 @@
<h2>Nominate</h2>
<form method="post">
{% csrf_token %}
<input type="text" name="spotify_link" placeholder="Spotify-link">
<input type="submit" value="OK">
</form>
+3 -1
View File
@@ -2,5 +2,7 @@ from django.urls import path
from . import views from . import views
urlpatterns = [ urlpatterns = [
path('track/<str:spotify_id>', views.TrackView.as_view()), path('track/<str:spotify_id>', views.TrackDetailView.as_view()),
path('track', views.NominateView.as_view()),
path('', views.TrackListView.as_view()),
] ]
+58 -12
View File
@@ -1,21 +1,67 @@
from django.shortcuts import render from django.shortcuts import render
from django.views import View from django.views import View
from django.http import HttpResponse from django.http import HttpResponse
from . import models from django.template.response import TemplateResponse
import re
from .models import Track, Artist, Album
from .models.utils import from_json
from . import spotify from . import spotify
spt = spotify.Spotify() spt = spotify.Spotify()
class TrackView(View): # TODO auth mixins
class TrackListView(View):
def get(self, request):
return HttpResponse("..")
class TrackDetailView(View):
def get(self, request, spotify_id): def get(self, request, spotify_id):
# TODO: Dit is eigenlijk wat moet gebeuren op post
try: try:
track = models.Track.objects.get(pk=spotify_id) track = Track.objects.get(pk=spotify_id)
except models.Track.DoesNotExist: return HttpResponse(str(track))
data = spt.get_song_info(spotify_id) except Track.DoesNotExist:
track = models.Track.objects.from_json(data) return HttpResponse("No track")
return HttpResponse(str(track)) class NominateView(View):
def post(self, request, spotify_id): def get(self, request):
data = spt.get_song_info(spotify_id) return TemplateResponse(request, "Nominate.html", {})
print(data) def post(self, request):
return HttpResponse(data["name"]) spotify_link = self.request.POST['spotify_link']
m = re.match(r"^https:\/\/open.spotify.com\/track\/(\w+)\??", spotify_link)
spotify_id = m.group(1)
try:
track = Track.all_tracks.get(pk=spotify_id)
if track.old:
return HttpResponse("Deze was vorig jaar al genomineerd: " + str(track))
return HttpResponse("Maat, dat bestaat al: " + str(track))
except Track.DoesNotExist:
json = spt.get_song_info(spotify_id)
# Album artists
album_artists = []
for artist in json["album"]["artists"]:
#album_artists.append(Artist.objects.from_json(artist))
album_artists.append(from_json(Artist, artist))
del json["album"]["artists"]
# Album
album = from_json(Album, json["album"])
del json["album"]
for artist in album_artists:
album.artists.add(artist)
# Track artists
track_artists = []
for artist in json["artists"]:
#track_artists.append(Artist.objects.from_json(artist))
track_artists.append(from_json(Artist, artist))
del json["artists"]
# Track
#track = Track.objects.from_json(json)
track = from_json(Track, json)
for artist in track_artists:
track.artists.add(artist)
track.album = album
track.save()
return HttpResponse(str(track))