Enhance message handling in group views; add user feedback for actions and errors
Fix #4
This commit is contained in:
parent
245a2503e2
commit
0859b36f98
1 changed files with 65 additions and 21 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue