Refactors en stemmen werkt

This commit is contained in:
2024-02-07 14:07:36 +01:00
parent 0f5090cadc
commit 48dcf3bd9d
8 changed files with 61 additions and 34 deletions
+1
View File
@@ -1,3 +1,4 @@
from .track import Track from .track import Track
from .artist import Artist from .artist import Artist
from .album import Album from .album import Album
from .vote import Vote
+1 -1
View File
@@ -1,7 +1,7 @@
from django.db import models from django.db import models
from random import choice
from .album import Album from .album import Album
from .artist import Artist from .artist import Artist
from .utils import from_json
class TrackManager(models.Manager): class TrackManager(models.Manager):
def get_queryset(self): def get_queryset(self):
-1
View File
@@ -1 +0,0 @@
from .json import from_json
-8
View File
@@ -1,8 +0,0 @@
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)
+1 -1
View File
@@ -3,7 +3,7 @@
{% load static %} {% load static %}
<script src="{% static 'js/htmx.min.js' %}" defer></script> <script src="{% static 'js/htmx.min.js' %}" defer></script>
</head> </head>
<body> <body hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
<header> <header>
<nav> <nav>
<ul hx-boost="true"> <ul hx-boost="true">
+32 -3
View File
@@ -1,6 +1,35 @@
<div id="vote-box" hx-boost="true" hx-target="#vote-box"> {% if track %}
<iframe src="https://open.spotify.com/embed/track/{{ id }}" <div id="vote-box" hx-target="#vote-box">
{% if error %}<div class="error">{{ error }}</div>{% endif %}
<iframe src="https://open.spotify.com/embed/track/{{ track.id }}"
class="play-sample" width="300" height="380" frameborder="0" allowtransparency="true" class="play-sample" width="300" height="380" frameborder="0" allowtransparency="true"
allow="encrypted-media"></iframe> allow="encrypted-media"></iframe>
<a href="{% url 'vote-track'%}">Ja</a> | <a href="{% url 'vote-track' %}">Nee</a> <div id="vote-buttons" hx-vals='{"spotify_id": "{{ track.id }}"}'>
<button
hx-vals='{"vote": "2"}'
hx-post="{% url 'vote-track' %}"
>Helemaal mee eens</button>
<button
hx-vals='{"vote": "1"}'
hx-post="{% url 'vote-track' %}"
>Mee eens</button>
<button
hx-vals='{"vote": "0"}'
hx-post="{% url 'vote-track' %}"
>Neutraal</button>
<button
hx-vals='{"vote": "-1"}'
hx-post="{% url 'vote-track' %}"
>Niet mee eens</button>
<button
hx-vals='{"vote": "-2"}'
hx-post="{% url 'vote-track' %}"
>Helemaal niet mee eens</button>
</div> </div>
</div>
{% else %}
<p hx-boost="true">
Je hebt niets meer om te stemmen. Lekker bezig!
<a href="{% url 'nominate' %}">Nomineer zelf iets</a>, als je nog quota hebt.
</p>
{% endif %}
+2 -6
View File
@@ -1,12 +1,8 @@
{% extends "Base.html" %} {% extends "Base.html" %}
{% block main-content %} {% block main-content %}
{% for song in songs %} <h2>Lekker stemmen</h2>
{{ song }}
{% endfor %}
<div hx-get="{% url 'vote-track' %}" hx-trigger="load"> <div hx-get="{% url 'vote-track' %}" hx-trigger="load">
etst Laden...
</div> </div>
{% endblock %} {% endblock %}
+24 -14
View File
@@ -4,23 +4,16 @@ from django.http import HttpResponse
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
import re import re
from random import choice from .models import Track, Artist, Album, Vote
from .models import Track, Artist, Album from .utils import from_json, get_unvoted
from .models.utils import from_json
from . import spotify from . import spotify
spt = spotify.Spotify() spt = spotify.Spotify()
# TODO auth mixins
class AuthView(View): class AuthView(View):
def get(self, request): def get(self, request):
return TemplateResponse(request, "Login.html", {}) return TemplateResponse(request, "Login.html", {})
class TrackListView(View):
def get(self, request):
return HttpResponse("..")
class TrackDetailView(LoginRequiredMixin, View): class TrackDetailView(LoginRequiredMixin, View):
def get(self, request, spotify_id): def get(self, request, spotify_id):
try: try:
@@ -35,11 +28,28 @@ class VoteView(LoginRequiredMixin, View):
return TemplateResponse(request, "Vote.html", {"songs": songs}) return TemplateResponse(request, "Vote.html", {"songs": songs})
class VoteTrackView(LoginRequiredMixin, View): class VoteTrackView(LoginRequiredMixin, View):
def get(self, request): def get(self, request, error=None):
pks = Track.objects.values_list('pk', flat=True) track = get_unvoted(request.user)
track = Track.objects.get(pk=choice(pks)) return TemplateResponse(request, "SpotifyEmbed.html", {"track": track, "error": error})
def post(self, request):
return TemplateResponse(request, "SpotifyEmbed.html", {"id": track.id}) try:
spotify_id = self.request.POST['spotify_id']
score = int(self.request.POST['vote'])
score = min(max(-2, score), 2)
track = Track.objects.get(pk=spotify_id)
try:
Vote.objects.get(user=request.user, track=track)
except Vote.DoesNotExist:
pass #expected behaviour
else:
raise Exception(f"{request.user} already voted for {track}")
Vote.objects.create(track=track, user=request.user, points=score)
print(track)
except Exception as e:
print(e)
return self.get(request, str(e))
else:
return self.get(request)
class NominateView(LoginRequiredMixin, View): class NominateView(LoginRequiredMixin, View):
def get(self, request): def get(self, request):