Add group leader functionality and update group member management
- Create GroupLeader model and migration - Alter GroupLeader member field to include related_name - Implement is_leader and is_owner methods in Group model - Update GroupDetailView to pass leader and owner status to template - Refactor group buttons and members display into separate templates - Add view and URL for setting group leaders - Update permissions for adding/removing members and clearing blacklist - Bump version to 0.1.1 in uv.lock
This commit is contained in:
parent
6cd9c0c841
commit
7409b4cd8f
10 changed files with 244 additions and 101 deletions
|
@ -6,6 +6,7 @@ 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.core.exceptions import PermissionDenied
|
||||
from django.db import IntegrityError
|
||||
from django.db.models import Count, Q
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
|
@ -70,14 +71,17 @@ class GroupDetailView(MemberFilterMixin, GroupMixin, DetailView):
|
|||
.musicvideo_set.filter(owner=data["group"].owner, blacklisted=False)
|
||||
.count()
|
||||
)
|
||||
data["members"] = data["group"].members.annotate(
|
||||
data["members"] = data["group"].members.through.objects.annotate(
|
||||
count=Count(
|
||||
"musicvideo",
|
||||
"user__musicvideo",
|
||||
filter=Q(
|
||||
musicvideo__group=data["group"], musicvideo__blacklisted=False
|
||||
user__musicvideo__group=data["group"],
|
||||
user__musicvideo__blacklisted=False,
|
||||
),
|
||||
)
|
||||
)
|
||||
data["is_leader"] = data["group"].is_leader(self.request.user)
|
||||
data["is_owner"] = data["group"].is_owner(self.request.user)
|
||||
|
||||
return data
|
||||
|
||||
|
@ -112,11 +116,13 @@ class GroupAddMusicView(MemberFilterMixin, SingleObjectMixin, View):
|
|||
return redirect(group)
|
||||
|
||||
|
||||
class GroupAddMemberView(OwnerFilterMixin, SingleObjectMixin, View):
|
||||
class GroupAddMemberView(MemberFilterMixin, SingleObjectMixin, View):
|
||||
model = models.Group
|
||||
|
||||
def post(self, request, pk):
|
||||
group = self.get_object()
|
||||
if not group.is_leader(request.user):
|
||||
raise PermissionDenied()
|
||||
username = request.POST.get("username")
|
||||
user = User.objects.get(username=username)
|
||||
if user == group.owner:
|
||||
|
@ -180,14 +186,16 @@ class GroupUnblacklistMusicView(MemberFilterMixin, SingleObjectMixin, View):
|
|||
return redirect(group)
|
||||
|
||||
|
||||
class GroupRemoveMemberView(OwnerFilterMixin, SingleObjectMixin, View):
|
||||
class GroupRemoveMemberView(MemberFilterMixin, SingleObjectMixin, View):
|
||||
model = models.Group
|
||||
|
||||
def post(self, request, pk):
|
||||
group = self.get_object()
|
||||
if not group.is_leader(request.user):
|
||||
raise PermissionDenied()
|
||||
|
||||
relations = models.Group.members.through.objects.filter(
|
||||
group=group, user__id__in=request.POST.getlist("member")
|
||||
group=group, pk__in=request.POST.getlist("member")
|
||||
)
|
||||
if relations.count() == 0:
|
||||
messages.add_message(request, messages.INFO, "Aucun membre supprimé.")
|
||||
|
@ -210,6 +218,25 @@ class GroupRemoveMemberView(OwnerFilterMixin, SingleObjectMixin, View):
|
|||
return redirect(group)
|
||||
|
||||
|
||||
class GroupSetLead(OwnerFilterMixin, SingleObjectMixin, View):
|
||||
model = models.Group
|
||||
|
||||
def post(self, request, pk):
|
||||
group = self.get_object()
|
||||
|
||||
members = models.Group.members.through.objects.filter(group=group)
|
||||
for member in members.filter(pk__in=request.POST.getlist("leader")):
|
||||
models.GroupLeader.objects.update_or_create(
|
||||
member=member, defaults={"is_leader": True}
|
||||
)
|
||||
for member in members.exclude(pk__in=request.POST.getlist("leader")):
|
||||
models.GroupLeader.objects.update_or_create(
|
||||
member=member, defaults={"is_leader": False}
|
||||
)
|
||||
|
||||
return redirect(group)
|
||||
|
||||
|
||||
class GroupRemoveGameView(OwnerFilterMixin, SingleObjectMixin, View):
|
||||
model = models.Group
|
||||
|
||||
|
@ -250,15 +277,15 @@ class GameCreateView(LoginRequiredMixin, CreateView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
data = super().get_context_data(**kwargs)
|
||||
data["group"] = get_object_or_404(
|
||||
models.Group, owner=self.request.user, pk=self.kwargs["pk"]
|
||||
)
|
||||
data["group"] = get_object_or_404(models.Group, pk=self.kwargs["pk"])
|
||||
if not data["group"].is_leader(self.request.user):
|
||||
raise PermissionDenied()
|
||||
return data
|
||||
|
||||
def form_valid(self, form):
|
||||
group = get_object_or_404(
|
||||
models.Group, owner=self.request.user, pk=self.kwargs["pk"]
|
||||
)
|
||||
group = get_object_or_404(models.Group, pk=self.kwargs["pk"])
|
||||
if not group.is_leader(self.request.user):
|
||||
return super().form_invalid(form)
|
||||
form.instance.group = group
|
||||
res = super().form_valid(form)
|
||||
players = []
|
||||
|
@ -285,7 +312,7 @@ class GameCreateView(LoginRequiredMixin, CreateView):
|
|||
game=form.instance, player=player, music_video=music, order=order
|
||||
)
|
||||
|
||||
if self.request.user.youtubecredentials:
|
||||
if models.YoutubeCredentials.objects.filter(user=self.request.user).exists():
|
||||
form.instance.playlist_loading = True
|
||||
form.instance.save()
|
||||
return res
|
||||
|
@ -358,11 +385,13 @@ class YoutubeLoginView(LoginRequiredMixin, View):
|
|||
return redirect(auth_url)
|
||||
|
||||
|
||||
class GroupClearBlacklistView(OwnerFilterMixin, SingleObjectMixin, View):
|
||||
class GroupClearBlacklistView(MemberFilterMixin, SingleObjectMixin, View):
|
||||
model = models.Group
|
||||
|
||||
def post(self, request, pk):
|
||||
group = self.get_object()
|
||||
if not group.is_leader(request.user):
|
||||
raise PermissionDenied()
|
||||
group.musicvideo_set.filter(blacklisted=True).update(blacklisted=False)
|
||||
messages.add_message(request, messages.SUCCESS, "La blacklist a été effacée.")
|
||||
return redirect(group)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue