Add member management functionality in group views and templates

This commit is contained in:
Edgar P. Burkhart 2025-06-13 23:51:10 +02:00
parent f211b9af50
commit 6ada3290c8
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
5 changed files with 86 additions and 9 deletions

View file

@ -12,7 +12,7 @@ form a[role="button"] {
width: 100%; width: 100%;
} }
i.ri-vip-crown-fill { i.owner {
color: var(--pico-color-amber-200); color: var(--pico-color-amber-200);
} }

View file

@ -48,12 +48,55 @@
<a href="{% url "group_edit_members" pk=group.pk %}" role="button"><i class="ri-user-add-fill"></i> Modifier les membres</a> <a href="{% url "group_edit_members" pk=group.pk %}" role="button"><i class="ri-user-add-fill"></i> Modifier les membres</a>
</p> </p>
{% endif %} {% endif %}
<ul> <table>
<li> <thead>
{{ group.owner }} ({{ owner_count }}) <i class="ri-vip-crown-fill"></i> <tr>
</li> <th>Membre</th>
{% for member in members.all %}<li>{{ member }} ({{ member.count }})</li>{% endfor %} <th>
</ul> <i class="ri-vip-crown-fill"></i>
</th>
<th>
<i class="ri-mv-line"></i>
</th>
<th>
<i class="ri-delete-bin-fill"></i>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ group.owner }}</td>
<td>
<i class="ri-vip-crown-fill owner"></i>
</td>
<td>{{ owner_count }}</td>
<td></td>
</tr>
{% for member in members.all %}
<tr>
<td>{{ member }}</td>
<td></td>
<td>{{ member.count }}</td>
<td>
<a href="{% url "group_remove_member" pk=group.pk user_pk=member.pk %}">
<i class="ri-close-fill" alt="Supprimer"></i>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<form method="post" action="{% url "group_add_member" pk=group.pk %}">
{% csrf_token %}
<fieldset role="group">
<input type="string"
name="username"
id="username"
placeholder="Membre"
required>
<button type="submit">Ajouter</button>
</fieldset>
</form>
<h2> <h2>
<i class="ri-music-2-fill"></i> Mes musiques ({{ musics.count }}) <i class="ri-music-2-fill"></i> Mes musiques ({{ musics.count }})
</h2> </h2>

View file

@ -10,7 +10,7 @@
<ul> <ul>
{% for group in user.owned_group_set.all %} {% for group in user.owned_group_set.all %}
<li> <li>
<a href="{{ group.get_absolute_url }}">{{ group.name }}</a> <i class="ri-vip-crown-fill"></i> <a href="{{ group.get_absolute_url }}">{{ group.name }}</a> <i class="ri-vip-crown-fill owner"></i>
</li> </li>
{% endfor %} {% endfor %}
{% for group in user.group_set.all %} {% for group in user.group_set.all %}

View file

@ -21,6 +21,11 @@ urlpatterns = [
views.GroupAddMusicView.as_view(), views.GroupAddMusicView.as_view(),
name="group_add_music", name="group_add_music",
), ),
path(
"group/<int:pk>/add_member/",
views.GroupAddMemberView.as_view(),
name="group_add_member",
),
path( path(
"group/remove_music/<int:pk>/", "group/remove_music/<int:pk>/",
views.GroupRemoveMusicView.as_view(), views.GroupRemoveMusicView.as_view(),
@ -31,6 +36,11 @@ urlpatterns = [
views.GroupRemoveGameView.as_view(), views.GroupRemoveGameView.as_view(),
name="group_remove_game", name="group_remove_game",
), ),
path(
"group/<int:pk>/remove_membrer/<int:user_pk>/",
views.GroupRemoveMemberView.as_view(),
name="group_remove_member",
),
path( path(
"group/<int:pk>/start_game/", views.GameCreateView.as_view(), name="start_game" "group/<int:pk>/start_game/", views.GameCreateView.as_view(), name="start_game"
), ),

View file

@ -5,9 +5,10 @@ import google_auth_oauthlib
import googleapiclient.discovery import googleapiclient.discovery
from django.conf import settings from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.db.models import Count, Q from django.db.models import Count, Q
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import redirect from django.shortcuts import get_object_or_404, redirect
from django.views import View from django.views import View
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.edit import CreateView, DeleteView, UpdateView
@ -26,6 +27,7 @@ class MemberFilterMixin(LoginRequiredMixin):
super() super()
.get_queryset() .get_queryset()
.filter(Q(members=self.request.user) | Q(owner=self.request.user)) .filter(Q(members=self.request.user) | Q(owner=self.request.user))
.distinct()
) )
@ -91,6 +93,18 @@ class GroupAddMusicView(MemberFilterMixin, SingleObjectMixin, View):
return redirect(group) return redirect(group)
class GroupAddMemberView(OwnerFilterMixin, SingleObjectMixin, View):
model = models.Group
def post(self, request, pk):
group = self.get_object()
username = request.POST.get("username")
user = User.objects.get(username=username)
group.members.add(user)
return redirect(group)
class GroupRemoveMusicView(OwnerFilterMixin, SingleObjectMixin, View): class GroupRemoveMusicView(OwnerFilterMixin, SingleObjectMixin, View):
model = models.MusicVideo model = models.MusicVideo
@ -101,6 +115,16 @@ class GroupRemoveMusicView(OwnerFilterMixin, SingleObjectMixin, View):
return redirect(group) 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 = relation.group
relation.delete()
return redirect(group)
class GroupRemoveGameView(SingleObjectMixin, View): class GroupRemoveGameView(SingleObjectMixin, View):
model = models.MusikGame model = models.MusikGame