diff --git a/src/pretix/control/templates/pretixcontrol/event/permissions.html b/src/pretix/control/templates/pretixcontrol/event/permissions.html index e4222cb36..79770a5e8 100644 --- a/src/pretix/control/templates/pretixcontrol/event/permissions.html +++ b/src/pretix/control/templates/pretixcontrol/event/permissions.html @@ -31,6 +31,20 @@ {{ form.DELETE }} {% endfor %} + + +
+
+ {% bootstrap_field add_form.user layout='inline' %} +
+
+ + {{ add_form.can_change_settings }} + {{ add_form.can_change_items }} + {{ add_form.can_view_orders }} + {{ add_form.can_change_orders }} + {{ add_form.can_change_permissions }} + diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 4731ec5f7..3eaaa2b66 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -1,4 +1,5 @@ from collections import OrderedDict +from django import forms from django.contrib import messages from django.db.models import Sum @@ -12,7 +13,7 @@ from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse from pretix.base.forms import VersionedModelForm from pretix.control.forms.event import ProviderForm, TicketSettingsForm, EventSettingsForm, EventUpdateForm -from pretix.base.models import Event, OrderPosition, Order, Item, EventPermission +from pretix.base.models import Event, OrderPosition, Order, Item, EventPermission, User from pretix.base.signals import register_payment_providers, register_ticket_outputs from pretix.control.permissions import EventPermissionRequiredMixin from . import UpdateView @@ -257,6 +258,19 @@ def index(request, organizer, event): return render(request, 'pretixcontrol/event/index.html', ctx) +class EventPermissionForm(VersionedModelForm): + class Meta: + model = EventPermission + fields = ( + 'can_change_settings', 'can_change_items', 'can_change_permissions', 'can_view_orders', + 'can_change_orders' + ) + + +class EventPermissionCreateForm(EventPermissionForm): + user = forms.EmailField(required=False, label=_('User')) + + class EventPermissions(EventPermissionRequiredMixin, TemplateView): model = Event form_class = TicketSettingsForm @@ -267,21 +281,41 @@ class EventPermissions(EventPermissionRequiredMixin, TemplateView): def formset(self): fs = modelformset_factory( EventPermission, - form=VersionedModelForm, - fields=('can_change_settings', 'can_change_items', 'can_change_permissions', 'can_view_orders', - 'can_change_orders'), + form=EventPermissionForm, can_delete=True, can_order=False, extra=0 ) return fs(data=self.request.POST if self.request.method == "POST" else None, + prefix="formset", queryset=EventPermission.objects.current.filter(event=self.request.event)) + @cached_property + def add_form(self): + i = EventPermission(event=self.request.event) + return EventPermissionCreateForm(data=self.request.POST if self.request.method == "POST" else None, + instance=i, + prefix="add") + def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['formset'] = self.formset + ctx['add_form'] = self.add_form return ctx def post(self, *args, **kwargs): - if self.formset.is_valid(): + if self.formset.is_valid() and self.add_form.is_valid(): + if self.add_form.has_changed(): + try: + self.add_form.instance.user = User.objects.get(identifier=self.add_form.cleaned_data['user']) + self.add_form.instance.user_id = self.add_form.instance.user.id + except User.DoesNotExist: + messages.error(self.request, _('There is no user with the email address you entered.')) + return self.get(*args, **kwargs) + else: + if EventPermission.objects.current.filter(user=self.add_form.instance.user, + event=self.request.event).exists(): + messages.error(self.request, _('This user already has permissions for this event.')) + return self.get(*args, **kwargs) + self.add_form.save() for form in self.formset.forms: if form.instance.user_id == self.request.user.pk: if not form.cleaned_data['can_change_permissions'] or form in self.formset.deleted_forms: