Enhance message handling in group views; add user feedback for actions and errors

Fix #4
This commit is contained in:
Edgar P. Burkhart 2025-06-14 11:01:48 +02:00
parent 245a2503e2
commit 0859b36f98
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227

View file

@ -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)