diff --git a/game/views.py b/game/views.py index 0c0dad3..a24c1c6 100644 --- a/game/views.py +++ b/game/views.py @@ -4,13 +4,13 @@ import google.oauth2.credentials import google_auth_oauthlib import googleapiclient.discovery from django.conf import settings +from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import User from django.contrib.messages.views import SuccessMessageMixin from django.db import IntegrityError from django.db.models import Count, Q -from django.http import JsonResponse -from django.shortcuts import get_object_or_404, redirect +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 @@ -38,9 +38,8 @@ class GroupMixin: fields = ["name"] -class GroupCreateView(LoginRequiredMixin, GroupMixin, CreateView): +class GroupIntegrityMixin: def form_valid(self, form): - form.instance.owner = self.request.user try: return super().form_valid(form) except IntegrityError: @@ -48,7 +47,13 @@ class GroupCreateView(LoginRequiredMixin, GroupMixin, CreateView): return super().form_invalid(form) -class GroupUpdateView(OwnerFilterMixin, GroupMixin, UpdateView): +class GroupCreateView(LoginRequiredMixin, GroupMixin, GroupIntegrityMixin, CreateView): + def form_valid(self, form): + form.instance.owner = self.request.user + return super().form_valid(form) + + +class GroupUpdateView(OwnerFilterMixin, GroupMixin, GroupIntegrityMixin, UpdateView): pass @@ -84,14 +89,26 @@ class GroupAddMusicView(MemberFilterMixin, SingleObjectMixin, View): 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) + messages.add_message(request, messages.ERROR, "Aucun identifiant donné") + return redirect(group) 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() + messages.add_message( + request, messages.ERROR, f"Vidéo Youtube invalide : {yt_id}" + ) + return redirect(group) + try: + group.musicvideo_set.create(yt_id=yt_id, title=title, owner=request.user) + except IntegrityError: + messages.add_message( + request, messages.ERROR, f"Vidéo Youtube déjà ajoutée : {yt_id}" + ) + + messages.add_message( + request, messages.SUCCESS, f"Vidéo Youtube ajoutée : {yt_id}" + ) return redirect(group) @@ -102,6 +119,15 @@ class GroupAddMemberView(OwnerFilterMixin, SingleObjectMixin, View): group = self.get_object() username = request.POST.get("username") user = User.objects.get(username=username) + if user == group.owner: + messages.add_message( + request, messages.WARNING, f"{user} est le propriétaire du groupe." + ) + return redirect(group) + if user in group.members.all(): + messages.add_message( + request, messages.WARNING, f"{user} est déjà membre du groupe." + ) group.members.add(user) return redirect(group) @@ -117,17 +143,25 @@ class GroupRemoveMusicView(OwnerFilterMixin, SingleObjectMixin, View): return redirect(group) -class GroupRemoveMemberView(View): - def get(self, request, pk, user_pk): - relation = get_object_or_404( - models.Group.members.through, - group_id=pk, - user_id=user_pk, - group__owner=request.user, - ) +class GroupRemoveMemberView(OwnerFilterMixin, SingleObjectMixin, View): + model = models.Group + + def get(self, request, pk, user_pk): + group = self.get_object() + user = User.objects.get(pk=user_pk) + + relation = models.Group.members.through.objects.filter( + group=group, user=user + ).first() + if not relation: + messages.add_message( + request, + messages.ERROR, + f"L'utilisateur {user} n'est pas membre du groupe.", + ) + else: + relation.delete() - group = relation.group - relation.delete() return redirect(group) @@ -142,6 +176,11 @@ class GroupRemoveGameView(SingleObjectMixin, SuccessMessageMixin, View): game = self.get_object() group = game.group game.delete() + messages.add_message( + request, + messages.SUCCESS, + f"Le jeu du {game.date.strftime('%x')} a été supprimé avec succès.", + ) return redirect(group) @@ -255,9 +294,11 @@ class YoutubeLoginView(LoginRequiredMixin, View): class YoutubeCallbackView(LoginRequiredMixin, View): def get(self, request): - if request.GET.get("error"): + if err := request.GET.get("error"): + messages.add_message( + request, messages.ERROR, f"Échec de la connexion à Youtube : {err}" + ) return redirect("/") - print(request.GET) state = self.request.session.get("state") flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( @@ -283,6 +324,8 @@ class YoutubeCallbackView(LoginRequiredMixin, View): } }, ) + + messages.add_message(request, messages.SUCCESS, "Connexion à Youtube réussie.") return redirect("/") @@ -292,4 +335,5 @@ class GroupClearBlacklistView(OwnerFilterMixin, SingleObjectMixin, View): def get(self, request, pk): group = self.get_object() group.musicvideo_set.filter(blacklisted=True).update(blacklisted=False) + messages.add_message(request, messages.SUCCESS, "La blacklist a été vidée.") return redirect(group)