Refactor music video model and views: rename user to owner, add title field, and implement music management in group detail view

This commit is contained in:
Edgar P. Burkhart 2025-06-13 18:55:50 +02:00
parent 8ed39c78b8
commit 4e28311b1c
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
11 changed files with 272 additions and 8 deletions

View file

@ -1,8 +1,12 @@
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.detail import DetailView
from django.db.models import Count, Q
from django.http import JsonResponse
from django.shortcuts import redirect
from django.views import View
from django.views.generic.detail import DetailView, SingleObjectMixin
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from . import forms, models
from . import forms, models, utils
class OwnerFilterMixin(LoginRequiredMixin):
@ -30,9 +34,48 @@ class GroupDeleteView(OwnerFilterMixin, GroupMixin, DeleteView):
class GroupDetailView(OwnerFilterMixin, GroupMixin, DetailView):
pass
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
data["musics"] = data["group"].musicvideo_set.filter(owner=self.request.user)
data["owner_count"] = (
data["group"].musicvideo_set.filter(owner=data["group"].owner).count()
)
data["members"] = data["group"].members.annotate(
count=Count("musicvideo", filter=Q(group=data["group"]))
)
return data
class GroupAddMembersView(OwnerFilterMixin, GroupMixin, UpdateView):
fields = None
form_class = forms.GroupAddMembersForm
class GroupAddMusicView(OwnerFilterMixin, SingleObjectMixin, View):
model = models.Group
def post(self, request, pk):
group = self.get_object()
yt_id = request.POST.get("yt_id")
if not yt_id:
return JsonResponse({"error": "You must provide a YouTube ID."}, status=400)
yt_id = utils.parse_musik(yt_id)
title = utils.get_yt_title(yt_id)
if not title:
return JsonResponse({"error": "Invalid YouTube ID."}, status=400)
group.musicvideo_set.create(yt_id=yt_id, title=title, owner=request.user)
group.save()
return redirect(group)
class GroupRemoveMusicView(OwnerFilterMixin, SingleObjectMixin, View):
model = models.MusicVideo
def get(self, request, pk):
music = self.get_object()
group = music.group
music.delete()
return redirect(group)