diff --git a/src/backoffice/forms.py b/src/backoffice/forms.py index 5d92cb41e792108aac1858d17f69ed7bc79ec3ea..43b5f424b4bef846c68a889ddb3587f0a8fbada1 100644 --- a/src/backoffice/forms.py +++ b/src/backoffice/forms.py @@ -369,3 +369,6 @@ class StaticPageForm(forms.Form): class AssignBadgeForm(forms.Form): nickname = forms.CharField() + +class AssignRoleForm(forms.Form): + nickname = forms.CharField() \ No newline at end of file diff --git a/src/backoffice/urls.py b/src/backoffice/urls.py index 3e9495d1c85c39081aac17c3ade8f314403cdde2..3100c50fa88e7f3afb1e8f27de7fa2e4c81e7347 100644 --- a/src/backoffice/urls.py +++ b/src/backoffice/urls.py @@ -62,11 +62,15 @@ urlpatterns = [ path('assembly/<uuid:assembly>/new_event', events.AssemblyCreateEventView.as_view(), name='assembly-create-event'), path('assembly/<uuid:assembly>/events', events.AssemblyEventsView.as_view(), name='assembly-events'), + path('assembly/<uuid:assembly>/e/<uuid:pk>/', events.AssemblyEventView.as_view(), name='assembly-event'), + path('assembly/<uuid:assembly>/e/<uuid:pk>/remove', events.AssemblyRemoveEventView.as_view(), name='assembly-event-remove'), + path('assembly/<uuid:assembly>/e/<uuid:pk>/assign/speaker', events.AssignRoleView.as_view(), name='assembly-event-assign-speaker'), + path('assembly/<uuid:assembly>/new_room', assemblies.CreateRoomView.as_view(), name='assembly-create-room'), path('assembly/<uuid:assembly>/new_project', assemblies.CreateProjectView.as_view(), name='assembly-create-project'), + path('assembly/<uuid:assembly>/new_project', assemblies.CreateProjectView.as_view(), name='assembly-create-project'), + - path('assembly/<uuid:assembly>/e/<uuid:pk>/', events.AssemblyEventView.as_view(), name='assembly-event'), - path('assembly/<uuid:assembly>/e/<uuid:pk>/remove', events.AssemblyRemoveEventView.as_view(), name='assembly-event-remove'), path('assembly/<uuid:assembly>/r/<uuid:pk>/', assemblies.AssemblyRoomView.as_view(), name='assembly-room'), path('assembly/<uuid:assembly>/r/<uuid:room>/new_link', assemblies.CreateRoomLinkView.as_view(), name='roomlink-create'), path('assembly/<uuid:assembly>/r/<uuid:room>/remove_link', assemblies.RemoveRoomLinkView.as_view(), name='roomlink-remove'), diff --git a/src/backoffice/views/events.py b/src/backoffice/views/events.py index 807e0659b5590d658cf7bf56f49b374aeab636c0..a994b4c407103ac330a8abed976b889045f3d887 100644 --- a/src/backoffice/views/events.py +++ b/src/backoffice/views/events.py @@ -2,14 +2,16 @@ import logging from django.contrib import messages from django.views.generic import ListView -from django.views.generic.edit import CreateView, DeleteView, UpdateView +from django.http import HttpResponse +from django.views.generic.edit import CreateView, DeleteView, UpdateView, FormView from django.urls import reverse from django.utils.translation import gettext_lazy as _ - -from core.models.events import Event +from django.shortcuts import get_object_or_404, redirect +from core.models.events import Event, EventParticipant from core.models.rooms import Room +from core.models.users import PlatformUser -from ..forms import CreateAssemblyEventForm +from ..forms import CreateAssemblyEventForm, AssignRoleForm from .mixins import AssemblyMixin @@ -32,6 +34,11 @@ class AssemblyEventView(AssemblyMixin, UpdateView): assembly_url_param = 'assembly' + def get_context_data(self, *args, **kwargs): + ctx = super().get_context_data(*args, **kwargs) + ctx['assign_form'] = AssignRoleForm() + return ctx + def get_form(self, *args, **kwargs): form = super().get_form(*args, **kwargs) form.fields['room'].queryset = self.assembly.rooms.exclude(room_type=Room.RoomType.PROJECT) @@ -106,3 +113,33 @@ class AssemblyCreateEventView(AssemblyMixin, CreateView): def get_success_url(self): return reverse('backoffice:assembly-event', kwargs={'assembly': self.assembly.id, 'pk': self.object.id}) + + +class AssignRoleView(AssemblyMixin, FormView): + form_class = AssignRoleForm + + def get_context_data(self, *args, **kwargs): + ctx = super().get_context_data(*args, **kwargs) + ctx['assign_form'] = AssignRoleForm() + return ctx + + def form_valid(self, form, **kwargs): + if not self.request.user.has_conference_staffpermission(self.conference, 'core.view_platformuser', 'core.block_platformuser'): + return HttpResponse('Unauthorized', status=401) + role = self.kwargs['role'] + event_id = self.kwargs['pk'] + if role not in EventParticipant.Role: + return HttpResponse('Unauthorized', status=400) + + data = form.cleaned_data + try: + user = get_object_or_404(PlatformUser, is_active=True, username=data['nickname']) + event = get_object_or_404(Event, id=event_id) + participant = EventParticipant(role=role, event=event, participant=user) + messages.success(self.request, _('Event__Role-award-to') + str(user)) + logger.info(f'assigned role { role } to { user } by { self.request.user } for { event }') + + return redirect('backoffice:assembly-events', assembly=self.assembly.pk, pk=self.event_id) + except PlatformUser.DoesNotExist: + messages.error(self.request, _('404__User Not Found: ') + data['nickname']) + return redirect('backoffice:assembly-events', assembly=self.assembly.pk, pk=self.event_id) \ No newline at end of file