from django.contrib.auth.mixins import LoginRequiredMixin 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, utils class OwnerFilterMixin(LoginRequiredMixin): def get_queryset(self): return super().get_queryset().filter(owner=self.request.user) class MemberFilterMixin(LoginRequiredMixin): def get_queryset(self): return ( super() .get_queryset() .filter(Q(members=self.request.user) | Q(owner=self.request.user)) ) class GroupMixin: model = models.Group fields = ["name"] class GroupCreateView(LoginRequiredMixin, GroupMixin, CreateView): def form_valid(self, form): form.instance.owner = self.request.user return super().form_valid(form) class GroupUpdateView(OwnerFilterMixin, GroupMixin, UpdateView): pass class GroupDeleteView(OwnerFilterMixin, GroupMixin, DeleteView): success_url = "/" class GroupDetailView(MemberFilterMixin, GroupMixin, DetailView): 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(MemberFilterMixin, 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)