diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po index aa98b3e6edbcd80131a736ee20a06a8e32fd815c..3b8348d13a5a80e3e3f97b08054bb15938b83841 100644 --- a/src/backoffice/locale/de/LC_MESSAGES/django.po +++ b/src/backoffice/locale/de/LC_MESSAGES/django.po @@ -342,6 +342,36 @@ msgstr "Diese Veranstaltung wirklich löschen (und nicht vllt. nur unsichtbar ma msgid "Events" msgstr "" +msgid "walist_info_paginated" +msgstr "Zeige _START_ bis _END_ von _TOTAL_ Einträgen" + +msgid "walist_info_empty" +msgstr "Zeige 0 Einträge" + +msgid "walist_info_filtered" +msgstr "(gefiltert, insgesamt _MAX_ Einträge)" + +msgid "walist_paginate_menu" +msgstr "Zeige _MENU_ Einträge" + +msgid "walist_search" +msgstr "Suche:" + +msgid "walist_noentries" +msgstr "Keine Einträge." + +msgid "walist_paginate_first" +msgstr "Erste" + +msgid "walist_paginate_last" +msgstr "Letzte" + +msgid "walist_paginate_next" +msgstr "Nächste" + +msgid "walist_paginate_previous" +msgstr "Vorherige" + msgid "assemblylist_info_paginated" msgstr "Zeige _START_ bis _END_ von _TOTAL_ Einträgen" diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po index 43ea25a8b24e03d1a7a1913d23f51e88205cb2df..2586b84e04eabc5b857b4aefacbc0c1ca894788a 100644 --- a/src/backoffice/locale/en/LC_MESSAGES/django.po +++ b/src/backoffice/locale/en/LC_MESSAGES/django.po @@ -342,6 +342,36 @@ msgstr "You are about to delete this event. Sure you don't want to just hide it? msgid "Events" msgstr "" +msgid "walist_info_paginated" +msgstr "Showing _START_ to _END_ of _TOTAL_ entries" + +msgid "walist_info_empty" +msgstr "Showing 0 out of 0 entries" + +msgid "walist_info_filtered" +msgstr "(filtered from _MAX_ total entries)" + +msgid "walist_paginate_menu" +msgstr "Show _MENU_ entries" + +msgid "walist_search" +msgstr "Search:" + +msgid "walist_noentries" +msgstr "No entries." + +msgid "walist_paginate_first" +msgstr "First" + +msgid "walist_paginate_last" +msgstr "Last" + +msgid "walist_paginate_next" +msgstr "Next" + +msgid "walist_paginate_previous" +msgstr "Previous" + msgid "assemblylist_info_paginated" msgstr "Showing _START_ to _END_ of _TOTAL_ entries" diff --git a/src/backoffice/templates/backoffice/wa-map-list.html b/src/backoffice/templates/backoffice/wa-map-list.html index 32133b650766e63cc57e85ddcf511881554baaf4..b8048c296c2d565c0b243cdbf23f7c536d97d212 100644 --- a/src/backoffice/templates/backoffice/wa-map-list.html +++ b/src/backoffice/templates/backoffice/wa-map-list.html @@ -1,5 +1,46 @@ {% extends 'backoffice/base.html' %} {% load i18n %} +{% load static %} + +{% block htmlhead %} + <link rel="stylesheet" href="{% static 'datatables/datatables.min.css' %}"> +{% endblock %} + +{% block scripts %} + <script src="{% static 'datatables/datatables.min.js' %}"></script> + <script> + $(document).ready(function() { + $('#wa-maps').DataTable({ + pageLength: 100, + language: { + "decimal": "", + "emptyTable": "No data available in table", + "info": "{% trans 'walist_info_paginated' %}", + "infoEmpty": "{% trans 'walist_info_empty' %}", + "infoFiltered": "{% trans 'walist_info_filtered' %}", + "infoPostFix": "", + "thousands": " ", + "lengthMenu": "{% trans 'walist_paginate_menu' %}", + "loadingRecords": "LOADING ...", + "processing": "Processing...", + "search": "{% trans 'walist_search' %}", + "zeroRecords": "{% trans 'walist_noentries' %}", + "paginate": { + "first": "{% trans 'walist_paginate_first' %}", + "last": "{% trans 'walist_paginate_last' %}", + "next": "{% trans 'walist_paginate_next' %}", + "previous": "{% trans 'walist_paginate_previous' %}" + }, + "aria": { + "sortAscending": ": activate to sort column ascending", + "sortDescending": ": activate to sort column descending" + } + } + }); + }); + </script> +{% endblock %} + {% block content %} @@ -8,7 +49,7 @@ <div class="card-header"> WorkAdventure maps <span class="badge badge-primary">{{ object_list|length }}</span> </div> - <table class="card-body table table-hover table-sm table-striped"> + <table class="card-body table table-hover table-sm table-striped" id="wa-maps"> <thead> <tr> <th>Assembly</th> @@ -16,7 +57,6 @@ <th>State</th> <th>Occupants</th> <th>Capacity</th> - <th></th> </tr> </thead> <tbody> @@ -31,8 +71,6 @@ </td> <td>{{ obj.occupants|default:"-" }}</td> <td>{{ obj.capacity|default:"-" }}</td> - <td> - </td> </tr> {% endfor %} </tbody> diff --git a/src/backoffice/views/workadventure.py b/src/backoffice/views/workadventure.py index 05ef1363345f3a2c606f36fe022dd6b8a85f3914..c356b00db3871b2d2fa1c2284ff051af535350c7 100644 --- a/src/backoffice/views/workadventure.py +++ b/src/backoffice/views/workadventure.py @@ -10,6 +10,8 @@ from django.utils import timezone from django.views.generic import DetailView, ListView, TemplateView, View from django.views.generic.detail import SingleObjectMixin +from django.utils.translation import gettext_lazy as _ +from django.db.models import Q from core.integrations.workadventure import WorkAdventureIntegration from core.models.rooms import Room @@ -26,35 +28,54 @@ MAX_ROWS = 42 class WorkAdventureAdminMixin(LoginRequiredMixin, ConferenceMixin): permission_required = ['core.workadventure_admin'] + BACKEND_STATUS = { + 'all': (Q(room_type=Room.RoomType.WORKADVENTURE), 'all'), + 'new': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.NEW), _('Room__backend_status-new')), + 'setup': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.SETUP), _('Room__backend_status-setup')), + 'error': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.ERROR), _('Room__backend_status-error')), + 'active': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.ACTIVE), _('Room__backend_status-active')), + 'inactive': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.INACTIVE), _('Room__backend_status-inactive')), + 'full': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.FULL), _('Room__backend_status-full')), + } + def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) - sidebar = [] + maps = [] context['sidebar'] = { 'title': 'WorkAdventure', 'title_link': reverse('backoffice:workadventure'), - 'items': sidebar, + 'items': [ + { + 'caption': _('Maps'), + 'children': maps, + 'expanded': True, + }, + { + 'caption': _('Sessions'), + 'link': reverse('backoffice:workadventure-session-list'), + 'expanded': False, + 'count': self.conference.workadventure_sessions.count(), + } + ], } - sidebar.append({ - 'caption': 'Maps', - 'link': reverse('backoffice:workadventure-map-list'), - 'count': self.conference.rooms.filter(room_type=Room.RoomType.WORKADVENTURE).count(), - }) - - sidebar.append({ - 'caption': 'Sessions', - 'link': reverse('backoffice:workadventure-session-list'), - 'count': self.conference.workadventure_sessions.count(), - }) + for m, (q, t) in self.BACKEND_STATUS.items(): + maps.append({ + 'caption': t, + 'count': self.conference.rooms.filter(q).count(), + 'link': reverse('backoffice:workadventure-map-list') + '?mode=' + m, + }) # try to guess 'active' sidebar item - request_url = self.request.META.get('PATH_INFO') - for x in sidebar: + query_string = '' + if self.request.META.get('QUERY_STRING'): + query_string = '?' + self.request.META.get('QUERY_STRING') + request_url = self.request.META.get('PATH_INFO') + query_string + for x in context['sidebar']['items']: if 'link' in x and x['link'] == request_url: x['active'] = True x['expanded'] = True - if 'children' in x: for y in x.get('children') or []: if 'link' in y and y['link'] == request_url: @@ -99,6 +120,20 @@ class WorkAdventureSessionMixin(WorkAdventureAdminMixin): class MapsView(WorkAdventureMapMixin, ListView): template_name = 'backoffice/wa-map-list.html' + default_backend_status = 'all' + + def get_queryset(self, *args, **kwargs): + qs = super().get_queryset(*args, **kwargs).select_related('assembly').order_by('assembly__slug', 'slug') + + backend_status = (self.request.POST if self.request.method == 'POST' else self.request.GET).get('mode', self.default_backend_status) + if backend_status in self.BACKEND_STATUS: + qs = qs.filter(self.BACKEND_STATUS[backend_status][0]) + else: + messages.warning(self.request, f'unknown mode "{backend_status}", using "all"') + backend_status = 'all' + self.backend_status = backend_status + + return qs class MapView(WorkAdventureMapMixin, DetailView):