diff --git a/apps/activity/tables.py b/apps/activity/tables.py index 44939bc455d4632ab8f61dd99f66d45791696253..95f43e51263f568396f51f8e6bfc22da1f4f4a71 100644 --- a/apps/activity/tables.py +++ b/apps/activity/tables.py @@ -2,19 +2,17 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.utils.translation import gettext_lazy as _ -from django_tables2 import tables, A +import django_tables2 as tables +from django_tables2 import A from .models import Activity, Guest class ActivityTable(tables.Table): - name = tables.columns.LinkColumn('activity:activity_detail', - args=[A('pk'), ],) - - invite = tables.columns.LinkColumn('activity:activity_invite', - args=[A('pk'), ], - verbose_name=_("Invite"), - text=_("Invite"),) + name = tables.LinkColumn( + 'activity:activity_detail', + args=[A('pk'), ], + ) class Meta: attrs = { @@ -22,19 +20,34 @@ class ActivityTable(tables.Table): } model = Activity template_name = 'django_tables2/bootstrap4.html' - fields = ('name', 'activity_type', 'organizer', 'attendees_club', 'date_start', 'date_end', 'invite', ) + fields = ('name', 'activity_type', 'organizer', 'attendees_club', 'date_start', 'date_end', ) class GuestTable(tables.Table): + inviter = tables.LinkColumn( + 'member:user_detail', + args=[A('inviter.user.pk'), ], + ) + + entry = tables.Column( + empty_values=(), + attrs={ + "td": { + "class": lambda record: "" if record.entry else "validate btn btn-danger", + "onclick": lambda record: "" if record.entry else "remove_guest(" + str(record.pk) + ")" + } + } + ) + class Meta: attrs = { 'class': 'table table-condensed table-striped table-hover' } model = Guest template_name = 'django_tables2/bootstrap4.html' - fields = ('name', 'inviter', ) - row_attrs = { - 'class': 'table-row', - 'id': lambda record: "row-" + str(record.pk), - 'data-href': lambda record: record.pk - } + fields = ("last_name", "first_name", "inviter", ) + + def render_entry(self, record): + if record.entry: + return str(record.date) + return _("remove").capitalize() diff --git a/apps/activity/views.py b/apps/activity/views.py index 952ea59ccf2311931d638e0751dc5de0bf114dad..38e487e0f446212119f27a8277457d8103d94fc3 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -7,15 +7,18 @@ from django.views.generic import CreateView, DetailView, UpdateView, TemplateVie from django.utils.translation import gettext_lazy as _ from django_tables2.views import SingleTableView +from permission.backends import PermissionBackend from .forms import ActivityForm, GuestForm from .models import Activity, Guest -from .tables import ActivityTable +from .tables import ActivityTable, GuestTable class ActivityCreateView(LoginRequiredMixin, CreateView): model = Activity form_class = ActivityForm - success_url = reverse_lazy('activity:activity_list') + + def get_success_url(self, **kwargs): + return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]}) class ActivityListView(LoginRequiredMixin, SingleTableView): @@ -34,11 +37,22 @@ class ActivityDetailView(LoginRequiredMixin, DetailView): model = Activity context_object_name = "activity" + def get_context_data(self, **kwargs): + ctx = super().get_context_data() + + table = GuestTable(data=Guest.objects.filter(activity=self.object) + .filter(PermissionBackend.filter_queryset(self.request.user, Guest, "view"))) + ctx["guests"] = table + + return ctx + class ActivityUpdateView(LoginRequiredMixin, UpdateView): model = Activity form_class = ActivityForm - success_url = reverse_lazy('activity:activity_list') + + def get_success_url(self, **kwargs): + return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]}) class ActivityInviteView(LoginRequiredMixin, CreateView): diff --git a/apps/permission/templatetags/perms.py b/apps/permission/templatetags/perms.py index 8bcd359794f1721f84b133c9a3a2402ac788bcb9..f1ecfacb71fbf62c1356f377550f9d62d5482725 100644 --- a/apps/permission/templatetags/perms.py +++ b/apps/permission/templatetags/perms.py @@ -48,6 +48,13 @@ def not_empty_model_change_list(model_name): return session.get("not_empty_model_change_list_" + model_name) == 1 +def has_perm(t, obj, field=None): + print(t) + perm = "." + t + ("__" + field if field else "_") + return PermissionBackend().has_perm(get_current_authenticated_user(), perm, obj) + + register = template.Library() register.filter('not_empty_model_list', not_empty_model_list) register.filter('not_empty_model_change_list', not_empty_model_change_list) +register.filter('has_perm', has_perm) diff --git a/templates/activity/activity_detail.html b/templates/activity/activity_detail.html index bd946643ebedd9adb29e1b57d443e50b156fb949..339d087bc7b55cb24d7e6e55146e098f5f0a8a21 100644 --- a/templates/activity/activity_detail.html +++ b/templates/activity/activity_detail.html @@ -3,48 +3,79 @@ {% load i18n %} {% load render_table from django_tables2 %} {% load pretty_money %} +{% load perms %} {% block content %} -<div class="card bg-light shadow"> - <div class="card-header text-center"> - <h4>{{ activity.name }}</h4> - </div> - <div class="card-body" id="profile_infos"> - <dl class="row"> - <dt class="col-xl-6">{% trans 'description'|capfirst %}</dt> - <dd class="col-xl-6"> {{ activity.description }}</dd> + <div class="card bg-light shadow"> + <div class="card-header text-center"> + <h4>{{ activity.name }}</h4> + </div> + <div class="card-body" id="profile_infos"> + <dl class="row"> + <dt class="col-xl-6">{% trans 'description'|capfirst %}</dt> + <dd class="col-xl-6"> {{ activity.description }}</dd> + + <dt class="col-xl-6">{% trans 'type'|capfirst %}</dt> + <dd class="col-xl-6"> {{ activity.activity_type }}</dd> - <dt class="col-xl-6">{% trans 'type'|capfirst %}</dt> - <dd class="col-xl-6"> {{ activity.activity_type }}</dd> + <dt class="col-xl-6">{% trans 'start date'|capfirst %}</dt> + <dd class="col-xl-6">{{ activity.date_start }}</dd> - <dt class="col-xl-6">{% trans 'start date'|capfirst %}</dt> - <dd class="col-xl-6">{{ activity.date_start }}</dd> + <dt class="col-xl-6">{% trans 'end date'|capfirst %}</dt> + <dd class="col-xl-6">{{ activity.date_end }}</dd> - <dt class="col-xl-6">{% trans 'end date'|capfirst %}</dt> - <dd class="col-xl-6">{{ activity.date_end }}</dd> + <dt class="col-xl-6">{% trans 'organizer'|capfirst %}</dt> + <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.organizer.pk %}">{{ activity.organizer }}</a></dd> - <dt class="col-xl-6">{% trans 'organizer'|capfirst %}</dt> - <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.organizer.pk %}">{{ activity.organizer }}</a></dd> + <dt class="col-xl-6">{% trans 'attendees club'|capfirst %}</dt> + <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.attendees_club.pk %}">{{ activity.attendees_club }}</a></dd> - <dt class="col-xl-6">{% trans 'attendees club'|capfirst %}</dt> - <dd class="col-xl-6"><a href="{% url "member:club_detail" pk=activity.attendees_club.pk %}">{{ activity.attendees_club }}</a></dd> + <dt class="col-xl-6">{% trans 'can invite'|capfirst %}</dt> + <dd class="col-xl-6">{{ activity.activity_type.can_invite|yesno }}</dd> - <dt class="col-xl-6">{% trans 'can invite'|capfirst %}</dt> - <dd class="col-xl-6">{{ activity.activity_type.can_invite|yesno }}</dd> + {% if activity.activity_type.can_invite %} + <dt class="col-xl-6">{% trans 'guest entry fee'|capfirst %}</dt> + <dd class="col-xl-6">{{ activity.activity_type.guest_entry_fee|pretty_money }}</dd> + {% endif %} + </dl> + </div> + <div class="card-footer text-center"> + {% if "view"|has_perm:activity %} + <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_update' pk=activity.pk %}"> {% trans "edit"|capfirst %}</a> + {% endif %} {% if activity.activity_type.can_invite %} - <dt class="col-xl-6">{% trans 'guest entry fee'|capfirst %}</dt> - <dd class="col-xl-6">{{ activity.activity_type.guest_entry_fee|pretty_money }}</dd> + <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_invite' pk=activity.pk %}"> {% trans "Invite" %}</a> {% endif %} - </dl> + </div> </div> - <div class="card-footer text-center"> - {% if activity.activity_type.can_invite %} - <a class="btn btn-primary btn-sm my-1" href="{% url 'activity:activity_invite' pk=activity.pk %}"> {% trans "Invite" %}</a> - {% endif %} - </div> -</div> + {% if guests.data %} + <hr> + <h2>{% trans "Guests list" %}</h2> + <div id="guests_table"> + {% render_table guests %} + </div> + {% endif %} + +{% endblock %} +{% block extrajavascript %} +<script> + function remove_guest(guest_id) { + $.ajax({ + url:"/api/activity/guest/" + guest_id + "/", + method:"DELETE", + headers: {"X-CSRFTOKEN": CSRF_TOKEN} + }) + .done(function() { + addMsg('Invité supprimé','success'); + $("#guests_table").load(location.href + " #guests_table"); + }) + .fail(function(xhr, textStatus, error) { + errMsg(xhr.responseJSON); + }); + } +</script> {% endblock %}