Big string replace

This commit is contained in:
Raphael Michel
2026-03-09 14:57:31 +01:00
committed by Raphael Michel
parent 318f1db5a0
commit a2a4c8a955
73 changed files with 852 additions and 848 deletions
+3 -3
View File
@@ -124,12 +124,12 @@ class EventCRUDPermission(EventPermission):
def has_permission(self, request, view): def has_permission(self, request, view):
if not super(EventCRUDPermission, self).has_permission(request, view): if not super(EventCRUDPermission, self).has_permission(request, view):
return False return False
elif view.action == 'create' and 'can_create_events' not in request.orgapermset: elif view.action == 'create' and 'organizer.events:create' not in request.orgapermset:
return False return False
elif view.action == 'destroy' and 'can_change_event_settings' not in request.eventpermset: elif view.action == 'destroy' and 'event.settings.general:write' not in request.eventpermset:
return False return False
elif view.action in ['update', 'partial_update'] \ elif view.action in ['update', 'partial_update'] \
and 'can_change_event_settings' not in request.eventpermset: and 'event.settings.general:write' not in request.eventpermset:
return False return False
return True return True
+8 -8
View File
@@ -300,7 +300,7 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
def ignored_meta_properties(self): def ignored_meta_properties(self):
perm_holder = (self.context['request'].auth if isinstance(self.context['request'].auth, (Device, TeamAPIToken)) perm_holder = (self.context['request'].auth if isinstance(self.context['request'].auth, (Device, TeamAPIToken))
else self.context['request'].user) else self.context['request'].user)
if perm_holder.has_organizer_permission(self.context['request'].organizer, 'can_change_organizer_settings', request=self.context['request']): if perm_holder.has_organizer_permission(self.context['request'].organizer, 'organizer.settings.general:write', request=self.context['request']):
return [] return []
return [k for k, p in self.meta_properties.items() if p.protected] return [k for k, p in self.meta_properties.items() if p.protected]
@@ -561,7 +561,7 @@ class SubEventSerializer(I18nAwareModelSerializer):
def ignored_meta_properties(self): def ignored_meta_properties(self):
perm_holder = (self.context['request'].auth if isinstance(self.context['request'].auth, (Device, TeamAPIToken)) perm_holder = (self.context['request'].auth if isinstance(self.context['request'].auth, (Device, TeamAPIToken))
else self.context['request'].user) else self.context['request'].user)
if perm_holder.has_organizer_permission(self.context['request'].organizer, 'can_change_organizer_settings', request=self.context['request']): if perm_holder.has_organizer_permission(self.context['request'].organizer, 'organizer.settings.general:write', request=self.context['request']):
return [] return []
return [k for k, p in self.meta_properties.items() if p.protected] return [k for k, p in self.meta_properties.items() if p.protected]
@@ -1080,16 +1080,16 @@ class SeatSerializer(I18nAwareModelSerializer):
def prefetch_expanded_data(self, items, request, expand_fields): def prefetch_expanded_data(self, items, request, expand_fields):
if 'orderposition' in expand_fields: if 'orderposition' in expand_fields:
if 'can_view_orders' not in request.eventpermset: if 'event.orders:read' not in request.eventpermset:
raise PermissionDenied('can_view_orders permission required for expand=orderposition') raise PermissionDenied('event.orders:read permission required for expand=orderposition')
prefetch_by_id(items, OrderPosition.objects.prefetch_related('order'), 'orderposition_id', 'orderposition') prefetch_by_id(items, OrderPosition.objects.prefetch_related('order'), 'orderposition_id', 'orderposition')
if 'cartposition' in expand_fields: if 'cartposition' in expand_fields:
if 'can_view_orders' not in request.eventpermset: if 'event.orders:read' not in request.eventpermset:
raise PermissionDenied('can_view_orders permission required for expand=cartposition') raise PermissionDenied('event.orders:read permission required for expand=cartposition')
prefetch_by_id(items, CartPosition.objects, 'cartposition_id', 'cartposition') prefetch_by_id(items, CartPosition.objects, 'cartposition_id', 'cartposition')
if 'voucher' in expand_fields: if 'voucher' in expand_fields:
if 'can_view_vouchers' not in request.eventpermset: if 'event.vouchers:read' not in request.eventpermset:
raise PermissionDenied('can_view_vouchers permission required for expand=voucher') raise PermissionDenied('event.vouchers:read permission required for expand=voucher')
prefetch_by_id(items, Voucher.objects, 'voucher_id', 'voucher') prefetch_by_id(items, Voucher.objects, 'voucher_id', 'voucher')
def __init__(self, instance, *args, **kwargs): def __init__(self, instance, *args, **kwargs):
+1 -1
View File
@@ -614,7 +614,7 @@ class OrderPositionSerializer(I18nAwareModelSerializer):
# /events/…/checkinlists/…/positions/ # /events/…/checkinlists/…/positions/
# We're unable to check this on this level if we're on /checkinrpc/, in which case we rely on the view # We're unable to check this on this level if we're on /checkinrpc/, in which case we rely on the view
# layer to not set pdf_data=true in the first place. # layer to not set pdf_data=true in the first place.
request and hasattr(request, 'eventpermset') and 'can_view_orders' not in request.eventpermset request and hasattr(request, 'eventpermset') and 'event.orders:read' not in request.eventpermset
) )
if ('pdf_data' in self.context and not self.context['pdf_data']) or pdf_data_forbidden: if ('pdf_data' in self.context and not self.context['pdf_data']) or pdf_data_forbidden:
self.fields.pop('pdf_data', None) self.fields.pop('pdf_data', None)
+2 -2
View File
@@ -52,8 +52,8 @@ class CartPositionViewSet(CreateModelMixin, DestroyModelMixin, viewsets.ReadOnly
ordering = ('datetime',) ordering = ('datetime',)
ordering_fields = ('datetime', 'cart_id') ordering_fields = ('datetime', 'cart_id')
lookup_field = 'id' lookup_field = 'id'
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
def get_queryset(self): def get_queryset(self):
return CartPosition.objects.filter( return CartPosition.objects.filter(
+16 -16
View File
@@ -118,11 +118,11 @@ class CheckinListViewSet(viewsets.ModelViewSet):
def _get_permission_name(self, request): def _get_permission_name(self, request):
if request.path.endswith('/failed_checkins/'): if request.path.endswith('/failed_checkins/'):
return 'can_checkin_orders', 'can_change_orders' return 'event.orders:checkin', 'event.orders:write'
elif request.method in SAFE_METHODS: elif request.method in SAFE_METHODS:
return 'can_view_orders', 'can_checkin_orders', return 'event.orders:read', 'event.orders:checkin',
else: else:
return 'can_change_event_settings' return 'event.settings.general:write'
def get_queryset(self): def get_queryset(self):
qs = self.request.event.checkin_lists.prefetch_related( qs = self.request.event.checkin_lists.prefetch_related(
@@ -474,7 +474,7 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force,
'event': op.order.event, 'event': op.order.event,
'pdf_data': pdf_data and ( 'pdf_data': pdf_data and (
user if user and user.is_authenticated else auth user if user and user.is_authenticated else auth
).has_event_permission(request.organizer, event, 'can_view_orders', request), ).has_event_permission(request.organizer, event, 'event.orders:read', request),
} }
common_checkin_args = dict( common_checkin_args = dict(
@@ -839,8 +839,8 @@ class CheckinListPositionViewSet(viewsets.ReadOnlyModelViewSet):
} }
filterset_class = CheckinOrderPositionFilter filterset_class = CheckinOrderPositionFilter
permission = ('can_view_orders', 'can_checkin_orders') permission = ('event.orders:read', 'event.orders:checkin')
write_permission = ('can_change_orders', 'can_checkin_orders') write_permission = ('event.orders:write', 'event.orders:checkin')
def get_serializer_context(self): def get_serializer_context(self):
ctx = super().get_serializer_context() ctx = super().get_serializer_context()
@@ -871,7 +871,7 @@ class CheckinListPositionViewSet(viewsets.ReadOnlyModelViewSet):
expand=self.request.query_params.getlist('expand'), expand=self.request.query_params.getlist('expand'),
) )
if 'pk' not in self.request.resolver_match.kwargs and 'can_view_orders' not in self.request.eventpermset \ if 'pk' not in self.request.resolver_match.kwargs and 'event.orders:read' not in self.request.eventpermset \
and len(self.request.query_params.get('search', '')) < 3: and len(self.request.query_params.get('search', '')) < 3:
qs = qs.none() qs = qs.none()
@@ -920,9 +920,9 @@ class CheckinListPositionViewSet(viewsets.ReadOnlyModelViewSet):
class CheckinRPCRedeemView(views.APIView): class CheckinRPCRedeemView(views.APIView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
events = self.request.auth.get_events_with_permission(('can_change_orders', 'can_checkin_orders')) events = self.request.auth.get_events_with_permission(('event.orders:write', 'event.orders:checkin'))
elif self.request.user.is_authenticated: elif self.request.user.is_authenticated:
events = self.request.user.get_events_with_permission(('can_change_orders', 'can_checkin_orders'), self.request).filter( events = self.request.user.get_events_with_permission(('event.orders:write', 'event.orders:checkin'), self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
else: else:
@@ -990,9 +990,9 @@ class CheckinRPCSearchView(ListAPIView):
@cached_property @cached_property
def lists(self): def lists(self):
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
events = self.request.auth.get_events_with_permission(('can_view_orders', 'can_checkin_orders')) events = self.request.auth.get_events_with_permission(('event.orders:read', 'event.orders:checkin'))
elif self.request.user.is_authenticated: elif self.request.user.is_authenticated:
events = self.request.user.get_events_with_permission(('can_view_orders', 'can_checkin_orders'), self.request).filter( events = self.request.user.get_events_with_permission(('event.orders:read', 'event.orders:checkin'), self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
else: else:
@@ -1009,9 +1009,9 @@ class CheckinRPCSearchView(ListAPIView):
@cached_property @cached_property
def has_full_access_permission(self): def has_full_access_permission(self):
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
events = self.request.auth.get_events_with_permission('can_view_orders') events = self.request.auth.get_events_with_permission('event.orders:read')
elif self.request.user.is_authenticated: elif self.request.user.is_authenticated:
events = self.request.user.get_events_with_permission('can_view_orders', self.request).filter( events = self.request.user.get_events_with_permission('event.orders:read', self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
else: else:
@@ -1038,9 +1038,9 @@ class CheckinRPCSearchView(ListAPIView):
class CheckinRPCAnnulView(views.APIView): class CheckinRPCAnnulView(views.APIView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
events = self.request.auth.get_events_with_permission(('can_change_orders', 'can_checkin_orders')) events = self.request.auth.get_events_with_permission(('event.orders:write', 'event.orders:checkin'))
elif self.request.user.is_authenticated: elif self.request.user.is_authenticated:
events = self.request.user.get_events_with_permission(('can_change_orders', 'can_checkin_orders'), self.request).filter( events = self.request.user.get_events_with_permission(('event.orders:write', 'event.orders:checkin'), self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
else: else:
@@ -1118,7 +1118,7 @@ class CheckinViewSet(viewsets.ReadOnlyModelViewSet):
filterset_class = CheckinFilter filterset_class = CheckinFilter
ordering = ('created', 'id') ordering = ('created', 'id')
ordering_fields = ('created', 'datetime', 'id',) ordering_fields = ('created', 'datetime', 'id',)
permission = 'can_view_orders' permission = 'event.orders:read'
def get_queryset(self): def get_queryset(self):
qs = Checkin.all.filter().select_related( qs = Checkin.all.filter().select_related(
+1 -1
View File
@@ -57,7 +57,7 @@ class DiscountViewSet(ConditionalListView, viewsets.ModelViewSet):
ordering_fields = ('id', 'position') ordering_fields = ('id', 'position')
ordering = ('position', 'id') ordering = ('position', 'id')
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.discounts.prefetch_related( return self.request.event.discounts.prefetch_related(
+7 -7
View File
@@ -341,7 +341,7 @@ class CloneEventViewSet(viewsets.ModelViewSet):
lookup_field = 'slug' lookup_field = 'slug'
lookup_url_kwarg = 'event' lookup_url_kwarg = 'event'
http_method_names = ['post'] http_method_names = ['post']
write_permission = 'can_create_events' write_permission = 'organizer.events:create'
def get_serializer_context(self): def get_serializer_context(self):
ctx = super().get_serializer_context() ctx = super().get_serializer_context()
@@ -426,7 +426,7 @@ with scopes_disabled():
class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet): class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
serializer_class = SubEventSerializer serializer_class = SubEventSerializer
queryset = SubEvent.objects.none() queryset = SubEvent.objects.none()
write_permission = 'can_change_event_settings' write_permission = 'event.settings.general:write'
filter_backends = (DjangoFilterBackend, TotalOrderingFilter) filter_backends = (DjangoFilterBackend, TotalOrderingFilter)
ordering = ('date_from',) ordering = ('date_from',)
ordering_fields = ('id', 'date_from', 'last_modified') ordering_fields = ('id', 'date_from', 'last_modified')
@@ -546,7 +546,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
class TaxRuleViewSet(ConditionalListView, viewsets.ModelViewSet): class TaxRuleViewSet(ConditionalListView, viewsets.ModelViewSet):
serializer_class = TaxRuleSerializer serializer_class = TaxRuleSerializer
queryset = TaxRule.objects.none() queryset = TaxRule.objects.none()
write_permission = 'can_change_event_settings' write_permission = 'event.settings.general:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.tax_rules.all() return self.request.event.tax_rules.all()
@@ -589,7 +589,7 @@ class TaxRuleViewSet(ConditionalListView, viewsets.ModelViewSet):
class ItemMetaPropertiesViewSet(viewsets.ModelViewSet): class ItemMetaPropertiesViewSet(viewsets.ModelViewSet):
serializer_class = ItemMetaPropertiesSerializer serializer_class = ItemMetaPropertiesSerializer
queryset = ItemMetaProperty.objects.none() queryset = ItemMetaProperty.objects.none()
write_permission = 'can_change_event_settings' write_permission = 'event.settings.general:write'
def get_queryset(self): def get_queryset(self):
qs = self.request.event.item_meta_properties.all() qs = self.request.event.item_meta_properties.all()
@@ -636,14 +636,14 @@ class ItemMetaPropertiesViewSet(viewsets.ModelViewSet):
class EventSettingsView(views.APIView): class EventSettingsView(views.APIView):
permission = None permission = None
write_permission = 'can_change_event_settings' write_permission = 'event.settings.general:write'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if isinstance(request.auth, Device): if isinstance(request.auth, Device):
s = DeviceEventSettingsSerializer(instance=request.event.settings, event=request.event, context={ s = DeviceEventSettingsSerializer(instance=request.event.settings, event=request.event, context={
'request': request 'request': request
}) })
elif 'can_change_event_settings' in request.eventpermset: elif 'event.settings.general:write' in request.eventpermset:
s = EventSettingsSerializer(instance=request.event.settings, event=request.event, context={ s = EventSettingsSerializer(instance=request.event.settings, event=request.event, context={
'request': request 'request': request
}) })
@@ -701,7 +701,7 @@ class SeatFilter(FilterSet):
class SeatViewSet(ConditionalListView, viewsets.ModelViewSet): class SeatViewSet(ConditionalListView, viewsets.ModelViewSet):
serializer_class = SeatSerializer serializer_class = SeatSerializer
queryset = Seat.objects.none() queryset = Seat.objects.none()
write_permission = 'can_change_event_settings' write_permission = 'event.settings.general:write'
filter_backends = (DjangoFilterBackend, ) filter_backends = (DjangoFilterBackend, )
filterset_class = SeatFilter filterset_class = SeatFilter
+8 -8
View File
@@ -136,7 +136,7 @@ class ExportersMixin:
class EventExportersViewSet(ExportersMixin, viewsets.ViewSet): class EventExportersViewSet(ExportersMixin, viewsets.ViewSet):
permission = 'can_view_orders' permission = 'event.orders:read'
def get_serializer_kwargs(self): def get_serializer_kwargs(self):
return {} return {}
@@ -169,7 +169,7 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet):
perm_holder = self.request.auth perm_holder = self.request.auth
else: else:
perm_holder = self.request.user perm_holder = self.request.user
events = perm_holder.get_events_with_permission('can_view_orders', request=self.request).filter( events = perm_holder.get_events_with_permission('event.orders:read', request=self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
responses = register_multievent_data_exporters.send(self.request.organizer) responses = register_multievent_data_exporters.send(self.request.organizer)
@@ -196,7 +196,7 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet):
else: else:
perm_holder = self.request.user perm_holder = self.request.user
return { return {
'events': perm_holder.get_events_with_permission('can_view_orders', request=self.request).filter( 'events': perm_holder.get_events_with_permission('event.orders:read', request=self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
} }
@@ -222,11 +222,11 @@ class ScheduledExportersViewSet(viewsets.ModelViewSet):
class ScheduledEventExportViewSet(ScheduledExportersViewSet): class ScheduledEventExportViewSet(ScheduledExportersViewSet):
serializer_class = ScheduledEventExportSerializer serializer_class = ScheduledEventExportSerializer
queryset = ScheduledEventExport.objects.none() queryset = ScheduledEventExport.objects.none()
permission = 'can_view_orders' permission = 'event.orders:read'
def get_queryset(self): def get_queryset(self):
perm_holder = self.request.auth if isinstance(self.request.auth, (TeamAPIToken, Device)) else self.request.user perm_holder = self.request.auth if isinstance(self.request.auth, (TeamAPIToken, Device)) else self.request.user
if not perm_holder.has_event_permission(self.request.organizer, self.request.event, 'can_change_event_settings', if not perm_holder.has_event_permission(self.request.organizer, self.request.event, 'event.settings.general:write',
request=self.request): request=self.request):
if self.request.user.is_authenticated: if self.request.user.is_authenticated:
qs = self.request.event.scheduled_exports.filter(owner=self.request.user) qs = self.request.event.scheduled_exports.filter(owner=self.request.user)
@@ -291,7 +291,7 @@ class ScheduledOrganizerExportViewSet(ScheduledExportersViewSet):
def get_queryset(self): def get_queryset(self):
perm_holder = self.request.auth if isinstance(self.request.auth, (TeamAPIToken, Device)) else self.request.user perm_holder = self.request.auth if isinstance(self.request.auth, (TeamAPIToken, Device)) else self.request.user
if not perm_holder.has_organizer_permission(self.request.organizer, 'can_change_organizer_settings', if not perm_holder.has_organizer_permission(self.request.organizer, 'organizer.settings.general:write',
request=self.request): request=self.request):
if self.request.user.is_authenticated: if self.request.user.is_authenticated:
qs = self.request.organizer.scheduled_exports.filter(owner=self.request.user) qs = self.request.organizer.scheduled_exports.filter(owner=self.request.user)
@@ -324,9 +324,9 @@ class ScheduledOrganizerExportViewSet(ScheduledExportersViewSet):
@cached_property @cached_property
def events(self): def events(self):
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
return self.request.auth.get_events_with_permission('can_view_orders') return self.request.auth.get_events_with_permission('event.orders:read')
elif self.request.user.is_authenticated: elif self.request.user.is_authenticated:
return self.request.user.get_events_with_permission('can_view_orders', self.request).filter( return self.request.user.get_events_with_permission('event.orders:read', self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
+9 -9
View File
@@ -99,7 +99,7 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
ordering = ('position', 'id') ordering = ('position', 'id')
filterset_class = ItemFilter filterset_class = ItemFilter
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.items.select_related('tax_rule').prefetch_related( return self.request.event.items.select_related('tax_rule').prefetch_related(
@@ -163,7 +163,7 @@ class ItemVariationViewSet(viewsets.ModelViewSet):
ordering_fields = ('id', 'position') ordering_fields = ('id', 'position')
ordering = ('id',) ordering = ('id',)
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
@cached_property @cached_property
def item(self): def item(self):
@@ -234,7 +234,7 @@ class ItemBundleViewSet(viewsets.ModelViewSet):
ordering_fields = ('id',) ordering_fields = ('id',)
ordering = ('id',) ordering = ('id',)
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
@cached_property @cached_property
def item(self): def item(self):
@@ -286,7 +286,7 @@ class ItemProgramTimeViewSet(viewsets.ModelViewSet):
ordering_fields = ('id',) ordering_fields = ('id',)
ordering = ('id',) ordering = ('id',)
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
@cached_property @cached_property
def item(self): def item(self):
@@ -339,7 +339,7 @@ class ItemAddOnViewSet(viewsets.ModelViewSet):
ordering_fields = ('id', 'position') ordering_fields = ('id', 'position')
ordering = ('id',) ordering = ('id',)
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
@cached_property @cached_property
def item(self): def item(self):
@@ -398,7 +398,7 @@ class ItemCategoryViewSet(ConditionalListView, viewsets.ModelViewSet):
ordering_fields = ('id', 'position') ordering_fields = ('id', 'position')
ordering = ('position', 'id') ordering = ('position', 'id')
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.categories.all() return self.request.event.categories.all()
@@ -453,7 +453,7 @@ class QuestionViewSet(ConditionalListView, viewsets.ModelViewSet):
ordering_fields = ('id', 'position') ordering_fields = ('id', 'position')
ordering = ('position', 'id') ordering = ('position', 'id')
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.questions.prefetch_related('options').all() return self.request.event.questions.prefetch_related('options').all()
@@ -497,7 +497,7 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
ordering_fields = ('id', 'position') ordering_fields = ('id', 'position')
ordering = ('position',) ordering = ('position',)
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
def get_queryset(self): def get_queryset(self):
q = get_object_or_404(Question, pk=self.kwargs['question'], event=self.request.event) q = get_object_or_404(Question, pk=self.kwargs['question'], event=self.request.event)
@@ -564,7 +564,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
ordering_fields = ('id', 'size') ordering_fields = ('id', 'size')
ordering = ('id',) ordering = ('id',)
permission = None permission = None
write_permission = 'can_change_items' write_permission = 'event.items:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.quotas.select_related('subevent').prefetch_related('items', 'variations').all() return self.request.event.quotas.select_related('subevent').prefetch_related('items', 'variations').all()
+2 -2
View File
@@ -62,8 +62,8 @@ with scopes_disabled():
class ReusableMediaViewSet(viewsets.ModelViewSet): class ReusableMediaViewSet(viewsets.ModelViewSet):
serializer_class = ReusableMediaSerializer serializer_class = ReusableMediaSerializer
queryset = ReusableMedium.objects.none() queryset = ReusableMedium.objects.none()
permission = 'can_manage_reusable_media' permission = 'organizer.reusablemedia:read'
write_permission = 'can_manage_reusable_media' write_permission = 'organizer.reusablemedia:write'
filter_backends = (DjangoFilterBackend, OrderingFilter) filter_backends = (DjangoFilterBackend, OrderingFilter)
ordering = ('-updated', '-id') ordering = ('-updated', '-id')
ordering_fields = ('created', 'updated', 'identifier', 'type', 'id') ordering_fields = ('created', 'updated', 'identifier', 'type', 'id')
+19 -19
View File
@@ -317,7 +317,7 @@ class OrderViewSetMixin:
class OrganizerOrderViewSet(OrderViewSetMixin, viewsets.ReadOnlyModelViewSet): class OrganizerOrderViewSet(OrderViewSetMixin, viewsets.ReadOnlyModelViewSet):
def get_base_queryset(self): def get_base_queryset(self):
perm = "can_view_orders" if self.request.method in SAFE_METHODS else "can_change_orders" perm = "event.orders:read" if self.request.method in SAFE_METHODS else "event.orders:write"
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
return Order.objects.filter( return Order.objects.filter(
event__organizer=self.request.organizer, event__organizer=self.request.organizer,
@@ -338,8 +338,8 @@ class OrganizerOrderViewSet(OrderViewSetMixin, viewsets.ReadOnlyModelViewSet):
class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet): class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
def get_serializer_context(self): def get_serializer_context(self):
ctx = super().get_serializer_context() ctx = super().get_serializer_context()
@@ -1072,8 +1072,8 @@ class OrderPositionViewSetMixin:
ordering = ('order__datetime', 'positionid') ordering = ('order__datetime', 'positionid')
ordering_fields = ('order__code', 'order__datetime', 'positionid', 'attendee_name', 'order__status',) ordering_fields = ('order__code', 'order__datetime', 'positionid', 'attendee_name', 'order__status',)
filterset_class = OrderPositionFilter filterset_class = OrderPositionFilter
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
ordering_custom = { ordering_custom = {
'attendee_name': { 'attendee_name': {
'_order': F('display_name').asc(nulls_first=True), '_order': F('display_name').asc(nulls_first=True),
@@ -1611,8 +1611,8 @@ class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet
class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet): class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = OrderPaymentSerializer serializer_class = OrderPaymentSerializer
queryset = OrderPayment.objects.none() queryset = OrderPayment.objects.none()
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
lookup_field = 'local_id' lookup_field = 'local_id'
def get_serializer_context(self): def get_serializer_context(self):
@@ -1784,8 +1784,8 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
class RefundViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet): class RefundViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = OrderRefundSerializer serializer_class = OrderRefundSerializer
queryset = OrderRefund.objects.none() queryset = OrderRefund.objects.none()
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
lookup_field = 'local_id' lookup_field = 'local_id'
def get_queryset(self): def get_queryset(self):
@@ -1942,13 +1942,13 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
ordering = ('nr',) ordering = ('nr',)
ordering_fields = ('nr', 'date') ordering_fields = ('nr', 'date')
filterset_class = InvoiceFilter filterset_class = InvoiceFilter
permission = 'can_view_orders' permission = 'event.orders:read'
lookup_url_kwarg = 'number' lookup_url_kwarg = 'number'
lookup_field = 'nr' lookup_field = 'nr'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
def get_queryset(self): def get_queryset(self):
perm = "can_view_orders" if self.request.method in SAFE_METHODS else "can_change_orders" perm = "event.orders:read" if self.request.method in SAFE_METHODS else "event.orders:write"
if getattr(self.request, 'event', None): if getattr(self.request, 'event', None):
qs = self.request.event.invoices qs = self.request.event.invoices
elif isinstance(self.request.auth, (TeamAPIToken, Device)): elif isinstance(self.request.auth, (TeamAPIToken, Device)):
@@ -2089,8 +2089,8 @@ class RevokedSecretViewSet(viewsets.ReadOnlyModelViewSet):
ordering = ('-created',) ordering = ('-created',)
ordering_fields = ('created', 'secret') ordering_fields = ('created', 'secret')
filterset_class = RevokedSecretFilter filterset_class = RevokedSecretFilter
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
def get_queryset(self): def get_queryset(self):
return RevokedTicketSecret.objects.filter(event=self.request.event) return RevokedTicketSecret.objects.filter(event=self.request.event)
@@ -2111,8 +2111,8 @@ class BlockedSecretViewSet(viewsets.ReadOnlyModelViewSet):
filter_backends = (DjangoFilterBackend, TotalOrderingFilter) filter_backends = (DjangoFilterBackend, TotalOrderingFilter)
ordering = ('-updated', '-pk') ordering = ('-updated', '-pk')
filterset_class = BlockedSecretFilter filterset_class = BlockedSecretFilter
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
def get_queryset(self): def get_queryset(self):
return BlockedTicketSecret.objects.filter(event=self.request.event) return BlockedTicketSecret.objects.filter(event=self.request.event)
@@ -2147,7 +2147,7 @@ class TransactionViewSet(viewsets.ReadOnlyModelViewSet):
ordering = ('datetime', 'pk') ordering = ('datetime', 'pk')
ordering_fields = ('datetime', 'created', 'id',) ordering_fields = ('datetime', 'created', 'id',)
filterset_class = TransactionFilter filterset_class = TransactionFilter
permission = 'can_view_orders' permission = 'event.orders:read'
def get_queryset(self): def get_queryset(self):
return Transaction.objects.filter(order__event=self.request.event).select_related("order") return Transaction.objects.filter(order__event=self.request.event).select_related("order")
@@ -2164,11 +2164,11 @@ class OrganizerTransactionViewSet(TransactionViewSet):
if isinstance(self.request.auth, (TeamAPIToken, Device)): if isinstance(self.request.auth, (TeamAPIToken, Device)):
qs = qs.filter( qs = qs.filter(
order__event__in=self.request.auth.get_events_with_permission("can_view_orders"), order__event__in=self.request.auth.get_events_with_permission("event.orders:read"),
) )
elif self.request.user.is_authenticated: elif self.request.user.is_authenticated:
qs = qs.filter( qs = qs.filter(
order__event__in=self.request.user.get_events_with_permission("can_view_orders", request=self.request) order__event__in=self.request.user.get_events_with_permission("event.orders:read", request=self.request)
) )
else: else:
raise PermissionDenied("Unknown authentication scheme") raise PermissionDenied("Unknown authentication scheme")
+23 -23
View File
@@ -70,7 +70,7 @@ class OrganizerViewSet(mixins.UpdateModelMixin, viewsets.ReadOnlyModelViewSet):
filter_backends = (TotalOrderingFilter,) filter_backends = (TotalOrderingFilter,)
ordering = ('slug',) ordering = ('slug',)
ordering_fields = ('name', 'slug') ordering_fields = ('name', 'slug')
write_permission = "can_change_organizer_settings" write_permission = "organizer.settings.general:write"
def get_queryset(self): def get_queryset(self):
if self.request.user.is_authenticated: if self.request.user.is_authenticated:
@@ -154,8 +154,8 @@ class OrganizerViewSet(mixins.UpdateModelMixin, viewsets.ReadOnlyModelViewSet):
class SeatingPlanViewSet(viewsets.ModelViewSet): class SeatingPlanViewSet(viewsets.ModelViewSet):
serializer_class = SeatingPlanSerializer serializer_class = SeatingPlanSerializer
queryset = SeatingPlan.objects.none() queryset = SeatingPlan.objects.none()
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
write_permission = 'can_change_organizer_settings' write_permission = 'organizer.settings.general:write'
def get_queryset(self): def get_queryset(self):
return self.request.organizer.seating_plans.order_by('name') return self.request.organizer.seating_plans.order_by('name')
@@ -221,8 +221,8 @@ with scopes_disabled():
class GiftCardViewSet(viewsets.ModelViewSet): class GiftCardViewSet(viewsets.ModelViewSet):
serializer_class = GiftCardSerializer serializer_class = GiftCardSerializer
queryset = GiftCard.objects.none() queryset = GiftCard.objects.none()
permission = 'can_manage_gift_cards' permission = 'organizer.giftcards:write'
write_permission = 'can_manage_gift_cards' write_permission = 'organizer.giftcards:write'
filter_backends = (DjangoFilterBackend,) filter_backends = (DjangoFilterBackend,)
filterset_class = GiftCardFilter filterset_class = GiftCardFilter
@@ -344,8 +344,8 @@ class GiftCardViewSet(viewsets.ModelViewSet):
class GiftCardTransactionViewSet(viewsets.ReadOnlyModelViewSet): class GiftCardTransactionViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = GiftCardTransactionSerializer serializer_class = GiftCardTransactionSerializer
queryset = GiftCardTransaction.objects.none() queryset = GiftCardTransaction.objects.none()
permission = 'can_manage_gift_cards' permission = 'organizer.giftcards:write'
write_permission = 'can_manage_gift_cards' write_permission = 'organizer.giftcards:write'
@cached_property @cached_property
def giftcard(self): def giftcard(self):
@@ -362,8 +362,8 @@ class GiftCardTransactionViewSet(viewsets.ReadOnlyModelViewSet):
class TeamViewSet(viewsets.ModelViewSet): class TeamViewSet(viewsets.ModelViewSet):
serializer_class = TeamSerializer serializer_class = TeamSerializer
queryset = Team.objects.none() queryset = Team.objects.none()
permission = 'can_change_teams' permission = 'organizer.teams:write'
write_permission = 'can_change_teams' write_permission = 'organizer.teams:write'
def get_queryset(self): def get_queryset(self):
return self.request.organizer.teams.order_by('pk') return self.request.organizer.teams.order_by('pk')
@@ -402,8 +402,8 @@ class TeamViewSet(viewsets.ModelViewSet):
class TeamMemberViewSet(DestroyModelMixin, viewsets.ReadOnlyModelViewSet): class TeamMemberViewSet(DestroyModelMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = TeamMemberSerializer serializer_class = TeamMemberSerializer
queryset = User.objects.none() queryset = User.objects.none()
permission = 'can_change_teams' permission = 'organizer.teams:write'
write_permission = 'can_change_teams' write_permission = 'organizer.teams:write'
@cached_property @cached_property
def team(self): def team(self):
@@ -431,8 +431,8 @@ class TeamMemberViewSet(DestroyModelMixin, viewsets.ReadOnlyModelViewSet):
class TeamInviteViewSet(CreateModelMixin, DestroyModelMixin, viewsets.ReadOnlyModelViewSet): class TeamInviteViewSet(CreateModelMixin, DestroyModelMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = TeamInviteSerializer serializer_class = TeamInviteSerializer
queryset = TeamInvite.objects.none() queryset = TeamInvite.objects.none()
permission = 'can_change_teams' permission = 'organizer.teams:write'
write_permission = 'can_change_teams' write_permission = 'organizer.teams:write'
@cached_property @cached_property
def team(self): def team(self):
@@ -468,8 +468,8 @@ class TeamInviteViewSet(CreateModelMixin, DestroyModelMixin, viewsets.ReadOnlyMo
class TeamAPITokenViewSet(CreateModelMixin, DestroyModelMixin, viewsets.ReadOnlyModelViewSet): class TeamAPITokenViewSet(CreateModelMixin, DestroyModelMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = TeamAPITokenSerializer serializer_class = TeamAPITokenSerializer
queryset = TeamAPIToken.objects.none() queryset = TeamAPIToken.objects.none()
permission = 'can_change_teams' permission = 'organizer.teams:write'
write_permission = 'can_change_teams' write_permission = 'organizer.teams:write'
@cached_property @cached_property
def team(self): def team(self):
@@ -532,8 +532,8 @@ class DeviceViewSet(mixins.CreateModelMixin,
GenericViewSet): GenericViewSet):
serializer_class = DeviceSerializer serializer_class = DeviceSerializer
queryset = Device.objects.none() queryset = Device.objects.none()
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
write_permission = 'can_change_organizer_settings' write_permission = 'organizer.settings.general:write'
lookup_field = 'device_id' lookup_field = 'device_id'
def get_queryset(self): def get_queryset(self):
@@ -568,7 +568,7 @@ class DeviceViewSet(mixins.CreateModelMixin,
class OrganizerSettingsView(views.APIView): class OrganizerSettingsView(views.APIView):
permission = None permission = None
write_permission = 'can_change_organizer_settings' write_permission = 'organizer.settings.general:write'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer, context={ s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer, context={
@@ -618,7 +618,7 @@ with scopes_disabled():
class CustomerViewSet(viewsets.ModelViewSet): class CustomerViewSet(viewsets.ModelViewSet):
serializer_class = CustomerSerializer serializer_class = CustomerSerializer
queryset = Customer.objects.none() queryset = Customer.objects.none()
permission = 'can_manage_customers' permission = 'organizer.customers:write'
lookup_field = 'identifier' lookup_field = 'identifier'
filter_backends = (DjangoFilterBackend,) filter_backends = (DjangoFilterBackend,)
filterset_class = CustomerFilter filterset_class = CustomerFilter
@@ -678,7 +678,7 @@ class CustomerViewSet(viewsets.ModelViewSet):
class MembershipTypeViewSet(viewsets.ModelViewSet): class MembershipTypeViewSet(viewsets.ModelViewSet):
serializer_class = MembershipTypeSerializer serializer_class = MembershipTypeSerializer
queryset = MembershipType.objects.none() queryset = MembershipType.objects.none()
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
def get_queryset(self): def get_queryset(self):
qs = self.request.organizer.membership_types.all() qs = self.request.organizer.membership_types.all()
@@ -735,7 +735,7 @@ with scopes_disabled():
class MembershipViewSet(viewsets.ModelViewSet): class MembershipViewSet(viewsets.ModelViewSet):
serializer_class = MembershipSerializer serializer_class = MembershipSerializer
queryset = Membership.objects.none() queryset = Membership.objects.none()
permission = 'can_manage_customers' permission = 'organizer.customers:write'
filter_backends = (DjangoFilterBackend,) filter_backends = (DjangoFilterBackend,)
filterset_class = MembershipFilter filterset_class = MembershipFilter
@@ -785,8 +785,8 @@ with scopes_disabled():
class SalesChannelViewSet(viewsets.ModelViewSet): class SalesChannelViewSet(viewsets.ModelViewSet):
serializer_class = SalesChannelSerializer serializer_class = SalesChannelSerializer
queryset = SalesChannel.objects.none() queryset = SalesChannel.objects.none()
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
write_permission = 'can_change_organizer_settings' write_permission = 'organizer.settings.general:write'
filter_backends = (DjangoFilterBackend,) filter_backends = (DjangoFilterBackend,)
filterset_class = SalesChannelFilter filterset_class = SalesChannelFilter
lookup_field = 'identifier' lookup_field = 'identifier'
+1 -1
View File
@@ -204,7 +204,7 @@ class ShreddersMixin:
class EventShreddersViewSet(ShreddersMixin, viewsets.ViewSet): class EventShreddersViewSet(ShreddersMixin, viewsets.ViewSet):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_serializer_kwargs(self): def get_serializer_kwargs(self):
return {} return {}
+2 -2
View File
@@ -62,8 +62,8 @@ class VoucherViewSet(viewsets.ModelViewSet):
ordering = ('id',) ordering = ('id',)
ordering_fields = ('id', 'code', 'max_usages', 'valid_until', 'value') ordering_fields = ('id', 'code', 'max_usages', 'valid_until', 'value')
filterset_class = VoucherFilter filterset_class = VoucherFilter
permission = 'can_view_vouchers' permission = 'event.vouchers:read'
write_permission = 'can_change_vouchers' write_permission = 'event.vouchers:write'
@scopes_disabled() # we have an event check here, and we can save some performance on subqueries @scopes_disabled() # we have an event check here, and we can save some performance on subqueries
def get_queryset(self): def get_queryset(self):
+2 -2
View File
@@ -51,8 +51,8 @@ class WaitingListViewSet(viewsets.ModelViewSet):
ordering = ('created', 'pk',) ordering = ('created', 'pk',)
ordering_fields = ('id', 'created', 'email', 'item') ordering_fields = ('id', 'created', 'email', 'item')
filterset_class = WaitingListFilter filterset_class = WaitingListFilter
permission = 'can_view_orders' permission = 'event.orders:read'
write_permission = 'can_change_orders' write_permission = 'event.orders:write'
def get_queryset(self): def get_queryset(self):
return self.request.event.waitinglistentries.all() return self.request.event.waitinglistentries.all()
+2 -2
View File
@@ -35,8 +35,8 @@ class WebhookFilter(FilterSet):
class WebHookViewSet(viewsets.ModelViewSet): class WebHookViewSet(viewsets.ModelViewSet):
serializer_class = WebHookSerializer serializer_class = WebHookSerializer
queryset = WebHook.objects.none() queryset = WebHook.objects.none()
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
write_permission = 'can_change_organizer_settings' write_permission = 'organizer.settings.general:write'
filter_backends = (DjangoFilterBackend,) filter_backends = (DjangoFilterBackend,)
filterset_class = WebhookFilter filterset_class = WebhookFilter
+1 -1
View File
@@ -224,7 +224,7 @@ class HistoryPasswordValidator:
).delete() ).delete()
def has_event_access_permission(request, permission='can_change_event_settings'): def has_event_access_permission(request, permission='event.settings.general:write'):
return ( return (
request.user.is_authenticated and request.user.is_authenticated and
request.user.has_event_permission(request.organizer, request.event, permission, request=request) request.user.has_event_permission(request.organizer, request.event, permission, request=request)
+1 -1
View File
@@ -184,7 +184,7 @@ class OrganizerLevelExportMixin:
The permission level required to use this exporter. Only useful for organizer-level exports, The permission level required to use this exporter. Only useful for organizer-level exports,
not for event-level exports. not for event-level exports.
""" """
return 'can_view_orders' return 'event.orders:read'
class ListExporter(BaseExporter): class ListExporter(BaseExporter):
+1 -1
View File
@@ -47,7 +47,7 @@ from ..signals import register_multievent_data_exporters
class CustomerListExporter(OrganizerLevelExportMixin, ListExporter): class CustomerListExporter(OrganizerLevelExportMixin, ListExporter):
identifier = 'customerlist' identifier = 'customerlist'
verbose_name = gettext_lazy('Customer accounts') verbose_name = gettext_lazy('Customer accounts')
organizer_required_permission = 'can_manage_customers' organizer_required_permission = 'organizer.customers:write'
category = pgettext_lazy('export_category', 'Customer accounts') category = pgettext_lazy('export_category', 'Customer accounts')
description = gettext_lazy('Download a spreadsheet of all currently registered customer accounts.') description = gettext_lazy('Download a spreadsheet of all currently registered customer accounts.')
+2 -2
View File
@@ -1237,7 +1237,7 @@ class QuotaListExporter(ListExporter):
class GiftcardTransactionListExporter(OrganizerLevelExportMixin, ListExporter): class GiftcardTransactionListExporter(OrganizerLevelExportMixin, ListExporter):
identifier = 'giftcardtransactionlist' identifier = 'giftcardtransactionlist'
verbose_name = gettext_lazy('Gift card transactions') verbose_name = gettext_lazy('Gift card transactions')
organizer_required_permission = 'can_manage_gift_cards' organizer_required_permission = 'organizer.giftcards:write'
category = pgettext_lazy('export_category', 'Gift cards') category = pgettext_lazy('export_category', 'Gift cards')
description = gettext_lazy('Download a spreadsheet of all gift card transactions.') description = gettext_lazy('Download a spreadsheet of all gift card transactions.')
repeatable_read = False repeatable_read = False
@@ -1344,7 +1344,7 @@ class GiftcardRedemptionListExporter(ListExporter):
class GiftcardListExporter(OrganizerLevelExportMixin, ListExporter): class GiftcardListExporter(OrganizerLevelExportMixin, ListExporter):
identifier = 'giftcardlist' identifier = 'giftcardlist'
verbose_name = gettext_lazy('Gift cards') verbose_name = gettext_lazy('Gift cards')
organizer_required_permission = 'can_manage_gift_cards' organizer_required_permission = 'organizer.giftcards:write'
category = pgettext_lazy('export_category', 'Gift cards') category = pgettext_lazy('export_category', 'Gift cards')
description = gettext_lazy('Download a spreadsheet of all gift cards including their current value.') description = gettext_lazy('Download a spreadsheet of all gift cards including their current value.')
+8 -6
View File
@@ -191,11 +191,13 @@ class Device(LoggedModel):
def permission_set(self) -> set: def permission_set(self) -> set:
return { return {
'can_view_orders', 'event.orders:read',
'can_change_orders', 'event.orders:write',
'can_view_vouchers', 'event.vouchers:read',
'can_manage_gift_cards', 'organizer.giftcards:read',
'can_manage_reusable_media', 'organizer.giftcards:write',
'organizer.reusablemedia:read',
'organizer.reusablemedia:write',
} }
def get_event_permission_set(self, organizer, event) -> set: def get_event_permission_set(self, organizer, event) -> set:
@@ -271,7 +273,7 @@ class Device(LoggedModel):
:return: Iterable of Events :return: Iterable of Events
""" """
if ( if (
isinstance(permission, (list, tuple)) and any(p in self.permission_set() for p in permission) isinstance(permission, (list, tuple)) and any(p in self.permission_set() for p in permission)
) or (isinstance(permission, str) and permission in self.permission_set()): ) or (isinstance(permission, str) and permission in self.permission_set()):
return self.get_events_with_any_permission() return self.get_events_with_any_permission()
else: else:
+2 -2
View File
@@ -578,8 +578,8 @@ class TeamAPIToken(models.Model):
:return: Iterable of Events :return: Iterable of Events
""" """
if ( if (
isinstance(permission, (list, tuple)) and any(getattr(self.team, p, False) for p in permission) isinstance(permission, (list, tuple)) and any(self.team.has_event_permission(p) for p in permission)
) or (isinstance(permission, str) and getattr(self.team, permission, False)): ) or (isinstance(permission, str) and self.team.has_event_permission(permission)):
return self.get_events_with_any_permission() return self.get_events_with_any_permission()
else: else:
return self.team.organizer.events.none() return self.team.organizer.events.none()
+1 -1
View File
@@ -151,7 +151,7 @@ def get_all_notification_types(event=None):
class ParametrizedOrderNotificationType(NotificationType): class ParametrizedOrderNotificationType(NotificationType):
required_permission = "can_view_orders" required_permission = "event.orders:read"
def __init__(self, event, action_type, verbose_name, title): def __init__(self, event, action_type, verbose_name, title):
self._action_type = action_type self._action_type = action_type
+3 -3
View File
@@ -106,7 +106,7 @@ def multiexport(self, organizer: Organizer, user: User, device: int, token: int,
device = Device.objects.get(pk=device) device = Device.objects.get(pk=device)
if token: if token:
device = TeamAPIToken.objects.get(pk=token) device = TeamAPIToken.objects.get(pk=token)
allowed_events = (device or token or user).get_events_with_permission('can_view_orders') allowed_events = (device or token or user).get_events_with_permission('event.orders:read')
if user and staff_session: if user and staff_session:
allowed_events = organizer.events.all() allowed_events = organizer.events.all()
@@ -291,7 +291,7 @@ def _run_scheduled_export(schedule, context: Union[Event, Organizer], exporter,
def scheduled_organizer_export(self, organizer: Organizer, schedule: int) -> None: def scheduled_organizer_export(self, organizer: Organizer, schedule: int) -> None:
schedule = organizer.scheduled_exports.get(pk=schedule) schedule = organizer.scheduled_exports.get(pk=schedule)
allowed_events = schedule.owner.get_events_with_permission('can_view_orders') allowed_events = schedule.owner.get_events_with_permission('event.orders:read')
if schedule.export_form_data.get('events') is not None and not schedule.export_form_data.get('all_events'): if schedule.export_form_data.get('events') is not None and not schedule.export_form_data.get('all_events'):
if isinstance(schedule.export_form_data['events'][0], str): if isinstance(schedule.export_form_data['events'][0], str):
events = allowed_events.filter(slug__in=schedule.export_form_data.get('events'), organizer=organizer) events = allowed_events.filter(slug__in=schedule.export_form_data.get('events'), organizer=organizer)
@@ -346,7 +346,7 @@ def scheduled_event_export(self, event: Event, schedule: int) -> None:
exporter = ex exporter = ex
break break
has_permission = schedule.owner.is_active and schedule.owner.has_event_permission(event.organizer, event, 'can_view_orders') has_permission = schedule.owner.is_active and schedule.owner.has_event_permission(event.organizer, event, 'event.orders:read')
_run_scheduled_export( _run_scheduled_export(
schedule, schedule,
+1 -1
View File
@@ -102,7 +102,7 @@ def _default_context(request):
complain_testmode_orders = request.event.orders.filter(testmode=True).exists() complain_testmode_orders = request.event.orders.filter(testmode=True).exists()
request.event.cache.set('complain_testmode_orders', complain_testmode_orders, 30) request.event.cache.set('complain_testmode_orders', complain_testmode_orders, 30)
ctx['complain_testmode_orders'] = complain_testmode_orders and request.user.has_event_permission( ctx['complain_testmode_orders'] = complain_testmode_orders and request.user.has_event_permission(
request.organizer, request.event, 'can_view_orders', request=request request.organizer, request.event, 'event.orders:read', request=request
) )
else: else:
ctx['complain_testmode_orders'] = False ctx['complain_testmode_orders'] = False
+1 -1
View File
@@ -1111,7 +1111,7 @@ class OrderPaymentSearchFilterForm(forms.Form):
self.fields['organizer'].queryset = Organizer.objects.filter( self.fields['organizer'].queryset = Organizer.objects.filter(
pk__in=self.request.user.teams.values_list('organizer', flat=True) pk__in=self.request.user.teams.values_list('organizer', flat=True)
) )
self.fields['event'].queryset = self.request.user.get_events_with_permission('can_view_orders') self.fields['event'].queryset = self.request.user.get_events_with_permission('event.orders:read')
self.fields['provider'].choices += get_all_payment_providers() self.fields['provider'].choices += get_all_payment_providers()
+15 -15
View File
@@ -43,7 +43,7 @@ def get_event_navigation(request: HttpRequest):
'icon': 'dashboard', 'icon': 'dashboard',
} }
] ]
if 'can_change_event_settings' in request.eventpermset: if 'event.settings.general:write' in request.eventpermset:
event_settings = [ event_settings = [
{ {
'label': _('General'), 'label': _('General'),
@@ -133,7 +133,7 @@ def get_event_navigation(request: HttpRequest):
'children': event_settings 'children': event_settings
}) })
if 'can_change_items' in request.eventpermset: if 'event.items:write' in request.eventpermset:
nav.append({ nav.append({
'label': _('Products'), 'label': _('Products'),
'url': reverse('control:event.items', kwargs={ 'url': reverse('control:event.items', kwargs={
@@ -187,7 +187,7 @@ def get_event_navigation(request: HttpRequest):
] ]
}) })
if 'can_change_event_settings' in request.eventpermset: if 'event.settings.general:write' in request.eventpermset:
if request.event.has_subevents: if request.event.has_subevents:
nav.append({ nav.append({
'label': pgettext_lazy('subevent', 'Dates'), 'label': pgettext_lazy('subevent', 'Dates'),
@@ -199,7 +199,7 @@ def get_event_navigation(request: HttpRequest):
'icon': 'calendar', 'icon': 'calendar',
}) })
if 'can_view_orders' in request.eventpermset: if 'event.orders:read' in request.eventpermset:
children = [ children = [
{ {
'label': _('All orders'), 'label': _('All orders'),
@@ -242,7 +242,7 @@ def get_event_navigation(request: HttpRequest):
'active': 'event.orders.waitinglist' in url.url_name, 'active': 'event.orders.waitinglist' in url.url_name,
}, },
] ]
if 'can_change_orders' in request.eventpermset: if 'event.orders:write' in request.eventpermset:
children.append({ children.append({
'label': _('Import'), 'label': _('Import'),
'url': reverse('control:event.orders.import', kwargs={ 'url': reverse('control:event.orders.import', kwargs={
@@ -262,7 +262,7 @@ def get_event_navigation(request: HttpRequest):
'children': children 'children': children
}) })
if 'can_view_vouchers' in request.eventpermset: if 'event.vouchers:read' in request.eventpermset:
nav.append({ nav.append({
'label': _('Vouchers'), 'label': _('Vouchers'),
'url': reverse('control:event.vouchers', kwargs={ 'url': reverse('control:event.vouchers', kwargs={
@@ -291,7 +291,7 @@ def get_event_navigation(request: HttpRequest):
] ]
}) })
if 'can_view_orders' in request.eventpermset: if 'event.orders:read' in request.eventpermset:
nav.append({ nav.append({
'label': pgettext_lazy('navigation', 'Check-in'), 'label': pgettext_lazy('navigation', 'Check-in'),
'url': reverse('control:event.orders.checkinlists', kwargs={ 'url': reverse('control:event.orders.checkinlists', kwargs={
@@ -480,7 +480,7 @@ def get_organizer_navigation(request):
'icon': 'calendar', 'icon': 'calendar',
}, },
] ]
if 'can_change_organizer_settings' in request.orgapermset: if 'organizer.settings.general:write' in request.orgapermset:
nav.append({ nav.append({
'label': _('Settings'), 'label': _('Settings'),
'url': reverse('control:organizer.edit', kwargs={ 'url': reverse('control:organizer.edit', kwargs={
@@ -534,7 +534,7 @@ def get_organizer_navigation(request):
] ]
}) })
if 'can_change_teams' in request.orgapermset: if 'organizer.teams:write' in request.orgapermset:
nav.append({ nav.append({
'label': _('Teams'), 'label': _('Teams'),
'url': reverse('control:organizer.teams', kwargs={ 'url': reverse('control:organizer.teams', kwargs={
@@ -544,7 +544,7 @@ def get_organizer_navigation(request):
'icon': 'group', 'icon': 'group',
}) })
if 'can_manage_gift_cards' in request.orgapermset: if 'organizer.giftcards:write' in request.orgapermset:
children = [] children = []
children.append({ children.append({
'label': _('Gift cards'), 'label': _('Gift cards'),
@@ -554,7 +554,7 @@ def get_organizer_navigation(request):
'active': 'organizer.giftcard' in url.url_name and 'acceptance' not in url.url_name, 'active': 'organizer.giftcard' in url.url_name and 'acceptance' not in url.url_name,
'children': children, 'children': children,
}) })
if 'can_change_organizer_settings' in request.orgapermset: if 'organizer.settings.general:write' in request.orgapermset:
children.append( children.append(
{ {
'label': _('Acceptance'), 'label': _('Acceptance'),
@@ -575,7 +575,7 @@ def get_organizer_navigation(request):
if request.organizer.settings.customer_accounts: if request.organizer.settings.customer_accounts:
children = [] children = []
if 'can_manage_customers' in request.orgapermset: if 'organizer.customers:write' in request.orgapermset:
children.append( children.append(
{ {
'label': _('Customers'), 'label': _('Customers'),
@@ -585,7 +585,7 @@ def get_organizer_navigation(request):
'active': 'organizer.customer' in url.url_name, 'active': 'organizer.customer' in url.url_name,
} }
) )
if 'can_change_organizer_settings' in request.orgapermset: if 'organizer.settings.general:write' in request.orgapermset:
children.append( children.append(
{ {
'label': _('Membership types'), 'label': _('Membership types'),
@@ -633,7 +633,7 @@ def get_organizer_navigation(request):
'active': 'organizer.reusable_medi' in url.url_name, 'active': 'organizer.reusable_medi' in url.url_name,
}) })
if 'can_change_organizer_settings' in request.orgapermset: if 'organizer.settings.general:write' in request.orgapermset:
nav.append({ nav.append({
'label': _('Devices'), 'label': _('Devices'),
'url': reverse('control:organizer.devices', kwargs={ 'url': reverse('control:organizer.devices', kwargs={
@@ -667,7 +667,7 @@ def get_organizer_navigation(request):
'icon': 'download', 'icon': 'download',
}) })
if 'can_change_organizer_settings' in request.orgapermset: if 'organizer.settings.general:write' in request.orgapermset:
merge_in(nav, [{ merge_in(nav, [{
'parent': reverse('control:organizer.export', kwargs={ 'parent': reverse('control:organizer.export', kwargs={
'organizer': request.organizer.slug, 'organizer': request.organizer.slug,
+4 -4
View File
@@ -53,9 +53,9 @@ def event_permission_required(permission):
This view decorator rejects all requests with a 403 response which are not from This view decorator rejects all requests with a 403 response which are not from
users having the given permission for the event the request is associated with. users having the given permission for the event the request is associated with.
""" """
if permission == 'can_change_settings': if permission == 'event.settings.general:write':
# Legacy support # Legacy support
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def decorator(function): def decorator(function):
def wrapper(request, *args, **kw): def wrapper(request, *args, **kw):
@@ -92,9 +92,9 @@ def organizer_permission_required(permission):
This view decorator rejects all requests with a 403 response which are not from This view decorator rejects all requests with a 403 response which are not from
users having the given permission for the event the request is associated with. users having the given permission for the event the request is associated with.
""" """
if permission == 'can_change_settings': if permission == 'event.settings.general:write':
# Legacy support # Legacy support
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
def decorator(function): def decorator(function):
def wrapper(request, *args, **kw): def wrapper(request, *args, **kw):
+12 -12
View File
@@ -150,7 +150,7 @@ class CheckInListShow(EventPermissionRequiredMixin, PaginationMixin, CheckInList
model = Checkin model = Checkin
context_object_name = 'entries' context_object_name = 'entries'
template_name = 'pretixcontrol/checkin/index.html' template_name = 'pretixcontrol/checkin/index.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
self.list = get_object_or_404(self.request.event.checkin_lists.all(), pk=kwargs.get("list")) self.list = get_object_or_404(self.request.event.checkin_lists.all(), pk=kwargs.get("list"))
@@ -211,7 +211,7 @@ class CheckInListBulkRevertConfirmView(CheckInListQueryMixin, EventPermissionReq
class CheckInListBulkActionView(CheckInListQueryMixin, EventPermissionRequiredMixin, AsyncPostView): class CheckInListBulkActionView(CheckInListQueryMixin, EventPermissionRequiredMixin, AsyncPostView):
permission = ('can_change_orders', 'can_checkin_orders') permission = ('event.orders:write', 'event.orders:checkin')
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
self.list = get_object_or_404(self.request.event.checkin_lists.all(), pk=kwargs.get("list")) self.list = get_object_or_404(self.request.event.checkin_lists.all(), pk=kwargs.get("list"))
@@ -228,7 +228,7 @@ class CheckInListBulkActionView(CheckInListQueryMixin, EventPermissionRequiredMi
self.list = get_object_or_404(request.event.checkin_lists.all(), pk=kwargs.get("list")) self.list = get_object_or_404(request.event.checkin_lists.all(), pk=kwargs.get("list"))
positions = self.get_queryset() positions = self.get_queryset()
if request.POST.get('revert') == 'true': if request.POST.get('revert') == 'true':
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_orders', request=request): if not request.user.has_event_permission(request.organizer, request.event, 'event.orders:write', request=request):
raise PermissionDenied() raise PermissionDenied()
for op in positions: for op in positions:
if op.order.status == Order.STATUS_PAID or ( if op.order.status == Order.STATUS_PAID or (
@@ -295,7 +295,7 @@ class CheckInListBulkActionView(CheckInListQueryMixin, EventPermissionRequiredMi
class CheckinListList(EventPermissionRequiredMixin, PaginationMixin, ListView): class CheckinListList(EventPermissionRequiredMixin, PaginationMixin, ListView):
model = CheckinList model = CheckinList
context_object_name = 'checkinlists' context_object_name = 'checkinlists'
permission = 'can_view_orders' permission = 'event.orders:read'
template_name = 'pretixcontrol/checkin/lists.html' template_name = 'pretixcontrol/checkin/lists.html'
ordering = ('subevent__date_from', 'name', 'pk') ordering = ('subevent__date_from', 'name', 'pk')
@@ -317,9 +317,9 @@ class CheckinListList(EventPermissionRequiredMixin, PaginationMixin, ListView):
cl.subevent.event = self.request.event # re-use same event object to make sure settings are cached cl.subevent.event = self.request.event # re-use same event object to make sure settings are cached
ctx['checkinlists'] = clists ctx['checkinlists'] = clists
ctx['can_change_organizer_settings'] = self.request.user.has_organizer_permission( ctx['organizer.settings.general:write'] = self.request.user.has_organizer_permission(
self.request.organizer, self.request.organizer,
'can_change_organizer_settings', 'organizer.settings.general:write',
self.request self.request
) )
ctx['filter_form'] = self.filter_form ctx['filter_form'] = self.filter_form
@@ -335,7 +335,7 @@ class CheckinListCreate(EventPermissionRequiredMixin, CreateView):
model = CheckinList model = CheckinList
form_class = CheckinListForm form_class = CheckinListForm
template_name = 'pretixcontrol/checkin/list_edit.html' template_name = 'pretixcontrol/checkin/list_edit.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'checkinlist' context_object_name = 'checkinlist'
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
@@ -386,7 +386,7 @@ class CheckinListUpdate(EventPermissionRequiredMixin, UpdateView):
model = CheckinList model = CheckinList
form_class = CheckinListForm form_class = CheckinListForm
template_name = 'pretixcontrol/checkin/list_edit.html' template_name = 'pretixcontrol/checkin/list_edit.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'checkinlist' context_object_name = 'checkinlist'
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
@@ -445,7 +445,7 @@ class CheckinListUpdate(EventPermissionRequiredMixin, UpdateView):
class CheckinListDelete(EventPermissionRequiredMixin, CompatDeleteView): class CheckinListDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = CheckinList model = CheckinList
template_name = 'pretixcontrol/checkin/list_delete.html' template_name = 'pretixcontrol/checkin/list_delete.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'checkinlist' context_object_name = 'checkinlist'
def get_object(self, queryset=None) -> CheckinList: def get_object(self, queryset=None) -> CheckinList:
@@ -476,7 +476,7 @@ class CheckinListDelete(EventPermissionRequiredMixin, CompatDeleteView):
class CheckinListView(EventPermissionRequiredMixin, PaginationMixin, ListView): class CheckinListView(EventPermissionRequiredMixin, PaginationMixin, ListView):
model = Checkin model = Checkin
context_object_name = 'checkins' context_object_name = 'checkins'
permission = 'can_view_orders' permission = 'event.orders:read'
template_name = 'pretixcontrol/checkin/checkins.html' template_name = 'pretixcontrol/checkin/checkins.html'
ordering = ('-datetime', '-pk') ordering = ('-datetime', '-pk')
@@ -505,7 +505,7 @@ class CheckinListView(EventPermissionRequiredMixin, PaginationMixin, ListView):
class CheckInListSimulator(EventPermissionRequiredMixin, FormView): class CheckInListSimulator(EventPermissionRequiredMixin, FormView):
template_name = 'pretixcontrol/checkin/simulator.html' template_name = 'pretixcontrol/checkin/simulator.html'
permission = 'can_view_orders' permission = 'event.orders:read'
form_class = CheckinListSimulatorForm form_class = CheckinListSimulatorForm
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
@@ -575,7 +575,7 @@ class CheckInListSimulator(EventPermissionRequiredMixin, FormView):
class CheckInResetView(CheckInListQueryMixin, EventPermissionRequiredMixin, AsyncFormView): class CheckInResetView(CheckInListQueryMixin, EventPermissionRequiredMixin, AsyncFormView):
form_class = CheckinResetForm form_class = CheckinResetForm
permission = "can_change_orders" permission = "event.orders:write"
template_name = "pretixcontrol/checkin/reset.html" template_name = "pretixcontrol/checkin/reset.html"
def get_error_url(self, *args): def get_error_url(self, *args):
+6 -6
View File
@@ -351,10 +351,10 @@ def event_index(request, organizer, event):
except SubEvent.DoesNotExist: except SubEvent.DoesNotExist:
pass pass
can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'can_view_orders', can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read',
request=request) request=request)
can_change_event_settings = request.user.has_event_permission(request.organizer, request.event, can_change_event_settings = request.user.has_event_permission(request.organizer, request.event,
'can_change_event_settings', request=request) 'event.settings.general:write', request=request)
widgets = [] widgets = []
if can_view_orders: if can_view_orders:
@@ -426,11 +426,11 @@ def event_index_log_lazy(request, organizer, event):
'device').order_by('-datetime') 'device').order_by('-datetime')
qs = qs.exclude(action_type__in=OVERVIEW_BANLIST) qs = qs.exclude(action_type__in=OVERVIEW_BANLIST)
can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'can_view_orders', can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read',
request=request) request=request)
can_change_event_settings = request.user.has_event_permission(request.organizer, request.event, can_change_event_settings = request.user.has_event_permission(request.organizer, request.event,
'can_change_event_settings', request=request) 'event.settings.general:write', request=request)
can_view_vouchers = request.user.has_event_permission(request.organizer, request.event, 'can_view_vouchers', can_view_vouchers = request.user.has_event_permission(request.organizer, request.event, 'event.vouchers:read',
request=request) request=request)
if not can_view_orders: if not can_view_orders:
@@ -442,7 +442,7 @@ def event_index_log_lazy(request, organizer, event):
ContentType.objects.get_for_model(Voucher), ContentType.objects.get_for_model(Voucher),
ContentType.objects.get_for_model(Order) ContentType.objects.get_for_model(Order)
] ]
if request.user.has_event_permission(request.organizer, request.event, 'can_change_items', request=request): if request.user.has_event_permission(request.organizer, request.event, 'event.items:write', request=request):
allowed_types += [ allowed_types += [
ContentType.objects.get_for_model(Item), ContentType.objects.get_for_model(Item),
ContentType.objects.get_for_model(ItemCategory), ContentType.objects.get_for_model(ItemCategory),
+3 -3
View File
@@ -72,7 +72,7 @@ def on_control_order_info(sender: Event, request, order: Order, **kwargs):
class ControlSyncJob(OrderView): class ControlSyncJob(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, request, provider, *args, **kwargs): def post(self, request, provider, *args, **kwargs):
prov, meta = datasync_providers.get(active_in=self.request.event, identifier=provider) prov, meta = datasync_providers.get(active_in=self.request.event, identifier=provider)
@@ -154,7 +154,7 @@ class GlobalFailedSyncJobsView(AdministratorPermissionRequiredMixin, FailedSyncJ
class OrganizerFailedSyncJobsView(OrganizerPermissionRequiredMixin, FailedSyncJobsView): class OrganizerFailedSyncJobsView(OrganizerPermissionRequiredMixin, FailedSyncJobsView):
permission = "can_change_organizer_settings" permission = "organizer.settings.general:write"
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter( return super().get_queryset().filter(
@@ -163,7 +163,7 @@ class OrganizerFailedSyncJobsView(OrganizerPermissionRequiredMixin, FailedSyncJo
class EventFailedSyncJobsView(EventPermissionRequiredMixin, FailedSyncJobsView): class EventFailedSyncJobsView(EventPermissionRequiredMixin, FailedSyncJobsView):
permission = "can_change_event_settings" permission = "event.settings.general:write"
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter( return super().get_queryset().filter(
+6 -6
View File
@@ -50,7 +50,7 @@ from . import CreateView, PaginationMixin, UpdateView
class DiscountDelete(EventPermissionRequiredMixin, CompatDeleteView): class DiscountDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = Discount model = Discount
template_name = 'pretixcontrol/items/discount_delete.html' template_name = 'pretixcontrol/items/discount_delete.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'discount' context_object_name = 'discount'
def get_context_data(self, *args, **kwargs) -> dict: def get_context_data(self, *args, **kwargs) -> dict:
@@ -96,7 +96,7 @@ class DiscountUpdate(EventPermissionRequiredMixin, UpdateView):
model = Discount model = Discount
form_class = DiscountForm form_class = DiscountForm
template_name = 'pretixcontrol/items/discount.html' template_name = 'pretixcontrol/items/discount.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'discount' context_object_name = 'discount'
def get_object(self, queryset=None) -> Discount: def get_object(self, queryset=None) -> Discount:
@@ -139,7 +139,7 @@ class DiscountCreate(EventPermissionRequiredMixin, CreateView):
model = Discount model = Discount
form_class = DiscountForm form_class = DiscountForm
template_name = 'pretixcontrol/items/discount.html' template_name = 'pretixcontrol/items/discount.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'discount' context_object_name = 'discount'
def get_success_url(self) -> str: def get_success_url(self) -> str:
@@ -227,7 +227,7 @@ def discount_move(request, discount, up=True):
messages.success(request, _('The order of discounts has been updated.')) messages.success(request, _('The order of discounts has been updated.'))
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def discount_move_up(request, organizer, event, discount): def discount_move_up(request, organizer, event, discount):
discount_move(request, discount, up=True) discount_move(request, discount, up=True)
@@ -236,7 +236,7 @@ def discount_move_up(request, organizer, event, discount):
event=request.event.slug) event=request.event.slug)
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def discount_move_down(request, organizer, event, discount): def discount_move_down(request, organizer, event, discount):
discount_move(request, discount, up=False) discount_move(request, discount, up=False)
@@ -246,7 +246,7 @@ def discount_move_down(request, organizer, event, discount):
@transaction.atomic @transaction.atomic
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def reorder_discounts(request, organizer, event): def reorder_discounts(request, organizer, event):
try: try:
+32 -32
View File
@@ -155,7 +155,7 @@ class MetaDataEditorMixin:
property=p, property=p,
disabled=( disabled=(
p.protected and p.protected and
not self.request.user.has_organizer_permission(self.request.organizer, 'can_change_organizer_settings', request=self.request) not self.request.user.has_organizer_permission(self.request.organizer, 'organizer.settings.general:write', request=self.request)
), ),
instance=val_instances.get(p.pk, self.meta_model(property=p, event=self.object)), instance=val_instances.get(p.pk, self.meta_model(property=p, event=self.object)),
data=(self.request.POST if self.request.method == "POST" else None) data=(self.request.POST if self.request.method == "POST" else None)
@@ -187,7 +187,7 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired
model = Event model = Event
form_class = EventUpdateForm form_class = EventUpdateForm
template_name = 'pretixcontrol/event/settings.html' template_name = 'pretixcontrol/event/settings.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
@cached_property @cached_property
def object(self) -> Event: def object(self) -> Event:
@@ -346,7 +346,7 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired
class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, TemplateView, SingleObjectMixin): class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
model = Event model = Event
context_object_name = 'event' context_object_name = 'event'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixcontrol/event/plugins.html' template_name = 'pretixcontrol/event/plugins.html'
def get_object(self, queryset=None) -> Event: def get_object(self, queryset=None) -> Event:
@@ -447,7 +447,7 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat
continue continue
if getattr(pluginmeta, 'level', PLUGIN_LEVEL_EVENT) == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID: if getattr(pluginmeta, 'level', PLUGIN_LEVEL_EVENT) == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID:
if not request.user.has_organizer_permission(request.organizer, "can_change_organizer_settings", request): if not request.user.has_organizer_permission(request.organizer, "organizer.settings.general:write", request):
messages.error( messages.error(
request, request,
_("You do not have sufficient permission to enable plugins that need to be enabled " _("You do not have sufficient permission to enable plugins that need to be enabled "
@@ -502,7 +502,7 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat
class PaymentProviderSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, TemplateView, SingleObjectMixin): class PaymentProviderSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
model = Event model = Event
context_object_name = 'event' context_object_name = 'event'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixcontrol/event/payment_provider.html' template_name = 'pretixcontrol/event/payment_provider.html'
def get_success_url(self) -> str: def get_success_url(self) -> str:
@@ -581,7 +581,7 @@ class PaymentProviderSettings(EventSettingsViewMixin, EventPermissionRequiredMix
class EventSettingsFormView(EventPermissionRequiredMixin, DecoupleMixin, FormView): class EventSettingsFormView(EventPermissionRequiredMixin, DecoupleMixin, FormView):
model = Event model = Event
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_context_data(self, *args, **kwargs) -> dict: def get_context_data(self, *args, **kwargs) -> dict:
context = super().get_context_data(*args, **kwargs) context = super().get_context_data(*args, **kwargs)
@@ -621,7 +621,7 @@ class EventSettingsFormView(EventPermissionRequiredMixin, DecoupleMixin, FormVie
class PaymentSettings(EventSettingsViewMixin, EventSettingsFormView): class PaymentSettings(EventSettingsViewMixin, EventSettingsFormView):
template_name = 'pretixcontrol/event/payment.html' template_name = 'pretixcontrol/event/payment.html'
form_class = PaymentSettingsForm form_class = PaymentSettingsForm
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('control:event.settings.payment', kwargs={ return reverse('control:event.settings.payment', kwargs={
@@ -650,7 +650,7 @@ class PaymentSettings(EventSettingsViewMixin, EventSettingsFormView):
class TaxSettings(EventSettingsViewMixin, EventSettingsFormView): class TaxSettings(EventSettingsViewMixin, EventSettingsFormView):
template_name = 'pretixcontrol/event/tax.html' template_name = 'pretixcontrol/event/tax.html'
form_class = TaxSettingsForm form_class = TaxSettingsForm
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('control:event.settings.tax', kwargs={ return reverse('control:event.settings.tax', kwargs={
@@ -670,7 +670,7 @@ class InvoiceSettings(EventSettingsViewMixin, EventSettingsFormView):
model = Event model = Event
form_class = InvoiceSettingsForm form_class = InvoiceSettingsForm
template_name = 'pretixcontrol/event/invoicing.html' template_name = 'pretixcontrol/event/invoicing.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
types = get_transmission_types() types = get_transmission_types()
@@ -704,7 +704,7 @@ class CancelSettings(EventSettingsViewMixin, EventSettingsFormView):
model = Event model = Event
form_class = CancelSettingsForm form_class = CancelSettingsForm
template_name = 'pretixcontrol/event/cancel.html' template_name = 'pretixcontrol/event/cancel.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('control:event.settings.cancel', kwargs={ return reverse('control:event.settings.cancel', kwargs={
@@ -738,7 +738,7 @@ class CancelSettings(EventSettingsViewMixin, EventSettingsFormView):
class InvoicePreview(EventPermissionRequiredMixin, View): class InvoicePreview(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
fname, ftype, fcontent = build_preview_invoice_pdf(request.event) fname, ftype, fcontent = build_preview_invoice_pdf(request.event)
@@ -753,7 +753,7 @@ class InvoicePreview(EventPermissionRequiredMixin, View):
class DangerZone(EventPermissionRequiredMixin, TemplateView): class DangerZone(EventPermissionRequiredMixin, TemplateView):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixcontrol/event/dangerzone.html' template_name = 'pretixcontrol/event/dangerzone.html'
@@ -769,7 +769,7 @@ class MailSettings(EventSettingsViewMixin, EventSettingsFormView):
model = Event model = Event
form_class = MailSettingsForm form_class = MailSettingsForm
template_name = 'pretixcontrol/event/mail.html' template_name = 'pretixcontrol/event/mail.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('control:event.settings.mail', kwargs={ return reverse('control:event.settings.mail', kwargs={
@@ -801,7 +801,7 @@ class MailSettings(EventSettingsViewMixin, EventSettingsFormView):
class MailSettingsSetup(EventPermissionRequiredMixin, MailSettingsSetupView): class MailSettingsSetup(EventPermissionRequiredMixin, MailSettingsSetupView):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
basetpl = 'pretixcontrol/event/base.html' basetpl = 'pretixcontrol/event/base.html'
def get_success_url(self) -> str: def get_success_url(self) -> str:
@@ -817,7 +817,7 @@ class MailSettingsSetup(EventPermissionRequiredMixin, MailSettingsSetupView):
class MailSettingsPreview(EventPermissionRequiredMixin, View): class MailSettingsPreview(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
# create index-language mapping # create index-language mapping
@cached_property @cached_property
@@ -887,7 +887,7 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View):
class MailSettingsRendererPreview(MailSettingsPreview): class MailSettingsRendererPreview(MailSettingsPreview):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
return HttpResponse(status=405) return HttpResponse(status=405)
@@ -935,7 +935,7 @@ class MailSettingsRendererPreview(MailSettingsPreview):
class TicketSettingsPreview(EventPermissionRequiredMixin, View): class TicketSettingsPreview(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
@cached_property @cached_property
def output(self): def output(self):
@@ -967,7 +967,7 @@ class TicketSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, FormV
model = Event model = Event
form_class = TicketSettingsForm form_class = TicketSettingsForm
template_name = 'pretixcontrol/event/tickets.html' template_name = 'pretixcontrol/event/tickets.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_context_data(self, *args, **kwargs) -> dict: def get_context_data(self, *args, **kwargs) -> dict:
context = super().get_context_data(*args, **kwargs) context = super().get_context_data(*args, **kwargs)
@@ -1078,7 +1078,7 @@ class EventPermissions(EventSettingsViewMixin, EventPermissionRequiredMixin, Tem
class EventLive(EventPermissionRequiredMixin, TemplateView): class EventLive(EventPermissionRequiredMixin, TemplateView):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixcontrol/event/live.html' template_name = 'pretixcontrol/event/live.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -1145,12 +1145,12 @@ class EventLive(EventPermissionRequiredMixin, TemplateView):
class EventTransferSession(EventPermissionRequiredMixin, TemplateView): class EventTransferSession(EventPermissionRequiredMixin, TemplateView):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixcontrol/event/transfer_session.html' template_name = 'pretixcontrol/event/transfer_session.html'
class EventDelete(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, FormView): class EventDelete(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, FormView):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixcontrol/event/delete.html' template_name = 'pretixcontrol/event/delete.html'
form_class = EventDeleteForm form_class = EventDeleteForm
@@ -1218,20 +1218,20 @@ class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
'user', 'content_type', 'api_token', 'oauth_application', 'device' 'user', 'content_type', 'api_token', 'oauth_application', 'device'
).order_by('-datetime', '-pk') ).order_by('-datetime', '-pk')
qs = qs.exclude(action_type__in=OVERVIEW_BANLIST) qs = qs.exclude(action_type__in=OVERVIEW_BANLIST)
if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'can_view_orders', if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'event.orders:read',
request=self.request): request=self.request):
qs = qs.exclude(content_type=ContentType.objects.get_for_model(Order)) qs = qs.exclude(content_type=ContentType.objects.get_for_model(Order))
if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'can_view_vouchers', if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'event.vouchers:read',
request=self.request): request=self.request):
qs = qs.exclude(content_type=ContentType.objects.get_for_model(Voucher)) qs = qs.exclude(content_type=ContentType.objects.get_for_model(Voucher))
if not self.request.user.has_event_permission(self.request.organizer, self.request.event, if not self.request.user.has_event_permission(self.request.organizer, self.request.event,
'can_change_event_settings', request=self.request): 'event.settings.general:write', request=self.request):
allowed_types = [ allowed_types = [
ContentType.objects.get_for_model(Voucher), ContentType.objects.get_for_model(Voucher),
ContentType.objects.get_for_model(Order) ContentType.objects.get_for_model(Order)
] ]
if self.request.user.has_event_permission(self.request.organizer, self.request.event, if self.request.user.has_event_permission(self.request.organizer, self.request.event,
'can_change_items', request=self.request): 'event.items:write', request=self.request):
allowed_types += [ allowed_types += [
ContentType.objects.get_for_model(Item), ContentType.objects.get_for_model(Item),
ContentType.objects.get_for_model(ItemCategory), ContentType.objects.get_for_model(ItemCategory),
@@ -1268,7 +1268,7 @@ class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
class EventComment(EventPermissionRequiredMixin, View): class EventComment(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
form = CommentForm(self.request.POST) form = CommentForm(self.request.POST)
@@ -1297,7 +1297,7 @@ class TaxCreate(EventSettingsViewMixin, EventPermissionRequiredMixin, CreateView
model = TaxRule model = TaxRule
form_class = TaxRuleForm form_class = TaxRuleForm
template_name = 'pretixcontrol/event/tax_edit.html' template_name = 'pretixcontrol/event/tax_edit.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'taxrule' context_object_name = 'taxrule'
def get_success_url(self) -> str: def get_success_url(self) -> str:
@@ -1358,7 +1358,7 @@ class TaxUpdate(EventSettingsViewMixin, EventPermissionRequiredMixin, UpdateView
model = TaxRule model = TaxRule
form_class = TaxRuleForm form_class = TaxRuleForm
template_name = 'pretixcontrol/event/tax_edit.html' template_name = 'pretixcontrol/event/tax_edit.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'rule' context_object_name = 'rule'
def get_object(self, queryset=None) -> TaxRule: def get_object(self, queryset=None) -> TaxRule:
@@ -1422,7 +1422,7 @@ class TaxUpdate(EventSettingsViewMixin, EventPermissionRequiredMixin, UpdateView
class TaxDefault(EventSettingsViewMixin, EventPermissionRequiredMixin, DetailView): class TaxDefault(EventSettingsViewMixin, EventPermissionRequiredMixin, DetailView):
model = TaxRule model = TaxRule
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_object(self, queryset=None) -> TaxRule: def get_object(self, queryset=None) -> TaxRule:
try: try:
@@ -1467,7 +1467,7 @@ class TaxDefault(EventSettingsViewMixin, EventPermissionRequiredMixin, DetailVie
class TaxDelete(EventSettingsViewMixin, EventPermissionRequiredMixin, CompatDeleteView): class TaxDelete(EventSettingsViewMixin, EventPermissionRequiredMixin, CompatDeleteView):
model = TaxRule model = TaxRule
template_name = 'pretixcontrol/event/tax_delete.html' template_name = 'pretixcontrol/event/tax_delete.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'taxrule' context_object_name = 'taxrule'
def get_object(self, queryset=None) -> TaxRule: def get_object(self, queryset=None) -> TaxRule:
@@ -1504,7 +1504,7 @@ class TaxDelete(EventSettingsViewMixin, EventPermissionRequiredMixin, CompatDele
class WidgetSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, FormView): class WidgetSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, FormView):
template_name = 'pretixcontrol/event/widget.html' template_name = 'pretixcontrol/event/widget.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
form_class = WidgetCodeForm form_class = WidgetCodeForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -1533,7 +1533,7 @@ class WidgetSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, FormV
class QuickSetupView(FormView): class QuickSetupView(FormView):
template_name = 'pretixcontrol/event/quick_setup.html' template_name = 'pretixcontrol/event/quick_setup.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
form_class = QuickSetupForm form_class = QuickSetupForm
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
+21 -21
View File
@@ -159,7 +159,7 @@ def item_move(request, item, up=True):
messages.success(request, _('The order of items has been updated.')) messages.success(request, _('The order of items has been updated.'))
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def item_move_up(request, organizer, event, item): def item_move_up(request, organizer, event, item):
item_move(request, item, up=True) item_move(request, item, up=True)
@@ -168,7 +168,7 @@ def item_move_up(request, organizer, event, item):
event=request.event.slug) event=request.event.slug)
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def item_move_down(request, organizer, event, item): def item_move_down(request, organizer, event, item):
item_move(request, item, up=False) item_move(request, item, up=False)
@@ -178,7 +178,7 @@ def item_move_down(request, organizer, event, item):
@transaction.atomic @transaction.atomic
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def reorder_items(request, organizer, event, category): def reorder_items(request, organizer, event, category):
try: try:
@@ -215,7 +215,7 @@ def reorder_items(request, organizer, event, category):
class CategoryDelete(EventPermissionRequiredMixin, CompatDeleteView): class CategoryDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = ItemCategory model = ItemCategory
template_name = 'pretixcontrol/items/category_delete.html' template_name = 'pretixcontrol/items/category_delete.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'category' context_object_name = 'category'
def get_object(self, queryset=None) -> ItemCategory: def get_object(self, queryset=None) -> ItemCategory:
@@ -249,7 +249,7 @@ class CategoryUpdate(EventPermissionRequiredMixin, UpdateView):
model = ItemCategory model = ItemCategory
form_class = CategoryForm form_class = CategoryForm
template_name = 'pretixcontrol/items/category.html' template_name = 'pretixcontrol/items/category.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'category' context_object_name = 'category'
def get_object(self, queryset=None) -> ItemCategory: def get_object(self, queryset=None) -> ItemCategory:
@@ -287,7 +287,7 @@ class CategoryCreate(EventPermissionRequiredMixin, CreateView):
model = ItemCategory model = ItemCategory
form_class = CategoryForm form_class = CategoryForm
template_name = 'pretixcontrol/items/category.html' template_name = 'pretixcontrol/items/category.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'category' context_object_name = 'category'
def get_success_url(self) -> str: def get_success_url(self) -> str:
@@ -371,7 +371,7 @@ def category_move(request, category, up=True):
messages.success(request, _('The order of categories has been updated.')) messages.success(request, _('The order of categories has been updated.'))
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def category_move_up(request, organizer, event, category): def category_move_up(request, organizer, event, category):
category_move(request, category, up=True) category_move(request, category, up=True)
@@ -380,7 +380,7 @@ def category_move_up(request, organizer, event, category):
event=request.event.slug) event=request.event.slug)
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def category_move_down(request, organizer, event, category): def category_move_down(request, organizer, event, category):
category_move(request, category, up=False) category_move(request, category, up=False)
@@ -390,7 +390,7 @@ def category_move_down(request, organizer, event, category):
@transaction.atomic @transaction.atomic
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def reorder_categories(request, organizer, event): def reorder_categories(request, organizer, event):
try: try:
@@ -522,7 +522,7 @@ class QuestionList(ListView):
@transaction.atomic @transaction.atomic
@event_permission_required("can_change_items") @event_permission_required("event.items:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def reorder_questions(request, organizer, event): def reorder_questions(request, organizer, event):
try: try:
@@ -570,7 +570,7 @@ def reorder_questions(request, organizer, event):
class QuestionDelete(EventPermissionRequiredMixin, CompatDeleteView): class QuestionDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = Question model = Question
template_name = 'pretixcontrol/items/question_delete.html' template_name = 'pretixcontrol/items/question_delete.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'question' context_object_name = 'question'
def get_object(self, queryset=None) -> Question: def get_object(self, queryset=None) -> Question:
@@ -664,7 +664,7 @@ class QuestionMixin:
class QuestionView(EventPermissionRequiredMixin, ChartContainingView, DetailView): class QuestionView(EventPermissionRequiredMixin, ChartContainingView, DetailView):
model = Question model = Question
template_name = 'pretixcontrol/items/question.html' template_name = 'pretixcontrol/items/question.html'
permission = 'can_change_items' permission = 'event.items:write'
template_name_field = 'question' template_name_field = 'question'
@cached_property @cached_property
@@ -753,7 +753,7 @@ class QuestionUpdate(EventPermissionRequiredMixin, QuestionMixin, UpdateView):
model = Question model = Question
form_class = QuestionForm form_class = QuestionForm
template_name = 'pretixcontrol/items/question_edit.html' template_name = 'pretixcontrol/items/question_edit.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'question' context_object_name = 'question'
def get_object(self, queryset=None) -> Question: def get_object(self, queryset=None) -> Question:
@@ -794,7 +794,7 @@ class QuestionCreate(EventPermissionRequiredMixin, QuestionMixin, CreateView):
model = Question model = Question
form_class = QuestionForm form_class = QuestionForm
template_name = 'pretixcontrol/items/question_edit.html' template_name = 'pretixcontrol/items/question_edit.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'question' context_object_name = 'question'
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -888,7 +888,7 @@ class QuotaCreate(EventPermissionRequiredMixin, CreateView):
model = Quota model = Quota
form_class = QuotaForm form_class = QuotaForm
template_name = 'pretixcontrol/items/quota_edit.html' template_name = 'pretixcontrol/items/quota_edit.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'quota' context_object_name = 'quota'
def get_success_url(self) -> str: def get_success_url(self) -> str:
@@ -1055,7 +1055,7 @@ class QuotaView(ChartContainingView, DetailView):
raise Http404(_("The requested quota does not exist.")) raise Http404(_("The requested quota does not exist."))
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_items', request): if not request.user.has_event_permission(request.organizer, request.event, 'event.items:write', request):
raise PermissionDenied() raise PermissionDenied()
quota = self.get_object() quota = self.get_object()
if 'reopen' in request.POST: if 'reopen' in request.POST:
@@ -1085,7 +1085,7 @@ class QuotaUpdate(EventPermissionRequiredMixin, UpdateView):
model = Quota model = Quota
form_class = QuotaForm form_class = QuotaForm
template_name = 'pretixcontrol/items/quota_edit.html' template_name = 'pretixcontrol/items/quota_edit.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'quota' context_object_name = 'quota'
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
@@ -1143,7 +1143,7 @@ class QuotaUpdate(EventPermissionRequiredMixin, UpdateView):
class QuotaDelete(EventPermissionRequiredMixin, CompatDeleteView): class QuotaDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = Quota model = Quota
template_name = 'pretixcontrol/items/quota_delete.html' template_name = 'pretixcontrol/items/quota_delete.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'quota' context_object_name = 'quota'
def get_object(self, queryset=None) -> Quota: def get_object(self, queryset=None) -> Quota:
@@ -1246,7 +1246,7 @@ class MetaDataEditorMixin:
class ItemCreate(EventPermissionRequiredMixin, MetaDataEditorMixin, CreateView): class ItemCreate(EventPermissionRequiredMixin, MetaDataEditorMixin, CreateView):
form_class = ItemCreateForm form_class = ItemCreateForm
template_name = 'pretixcontrol/item/create.html' template_name = 'pretixcontrol/item/create.html'
permission = 'can_change_items' permission = 'event.items:write'
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('control:event.item', kwargs={ return reverse('control:event.item', kwargs={
@@ -1322,7 +1322,7 @@ class ItemCreate(EventPermissionRequiredMixin, MetaDataEditorMixin, CreateView):
class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataEditorMixin, UpdateView): class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataEditorMixin, UpdateView):
form_class = ItemUpdateForm form_class = ItemUpdateForm
template_name = 'pretixcontrol/item/index.html' template_name = 'pretixcontrol/item/index.html'
permission = 'can_change_items' permission = 'event.items:write'
@cached_property @cached_property
def plugin_forms(self): def plugin_forms(self):
@@ -1584,7 +1584,7 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE
class ItemDelete(EventPermissionRequiredMixin, CompatDeleteView): class ItemDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = Item model = Item
template_name = 'pretixcontrol/item/delete.html' template_name = 'pretixcontrol/item/delete.html'
permission = 'can_change_items' permission = 'event.items:write'
context_object_name = 'item' context_object_name = 'item'
def get_context_data(self, *args, **kwargs) -> dict: def get_context_data(self, *args, **kwargs) -> dict:
+2 -2
View File
@@ -213,9 +213,9 @@ class EventWizard(SafeSessionWizardView):
else: else:
allow = ( allow = (
request.user.has_event_permission(clone_from.organizer, clone_from, request.user.has_event_permission(clone_from.organizer, clone_from,
'can_change_event_settings', request) 'event.settings.general:write', request)
and request.user.has_event_permission(clone_from.organizer, clone_from, and request.user.has_event_permission(clone_from.organizer, clone_from,
'can_change_items', request) 'event.items:write', request)
) )
if not allow: if not allow:
messages.error(self.request, _('You do not have permission to clone this event.')) messages.error(self.request, _('You do not have permission to clone this event.'))
+4 -4
View File
@@ -214,7 +214,7 @@ class BaseProcessView(AsyncAction, FormView):
class OrderImportView(EventPermissionRequiredMixin, BaseImportView): class OrderImportView(EventPermissionRequiredMixin, BaseImportView):
template_name = 'pretixcontrol/orders/import_start.html' template_name = 'pretixcontrol/orders/import_start.html'
permission = 'can_change_orders' permission = 'event.orders:write'
def get_process_url(self, request, cf, charset): def get_process_url(self, request, cf, charset):
return reverse('control:event.orders.import.process', kwargs={ return reverse('control:event.orders.import.process', kwargs={
@@ -225,7 +225,7 @@ class OrderImportView(EventPermissionRequiredMixin, BaseImportView):
class OrderProcessView(EventPermissionRequiredMixin, BaseProcessView): class OrderProcessView(EventPermissionRequiredMixin, BaseProcessView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/orders/import_process.html' template_name = 'pretixcontrol/orders/import_process.html'
form_class = OrdersProcessForm form_class = OrdersProcessForm
task = import_orders task = import_orders
@@ -257,7 +257,7 @@ class OrderProcessView(EventPermissionRequiredMixin, BaseProcessView):
class VoucherImportView(EventPermissionRequiredMixin, BaseImportView): class VoucherImportView(EventPermissionRequiredMixin, BaseImportView):
template_name = 'pretixcontrol/vouchers/import_start.html' template_name = 'pretixcontrol/vouchers/import_start.html'
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
def get_process_url(self, request, cf, charset): def get_process_url(self, request, cf, charset):
return reverse('control:event.vouchers.import.process', kwargs={ return reverse('control:event.vouchers.import.process', kwargs={
@@ -268,7 +268,7 @@ class VoucherImportView(EventPermissionRequiredMixin, BaseImportView):
class VoucherProcessView(EventPermissionRequiredMixin, BaseProcessView): class VoucherProcessView(EventPermissionRequiredMixin, BaseProcessView):
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
template_name = 'pretixcontrol/vouchers/import_process.html' template_name = 'pretixcontrol/vouchers/import_process.html'
form_class = VouchersProcessForm form_class = VouchersProcessForm
task = import_vouchers task = import_vouchers
+45 -45
View File
@@ -169,7 +169,7 @@ class OrderSearchMixin:
class OrderSearch(OrderSearchMixin, EventPermissionRequiredMixin, TemplateView): class OrderSearch(OrderSearchMixin, EventPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/orders/search.html' template_name = 'pretixcontrol/orders/search.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
@@ -199,7 +199,7 @@ class OrderSearch(OrderSearchMixin, EventPermissionRequiredMixin, TemplateView):
class BaseOrderBulkActionView(OrderSearchMixin, EventPermissionRequiredMixin, AsyncFormView): class BaseOrderBulkActionView(OrderSearchMixin, EventPermissionRequiredMixin, AsyncFormView):
template_name = 'pretixcontrol/orders/bulk_action.html' template_name = 'pretixcontrol/orders/bulk_action.html'
permission = 'can_change_orders' permission = 'event.orders:write'
form_class = forms.Form form_class = forms.Form
def get_queryset(self): def get_queryset(self):
@@ -402,7 +402,7 @@ class OrderList(OrderSearchMixin, EventPermissionRequiredMixin, PaginationMixin,
model = Order model = Order
context_object_name = 'orders' context_object_name = 'orders'
template_name = 'pretixcontrol/orders/index.html' template_name = 'pretixcontrol/orders/index.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_queryset(self): def get_queryset(self):
qs = Order.objects.filter( qs = Order.objects.filter(
@@ -526,7 +526,7 @@ class OrderView(EventPermissionRequiredMixin, DetailView):
class OrderDetail(OrderView): class OrderDetail(OrderView):
template_name = 'pretixcontrol/order/index.html' template_name = 'pretixcontrol/order/index.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
@@ -626,7 +626,7 @@ class OrderDetail(OrderView):
class OrderTransactions(OrderView): class OrderTransactions(OrderView):
template_name = 'pretixcontrol/order/transactions.html' template_name = 'pretixcontrol/order/transactions.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
@@ -645,7 +645,7 @@ class OrderTransactions(OrderView):
class OrderDownload(AsyncAction, OrderView): class OrderDownload(AsyncAction, OrderView):
task = generate task = generate
permission = 'can_view_orders' permission = 'event.orders:read'
def get_success_url(self, value): def get_success_url(self, value):
return self.get_self_url() return self.get_self_url()
@@ -744,7 +744,7 @@ class OrderDownload(AsyncAction, OrderView):
class OrderComment(OrderView): class OrderComment(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
form = CommentForm(self.request.POST) form = CommentForm(self.request.POST)
@@ -784,7 +784,7 @@ class OrderComment(OrderView):
class OrderApprove(OrderView): class OrderApprove(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
if self.order.require_approval: if self.order.require_approval:
@@ -803,7 +803,7 @@ class OrderApprove(OrderView):
class OrderDelete(OrderView): class OrderDelete(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
if self.order.testmode: if self.order.testmode:
@@ -833,7 +833,7 @@ class OrderDelete(OrderView):
class OrderDeny(OrderView): class OrderDeny(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if self.order.require_approval: if self.order.require_approval:
@@ -859,7 +859,7 @@ class OrderDeny(OrderView):
class OrderPaymentCancel(OrderView): class OrderPaymentCancel(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def payment(self): def payment(self):
@@ -898,7 +898,7 @@ class OrderPaymentCancel(OrderView):
class OrderRefundCancel(OrderView): class OrderRefundCancel(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def refund(self): def refund(self):
@@ -928,7 +928,7 @@ class OrderRefundCancel(OrderView):
class OrderRefundProcess(OrderView): class OrderRefundProcess(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def refund(self): def refund(self):
@@ -967,7 +967,7 @@ class OrderRefundProcess(OrderView):
class OrderRefundDone(OrderView): class OrderRefundDone(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def refund(self): def refund(self):
@@ -990,7 +990,7 @@ class OrderRefundDone(OrderView):
class OrderCancellationRequestDelete(OrderView): class OrderCancellationRequestDelete(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def req(self): def req(self):
@@ -1024,7 +1024,7 @@ class OrderCancellationRequestDelete(OrderView):
class OrderPaymentConfirm(OrderView): class OrderPaymentConfirm(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def payment(self): def payment(self):
@@ -1078,7 +1078,7 @@ class OrderPaymentConfirm(OrderView):
class OrderRefundView(OrderView): class OrderRefundView(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def start_form(self): def start_form(self):
@@ -1427,7 +1427,7 @@ class OrderRefundView(OrderView):
class OrderTransition(OrderView): class OrderTransition(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def req(self): def req(self):
@@ -1592,7 +1592,7 @@ class OrderTransition(OrderView):
class OrderInvoiceCreate(OrderView): class OrderInvoiceCreate(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
with transaction.atomic(): with transaction.atomic():
@@ -1618,7 +1618,7 @@ class OrderInvoiceCreate(OrderView):
class OrderCheckVATID(OrderView): class OrderCheckVATID(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
try: try:
@@ -1666,7 +1666,7 @@ class OrderCheckVATID(OrderView):
class OrderInvoiceRegenerate(OrderView): class OrderInvoiceRegenerate(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
try: try:
@@ -1699,7 +1699,7 @@ class OrderInvoiceRegenerate(OrderView):
class OrderInvoiceRetransmit(OrderView): class OrderInvoiceRetransmit(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
with transaction.atomic(durable=True): with transaction.atomic(durable=True):
@@ -1730,7 +1730,7 @@ class OrderInvoiceRetransmit(OrderView):
class OrderInvoiceReissue(OrderView): class OrderInvoiceReissue(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
with transaction.atomic(): with transaction.atomic():
@@ -1781,7 +1781,7 @@ class OrderInvoiceInspect(AdministratorPermissionRequiredMixin, OrderView):
class OrderResendLink(OrderView): class OrderResendLink(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
if 'position' in kwargs: if 'position' in kwargs:
@@ -1798,7 +1798,7 @@ class OrderResendLink(OrderView):
class InvoiceDownload(EventPermissionRequiredMixin, View): class InvoiceDownload(EventPermissionRequiredMixin, View):
permission = 'can_view_orders' permission = 'event.orders:read'
def get_order_url(self): def get_order_url(self):
return reverse('control:event.order', kwargs={ return reverse('control:event.order', kwargs={
@@ -1842,7 +1842,7 @@ class InvoiceDownload(EventPermissionRequiredMixin, View):
class OrderExtend(OrderView): class OrderExtend(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
def post(self, *args, **kwargs): def post(self, *args, **kwargs):
if self.form.is_valid(): if self.form.is_valid():
@@ -1890,7 +1890,7 @@ class OrderExtend(OrderView):
class OrderReactivate(OrderView): class OrderReactivate(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
@cached_property @cached_property
def reactivate_form(self): def reactivate_form(self):
@@ -1940,7 +1940,7 @@ class OrderReactivate(OrderView):
class OrderChange(OrderView): class OrderChange(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/order/change.html' template_name = 'pretixcontrol/order/change.html'
@cached_property @cached_property
@@ -2197,7 +2197,7 @@ class OrderChange(OrderView):
class OrderModifyInformation(OrderQuestionsViewMixin, OrderView): class OrderModifyInformation(OrderQuestionsViewMixin, OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/order/change_questions.html' template_name = 'pretixcontrol/order/change_questions.html'
only_user_visible = False only_user_visible = False
all_optional = True all_optional = True
@@ -2250,7 +2250,7 @@ class OrderModifyInformation(OrderQuestionsViewMixin, OrderView):
class OrderContactChange(OrderView): class OrderContactChange(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/order/change_contact.html' template_name = 'pretixcontrol/order/change_contact.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -2265,7 +2265,7 @@ class OrderContactChange(OrderView):
data=self.request.POST if self.request.method == "POST" else None, data=self.request.POST if self.request.method == "POST" else None,
customers=self.request.organizer.settings.customer_accounts and ( customers=self.request.organizer.settings.customer_accounts and (
self.request.user.has_organizer_permission( self.request.user.has_organizer_permission(
self.request.organizer, 'can_manage_customers', request=self.request self.request.organizer, 'organizer.customers:write', request=self.request
) )
) )
) )
@@ -2334,7 +2334,7 @@ class OrderContactChange(OrderView):
class OrderLocaleChange(OrderView): class OrderLocaleChange(OrderView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/order/change_locale.html' template_name = 'pretixcontrol/order/change_locale.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -2390,7 +2390,7 @@ class OrderViewMixin:
class OrderSendMail(EventPermissionRequiredMixin, OrderViewMixin, FormView): class OrderSendMail(EventPermissionRequiredMixin, OrderViewMixin, FormView):
template_name = 'pretixcontrol/order/sendmail.html' template_name = 'pretixcontrol/order/sendmail.html'
permission = 'can_change_orders' permission = 'event.orders:write'
form_class = OrderMailForm form_class = OrderMailForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -2514,7 +2514,7 @@ class OrderPositionSendMail(OrderSendMail):
class OrderEmailHistory(EventPermissionRequiredMixin, OrderViewMixin, ListView): class OrderEmailHistory(EventPermissionRequiredMixin, OrderViewMixin, ListView):
template_name = 'pretixcontrol/order/mail_history.html' template_name = 'pretixcontrol/order/mail_history.html'
permission = 'can_view_orders' permission = 'event.orders:read'
model = LogEntry model = LogEntry
context_object_name = 'logs' context_object_name = 'logs'
paginate_by = 10 paginate_by = 10
@@ -2551,7 +2551,7 @@ class OrderEmailHistory(EventPermissionRequiredMixin, OrderViewMixin, ListView):
class AnswerDownload(EventPermissionRequiredMixin, OrderViewMixin, ListView): class AnswerDownload(EventPermissionRequiredMixin, OrderViewMixin, ListView):
permission = 'can_view_orders' permission = 'event.orders:read'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
answid = kwargs.get('answer') answid = kwargs.get('answer')
@@ -2575,7 +2575,7 @@ class AnswerDownload(EventPermissionRequiredMixin, OrderViewMixin, ListView):
class OverView(EventPermissionRequiredMixin, TemplateView): class OverView(EventPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/orders/overview.html' template_name = 'pretixcontrol/orders/overview.html'
permission = 'can_view_orders' permission = 'event.orders:read'
@cached_property @cached_property
def filter_form(self): def filter_form(self):
@@ -2614,7 +2614,7 @@ class OverView(EventPermissionRequiredMixin, TemplateView):
class OrderGo(EventPermissionRequiredMixin, View): class OrderGo(EventPermissionRequiredMixin, View):
permission = 'can_view_orders' permission = 'event.orders:read'
def get_order(self, code): def get_order(self, code):
try: try:
@@ -2699,7 +2699,7 @@ class ExportMixin:
return ex return ex
def get_scheduled_queryset(self): def get_scheduled_queryset(self):
if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'can_change_event_settings', if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'event.settings.general:write',
request=self.request): request=self.request):
qs = self.request.event.scheduled_exports.filter(owner=self.request.user) qs = self.request.event.scheduled_exports.filter(owner=self.request.user)
else: else:
@@ -2726,7 +2726,7 @@ class ExportMixin:
class ExportDoView(EventPermissionRequiredMixin, ExportMixin, AsyncAction, TemplateView): class ExportDoView(EventPermissionRequiredMixin, ExportMixin, AsyncAction, TemplateView):
permission = 'can_view_orders' permission = 'event.orders:read'
known_errortypes = ['ExportError', 'ExportEmptyError'] known_errortypes = ['ExportError', 'ExportEmptyError']
task = export task = export
template_name = 'pretixcontrol/orders/export_form.html' template_name = 'pretixcontrol/orders/export_form.html'
@@ -2775,7 +2775,7 @@ class ExportDoView(EventPermissionRequiredMixin, ExportMixin, AsyncAction, Templ
class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView): class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
permission = 'can_view_orders' permission = 'event.orders:read'
paginate_by = 25 paginate_by = 25
context_object_name = 'scheduled' context_object_name = 'scheduled'
@@ -2876,7 +2876,7 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
return self.get_scheduled_queryset() return self.get_scheduled_queryset()
def has_permission(self): def has_permission(self):
return self.request.user.has_event_permission(self.request.organizer, self.request.event, "can_view_orders") return self.request.user.has_event_permission(self.request.organizer, self.request.event, "event.orders:read")
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
@@ -2895,7 +2895,7 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
class DeleteScheduledExportView(EventPermissionRequiredMixin, ExportMixin, CompatDeleteView): class DeleteScheduledExportView(EventPermissionRequiredMixin, ExportMixin, CompatDeleteView):
permission = 'can_view_orders' permission = 'event.orders:read'
template_name = 'pretixcontrol/orders/export_delete.html' template_name = 'pretixcontrol/orders/export_delete.html'
context_object_name = 'export' context_object_name = 'export'
@@ -2944,7 +2944,7 @@ class RefundList(EventPermissionRequiredMixin, PaginationMixin, ListView):
model = OrderRefund model = OrderRefund
context_object_name = 'refunds' context_object_name = 'refunds'
template_name = 'pretixcontrol/orders/refunds.html' template_name = 'pretixcontrol/orders/refunds.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_queryset(self): def get_queryset(self):
qs = OrderRefund.objects.filter( qs = OrderRefund.objects.filter(
@@ -2969,7 +2969,7 @@ class RefundList(EventPermissionRequiredMixin, PaginationMixin, ListView):
class EventCancel(EventPermissionRequiredMixin, AsyncAction, FormView): class EventCancel(EventPermissionRequiredMixin, AsyncAction, FormView):
template_name = 'pretixcontrol/orders/cancel.html' template_name = 'pretixcontrol/orders/cancel.html'
permission = 'can_change_orders' permission = 'event.orders:write'
form_class = EventCancelForm form_class = EventCancelForm
task = cancel_event task = cancel_event
known_errortypes = ['OrderError'] known_errortypes = ['OrderError']
@@ -3054,7 +3054,7 @@ class EventCancel(EventPermissionRequiredMixin, AsyncAction, FormView):
class EventCancelConfirm(EventPermissionRequiredMixin, AsyncAction, FormView): class EventCancelConfirm(EventPermissionRequiredMixin, AsyncAction, FormView):
template_name = 'pretixcontrol/orders/cancel_confirm.html' template_name = 'pretixcontrol/orders/cancel_confirm.html'
permission = 'can_change_orders' permission = 'event.orders:write'
form_class = EventCancelConfirmForm form_class = EventCancelConfirmForm
task = cancel_event task = cancel_event
known_errortypes = ['OrderError'] known_errortypes = ['OrderError']
+77 -77
View File
@@ -245,13 +245,13 @@ class OrganizerDetail(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin
class OrganizerTeamView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class OrganizerTeamView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView):
model = Organizer model = Organizer
template_name = 'pretixcontrol/organizers/teams.html' template_name = 'pretixcontrol/organizers/teams.html'
permission = 'can_change_permissions' permission = 'organizer.teams:read'
context_object_name = 'organizer' context_object_name = 'organizer'
class OrganizerSettingsFormView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView): class OrganizerSettingsFormView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView):
model = Organizer model = Organizer
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
def get_form_kwargs(self): def get_form_kwargs(self):
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
@@ -282,7 +282,7 @@ class OrganizerSettingsFormView(OrganizerDetailViewMixin, OrganizerPermissionReq
class OrganizerMailSettings(OrganizerSettingsFormView): class OrganizerMailSettings(OrganizerSettingsFormView):
form_class = MailSettingsForm form_class = MailSettingsForm
template_name = 'pretixcontrol/organizers/mail.html' template_name = 'pretixcontrol/organizers/mail.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
def get_success_url(self): def get_success_url(self):
return reverse('control:organizer.settings.mail', kwargs={ return reverse('control:organizer.settings.mail', kwargs={
@@ -308,7 +308,7 @@ class OrganizerMailSettings(OrganizerSettingsFormView):
class MailSettingsSetup(OrganizerPermissionRequiredMixin, MailSettingsSetupView): class MailSettingsSetup(OrganizerPermissionRequiredMixin, MailSettingsSetupView):
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
basetpl = 'pretixcontrol/base.html' basetpl = 'pretixcontrol/base.html'
def get_success_url(self): def get_success_url(self):
@@ -323,7 +323,7 @@ class MailSettingsSetup(OrganizerPermissionRequiredMixin, MailSettingsSetupView)
class MailSettingsPreview(OrganizerPermissionRequiredMixin, View): class MailSettingsPreview(OrganizerPermissionRequiredMixin, View):
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
# return the origin text if key is missing in dict # return the origin text if key is missing in dict
class SafeDict(dict): class SafeDict(dict):
@@ -455,7 +455,7 @@ class OrganizerUpdate(OrganizerPermissionRequiredMixin, UpdateView):
model = Organizer model = Organizer
form_class = OrganizerUpdateForm form_class = OrganizerUpdateForm
template_name = 'pretixcontrol/organizers/edit.html' template_name = 'pretixcontrol/organizers/edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'organizer' context_object_name = 'organizer'
@cached_property @cached_property
@@ -597,7 +597,7 @@ class OrganizerCreate(CreateView):
class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, TemplateView, SingleObjectMixin): class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, TemplateView, SingleObjectMixin):
model = Organizer model = Organizer
context_object_name = 'organizer' context_object_name = 'organizer'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
template_name = 'pretixcontrol/organizers/plugins.html' template_name = 'pretixcontrol/organizers/plugins.html'
def get_object(self, queryset=None) -> Organizer: def get_object(self, queryset=None) -> Organizer:
@@ -769,14 +769,14 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView): class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView):
model = Organizer model = Organizer
context_object_name = 'organizer' context_object_name = 'organizer'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
template_name = 'pretixcontrol/organizers/plugin_events.html' template_name = 'pretixcontrol/organizers/plugin_events.html'
form_class = OrganizerPluginEventsForm form_class = OrganizerPluginEventsForm
def get_form_kwargs(self): def get_form_kwargs(self):
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
kwargs["events"] = self.request.user.get_events_with_permission( kwargs["events"] = self.request.user.get_events_with_permission(
"can_change_event_settings", request=self.request "event.settings.general:write", request=self.request
).filter(organizer=self.request.organizer) ).filter(organizer=self.request.organizer)
kwargs["initial"] = { kwargs["initial"] = {
"events": self.request.organizer.events.filter(plugins__regex='(^|,)' + self.plugin.module + '(,|$)') "events": self.request.organizer.events.filter(plugins__regex='(^|,)' + self.plugin.module + '(,|$)')
@@ -854,7 +854,7 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire
class TeamListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView): class TeamListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
model = Team model = Team
template_name = 'pretixcontrol/organizers/teams.html' template_name = 'pretixcontrol/organizers/teams.html'
permission = 'can_change_teams' permission = 'organizer.teams:write'
context_object_name = 'teams' context_object_name = 'teams'
def get_queryset(self): def get_queryset(self):
@@ -880,7 +880,7 @@ class TeamListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, P
class TeamCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class TeamCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = Team model = Team
template_name = 'pretixcontrol/organizers/team_edit.html' template_name = 'pretixcontrol/organizers/team_edit.html'
permission = 'can_change_teams' permission = 'organizer.teams:write'
form_class = TeamForm form_class = TeamForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -917,7 +917,7 @@ class TeamCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class TeamUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class TeamUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = Team model = Team
template_name = 'pretixcontrol/organizers/team_edit.html' template_name = 'pretixcontrol/organizers/team_edit.html'
permission = 'can_change_teams' permission = 'organizer.teams:write'
context_object_name = 'team' context_object_name = 'team'
form_class = TeamForm form_class = TeamForm
@@ -953,7 +953,7 @@ class TeamUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class TeamDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class TeamDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = Team model = Team
template_name = 'pretixcontrol/organizers/team_delete.html' template_name = 'pretixcontrol/organizers/team_delete.html'
permission = 'can_change_teams' permission = 'organizer.teams:write'
context_object_name = 'team' context_object_name = 'team'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -1013,7 +1013,7 @@ class TeamDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView):
template_name = 'pretixcontrol/organizers/team_members.html' template_name = 'pretixcontrol/organizers/team_members.html'
context_object_name = 'team' context_object_name = 'team'
permission = 'can_change_teams' permission = 'organizer.teams:write'
model = Team model = Team
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -1232,7 +1232,7 @@ class DeviceQueryMixin:
class DeviceListView(DeviceQueryMixin, OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class DeviceListView(DeviceQueryMixin, OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = Device model = Device
template_name = 'pretixcontrol/organizers/devices.html' template_name = 'pretixcontrol/organizers/devices.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'devices' context_object_name = 'devices'
paginate_by = 100 paginate_by = 100
@@ -1245,7 +1245,7 @@ class DeviceListView(DeviceQueryMixin, OrganizerDetailViewMixin, OrganizerPermis
class DeviceCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class DeviceCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = Device model = Device
template_name = 'pretixcontrol/organizers/device_edit.html' template_name = 'pretixcontrol/organizers/device_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = DeviceForm form_class = DeviceForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -1276,7 +1276,7 @@ class DeviceCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
class DeviceLogView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class DeviceLogView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
template_name = 'pretixcontrol/organizers/device_logs.html' template_name = 'pretixcontrol/organizers/device_logs.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
model = LogEntry model = LogEntry
context_object_name = 'logs' context_object_name = 'logs'
paginate_by = 20 paginate_by = 20
@@ -1304,7 +1304,7 @@ class DeviceLogView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class DeviceUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class DeviceUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = Device model = Device
template_name = 'pretixcontrol/organizers/device_edit.html' template_name = 'pretixcontrol/organizers/device_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'device' context_object_name = 'device'
form_class = DeviceForm form_class = DeviceForm
@@ -1347,7 +1347,7 @@ class DeviceUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
class DeviceBulkUpdateView(DeviceQueryMixin, OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView): class DeviceBulkUpdateView(DeviceQueryMixin, OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView):
template_name = 'pretixcontrol/organizers/device_bulk_edit.html' template_name = 'pretixcontrol/organizers/device_bulk_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'device' context_object_name = 'device'
form_class = DeviceBulkEditForm form_class = DeviceBulkEditForm
@@ -1461,7 +1461,7 @@ class DeviceBulkUpdateView(DeviceQueryMixin, OrganizerDetailViewMixin, Organizer
class DeviceConnectView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class DeviceConnectView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView):
model = Device model = Device
template_name = 'pretixcontrol/organizers/device_connect.html' template_name = 'pretixcontrol/organizers/device_connect.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'device' context_object_name = 'device'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -1493,7 +1493,7 @@ class DeviceConnectView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMix
class DeviceRevokeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class DeviceRevokeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView):
model = Device model = Device
template_name = 'pretixcontrol/organizers/device_revoke.html' template_name = 'pretixcontrol/organizers/device_revoke.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'device' context_object_name = 'device'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -1523,7 +1523,7 @@ class DeviceRevokeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
class WebHookListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class WebHookListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = WebHook model = WebHook
template_name = 'pretixcontrol/organizers/webhooks.html' template_name = 'pretixcontrol/organizers/webhooks.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'webhooks' context_object_name = 'webhooks'
def get_queryset(self): def get_queryset(self):
@@ -1533,7 +1533,7 @@ class WebHookListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin
class WebHookCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class WebHookCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = WebHook model = WebHook
template_name = 'pretixcontrol/organizers/webhook_edit.html' template_name = 'pretixcontrol/organizers/webhook_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = WebHookForm form_class = WebHookForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -1567,7 +1567,7 @@ class WebHookCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMix
class WebHookUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class WebHookUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = WebHook model = WebHook
template_name = 'pretixcontrol/organizers/webhook_edit.html' template_name = 'pretixcontrol/organizers/webhook_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'webhook' context_object_name = 'webhook'
form_class = WebHookForm form_class = WebHookForm
@@ -1610,7 +1610,7 @@ class WebHookUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMix
class WebHookLogsView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class WebHookLogsView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = WebHook model = WebHook
template_name = 'pretixcontrol/organizers/webhook_logs.html' template_name = 'pretixcontrol/organizers/webhook_logs.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'calls' context_object_name = 'calls'
paginate_by = 50 paginate_by = 50
@@ -1652,7 +1652,7 @@ class WebHookLogsView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin
class GiftCardAcceptanceInviteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView): class GiftCardAcceptanceInviteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, FormView):
model = GiftCardAcceptance model = GiftCardAcceptance
template_name = 'pretixcontrol/organizers/giftcard_acceptance_invite.html' template_name = 'pretixcontrol/organizers/giftcard_acceptance_invite.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = GiftCardAcceptanceInviteForm form_class = GiftCardAcceptanceInviteForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -1685,7 +1685,7 @@ class GiftCardAcceptanceInviteView(OrganizerDetailViewMixin, OrganizerPermission
class GiftCardAcceptanceListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class GiftCardAcceptanceListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = GiftCardAcceptance model = GiftCardAcceptance
template_name = 'pretixcontrol/organizers/giftcard_acceptance_list.html' template_name = 'pretixcontrol/organizers/giftcard_acceptance_list.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'acceptor_acceptance' context_object_name = 'acceptor_acceptance'
paginate_by = 50 paginate_by = 50
@@ -1754,7 +1754,7 @@ class GiftCardAcceptanceListView(OrganizerDetailViewMixin, OrganizerPermissionRe
class GiftCardListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class GiftCardListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = GiftCard model = GiftCard
template_name = 'pretixcontrol/organizers/giftcards.html' template_name = 'pretixcontrol/organizers/giftcards.html'
permission = 'can_manage_gift_cards' permission = 'organizer.giftcards:write'
context_object_name = 'giftcards' context_object_name = 'giftcards'
paginate_by = 50 paginate_by = 50
@@ -1777,7 +1777,7 @@ class GiftCardListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
ctx['filter_form'] = self.filter_form ctx['filter_form'] = self.filter_form
ctx['other_organizers'] = self.request.user.get_organizers_with_permission( ctx['other_organizers'] = self.request.user.get_organizers_with_permission(
'can_manage_gift_cards', self.request 'organizer.giftcards:write', self.request
).exclude(pk=self.request.organizer.pk) ).exclude(pk=self.request.organizer.pk)
return ctx return ctx
@@ -1788,7 +1788,7 @@ class GiftCardListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
class GiftCardDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class GiftCardDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView):
template_name = 'pretixcontrol/organizers/giftcard.html' template_name = 'pretixcontrol/organizers/giftcard.html'
permission = 'can_manage_gift_cards' permission = 'organizer.giftcards:write'
context_object_name = 'card' context_object_name = 'card'
def get_object(self, queryset=None) -> Organizer: def get_object(self, queryset=None) -> Organizer:
@@ -1880,7 +1880,7 @@ class GiftCardDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
class GiftCardCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class GiftCardCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
template_name = 'pretixcontrol/organizers/giftcard_create.html' template_name = 'pretixcontrol/organizers/giftcard_create.html'
permission = 'can_manage_gift_cards' permission = 'organizer.giftcards:write'
form_class = GiftCardCreateForm form_class = GiftCardCreateForm
success_url = 'invalid' success_url = 'invalid'
@@ -1931,7 +1931,7 @@ class GiftCardCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
class GiftCardUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class GiftCardUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
template_name = 'pretixcontrol/organizers/giftcard_edit.html' template_name = 'pretixcontrol/organizers/giftcard_edit.html'
permission = 'can_manage_gift_cards' permission = 'organizer.giftcards:write'
form_class = GiftCardUpdateForm form_class = GiftCardUpdateForm
success_url = 'invalid' success_url = 'invalid'
context_object_name = 'card' context_object_name = 'card'
@@ -2026,7 +2026,7 @@ class ExportMixin:
@cached_property @cached_property
def events(self): def events(self):
return self.request.user.get_events_with_permission('can_view_orders', request=self.request).filter( return self.request.user.get_events_with_permission('event.orders:read', request=self.request).filter(
organizer=self.request.organizer organizer=self.request.organizer
) )
@@ -2060,7 +2060,7 @@ class ExportMixin:
return ctx return ctx
def get_scheduled_queryset(self): def get_scheduled_queryset(self):
if not self.request.user.has_organizer_permission(self.request.organizer, 'can_change_organizer_settings', if not self.request.user.has_organizer_permission(self.request.organizer, 'organizer.settings.general:write',
request=self.request): request=self.request):
qs = self.request.organizer.scheduled_exports.filter(owner=self.request.user) qs = self.request.organizer.scheduled_exports.filter(owner=self.request.user)
else: else:
@@ -2306,7 +2306,7 @@ class RunScheduledExportView(OrganizerPermissionRequiredMixin, ExportMixin, View
class GateListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class GateListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = Gate model = Gate
template_name = 'pretixcontrol/organizers/gates.html' template_name = 'pretixcontrol/organizers/gates.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'gates' context_object_name = 'gates'
def get_queryset(self): def get_queryset(self):
@@ -2316,7 +2316,7 @@ class GateListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, L
class GateCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class GateCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = Gate model = Gate
template_name = 'pretixcontrol/organizers/gate_edit.html' template_name = 'pretixcontrol/organizers/gate_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = GateForm form_class = GateForm
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -2350,7 +2350,7 @@ class GateCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class GateUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class GateUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = Gate model = Gate
template_name = 'pretixcontrol/organizers/gate_edit.html' template_name = 'pretixcontrol/organizers/gate_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'gate' context_object_name = 'gate'
form_class = GateForm form_class = GateForm
@@ -2385,7 +2385,7 @@ class GateUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class GateDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class GateDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = Gate model = Gate
template_name = 'pretixcontrol/organizers/gate_delete.html' template_name = 'pretixcontrol/organizers/gate_delete.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'gate' context_object_name = 'gate'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2409,7 +2409,7 @@ class GateDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
class EventMetaPropertyListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class EventMetaPropertyListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = EventMetaProperty model = EventMetaProperty
template_name = 'pretixcontrol/organizers/properties.html' template_name = 'pretixcontrol/organizers/properties.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'properties' context_object_name = 'properties'
def get_queryset(self): def get_queryset(self):
@@ -2460,7 +2460,7 @@ class EventMetaPropertyEditorMixin:
class EventMetaPropertyCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, EventMetaPropertyEditorMixin, CreateView): class EventMetaPropertyCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, EventMetaPropertyEditorMixin, CreateView):
model = EventMetaProperty model = EventMetaProperty
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
def get_object(self, queryset=None): def get_object(self, queryset=None):
return EventMetaProperty() return EventMetaProperty()
@@ -2490,7 +2490,7 @@ class EventMetaPropertyCreateView(OrganizerDetailViewMixin, OrganizerPermissionR
class EventMetaPropertyUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, EventMetaPropertyEditorMixin, UpdateView): class EventMetaPropertyUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, EventMetaPropertyEditorMixin, UpdateView):
model = EventMetaProperty model = EventMetaProperty
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'property' context_object_name = 'property'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2522,7 +2522,7 @@ class EventMetaPropertyUpdateView(OrganizerDetailViewMixin, OrganizerPermissionR
class EventMetaPropertyDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class EventMetaPropertyDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = EventMetaProperty model = EventMetaProperty
template_name = 'pretixcontrol/organizers/property_delete.html' template_name = 'pretixcontrol/organizers/property_delete.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'property' context_object_name = 'property'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2566,7 +2566,7 @@ def meta_property_move(request, property, up=True):
messages.success(request, _('The order of properties has been updated.')) messages.success(request, _('The order of properties has been updated.'))
@organizer_permission_required("can_change_organizer_settings") @organizer_permission_required("organizer.settings.general:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def meta_property_move_up(request, organizer, property): def meta_property_move_up(request, organizer, property):
meta_property_move(request, property, up=True) meta_property_move(request, property, up=True)
@@ -2574,7 +2574,7 @@ def meta_property_move_up(request, organizer, property):
organizer=request.organizer.slug) organizer=request.organizer.slug)
@organizer_permission_required("can_change_organizer_settings") @organizer_permission_required("organizer.settings.general:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def meta_property_move_down(request, organizer, property): def meta_property_move_down(request, organizer, property):
meta_property_move(request, property, up=False) meta_property_move(request, property, up=False)
@@ -2583,7 +2583,7 @@ def meta_property_move_down(request, organizer, property):
@transaction.atomic @transaction.atomic
@organizer_permission_required("can_change_organizer_settings") @organizer_permission_required("organizer.settings.general:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def reorder_meta_properties(request, organizer): def reorder_meta_properties(request, organizer):
try: try:
@@ -2615,7 +2615,7 @@ def reorder_meta_properties(request, organizer):
class LogView(OrganizerPermissionRequiredMixin, PaginationMixin, ListView): class LogView(OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
template_name = 'pretixcontrol/organizers/logs.html' template_name = 'pretixcontrol/organizers/logs.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
model = LogEntry model = LogEntry
context_object_name = 'logs' context_object_name = 'logs'
@@ -2640,7 +2640,7 @@ class LogView(OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
class MembershipTypeListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class MembershipTypeListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = MembershipType model = MembershipType
template_name = 'pretixcontrol/organizers/membershiptypes.html' template_name = 'pretixcontrol/organizers/membershiptypes.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'types' context_object_name = 'types'
def get_queryset(self): def get_queryset(self):
@@ -2650,7 +2650,7 @@ class MembershipTypeListView(OrganizerDetailViewMixin, OrganizerPermissionRequir
class MembershipTypeCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class MembershipTypeCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = MembershipType model = MembershipType
template_name = 'pretixcontrol/organizers/membershiptype_edit.html' template_name = 'pretixcontrol/organizers/membershiptype_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = MembershipTypeForm form_class = MembershipTypeForm
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2684,7 +2684,7 @@ class MembershipTypeCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequ
class MembershipTypeUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class MembershipTypeUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = MembershipType model = MembershipType
template_name = 'pretixcontrol/organizers/membershiptype_edit.html' template_name = 'pretixcontrol/organizers/membershiptype_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'type' context_object_name = 'type'
form_class = MembershipTypeForm form_class = MembershipTypeForm
@@ -2719,7 +2719,7 @@ class MembershipTypeUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequ
class MembershipTypeDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class MembershipTypeDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = MembershipType model = MembershipType
template_name = 'pretixcontrol/organizers/membershiptype_delete.html' template_name = 'pretixcontrol/organizers/membershiptype_delete.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'type' context_object_name = 'type'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2749,7 +2749,7 @@ class MembershipTypeDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequ
class SSOProviderListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class SSOProviderListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = CustomerSSOProvider model = CustomerSSOProvider
template_name = 'pretixcontrol/organizers/ssoproviders.html' template_name = 'pretixcontrol/organizers/ssoproviders.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'providers' context_object_name = 'providers'
def get_queryset(self): def get_queryset(self):
@@ -2759,7 +2759,7 @@ class SSOProviderListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredM
class SSOProviderCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class SSOProviderCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = CustomerSSOProvider model = CustomerSSOProvider
template_name = 'pretixcontrol/organizers/ssoprovider_edit.html' template_name = 'pretixcontrol/organizers/ssoprovider_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = SSOProviderForm form_class = SSOProviderForm
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2793,7 +2793,7 @@ class SSOProviderCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequire
class SSOProviderUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class SSOProviderUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = CustomerSSOProvider model = CustomerSSOProvider
template_name = 'pretixcontrol/organizers/ssoprovider_edit.html' template_name = 'pretixcontrol/organizers/ssoprovider_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'provider' context_object_name = 'provider'
form_class = SSOProviderForm form_class = SSOProviderForm
@@ -2835,7 +2835,7 @@ class SSOProviderUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequire
class SSOProviderDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class SSOProviderDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = CustomerSSOProvider model = CustomerSSOProvider
template_name = 'pretixcontrol/organizers/ssoprovider_delete.html' template_name = 'pretixcontrol/organizers/ssoprovider_delete.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'provider' context_object_name = 'provider'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2865,7 +2865,7 @@ class SSOProviderDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequire
class SSOClientListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class SSOClientListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = CustomerSSOClient model = CustomerSSOClient
template_name = 'pretixcontrol/organizers/ssoclients.html' template_name = 'pretixcontrol/organizers/ssoclients.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'clients' context_object_name = 'clients'
def get_queryset(self): def get_queryset(self):
@@ -2875,7 +2875,7 @@ class SSOClientListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMix
class SSOClientCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class SSOClientCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
model = CustomerSSOClient model = CustomerSSOClient
template_name = 'pretixcontrol/organizers/ssoclient_edit.html' template_name = 'pretixcontrol/organizers/ssoclient_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = SSOClientForm form_class = SSOClientForm
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2915,7 +2915,7 @@ class SSOClientCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredM
class SSOClientUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class SSOClientUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
model = CustomerSSOClient model = CustomerSSOClient
template_name = 'pretixcontrol/organizers/ssoclient_edit.html' template_name = 'pretixcontrol/organizers/ssoclient_edit.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'client' context_object_name = 'client'
form_class = SSOClientForm form_class = SSOClientForm
@@ -2965,7 +2965,7 @@ class SSOClientUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredM
class SSOClientDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class SSOClientDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = CustomerSSOClient model = CustomerSSOClient
template_name = 'pretixcontrol/organizers/ssoclient_delete.html' template_name = 'pretixcontrol/organizers/ssoclient_delete.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'client' context_object_name = 'client'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -2995,7 +2995,7 @@ class SSOClientDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredM
class CustomerListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView): class CustomerListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
model = Customer model = Customer
template_name = 'pretixcontrol/organizers/customers.html' template_name = 'pretixcontrol/organizers/customers.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'customers' context_object_name = 'customers'
def get_queryset(self): def get_queryset(self):
@@ -3016,7 +3016,7 @@ class CustomerListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView): class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
template_name = 'pretixcontrol/organizers/customer.html' template_name = 'pretixcontrol/organizers/customer.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'orders' context_object_name = 'orders'
def get_queryset(self): def get_queryset(self):
@@ -3132,7 +3132,7 @@ class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
class CustomerCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class CustomerCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
template_name = 'pretixcontrol/organizers/customer_edit.html' template_name = 'pretixcontrol/organizers/customer_edit.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'customer' context_object_name = 'customer'
form_class = CustomerCreateForm form_class = CustomerCreateForm
@@ -3162,7 +3162,7 @@ class CustomerCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
class CustomerUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class CustomerUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
template_name = 'pretixcontrol/organizers/customer_edit.html' template_name = 'pretixcontrol/organizers/customer_edit.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'customer' context_object_name = 'customer'
form_class = CustomerUpdateForm form_class = CustomerUpdateForm
@@ -3191,7 +3191,7 @@ class CustomerUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
class MembershipUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class MembershipUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
template_name = 'pretixcontrol/organizers/customer_membership.html' template_name = 'pretixcontrol/organizers/customer_membership.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'membership' context_object_name = 'membership'
form_class = MembershipUpdateForm form_class = MembershipUpdateForm
@@ -3231,7 +3231,7 @@ class MembershipUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequired
class MembershipDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class MembershipDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
template_name = 'pretixcontrol/organizers/customer_membership_delete.html' template_name = 'pretixcontrol/organizers/customer_membership_delete.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'membership' context_object_name = 'membership'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -3269,7 +3269,7 @@ class MembershipDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequired
class MembershipCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class MembershipCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
template_name = 'pretixcontrol/organizers/customer_membership.html' template_name = 'pretixcontrol/organizers/customer_membership.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'membership' context_object_name = 'membership'
form_class = MembershipUpdateForm form_class = MembershipUpdateForm
@@ -3308,7 +3308,7 @@ class MembershipCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequired
class CustomerAnonymizeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class CustomerAnonymizeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView):
template_name = 'pretixcontrol/organizers/customer_anonymize.html' template_name = 'pretixcontrol/organizers/customer_anonymize.html'
permission = 'can_manage_customers' permission = 'organizer.customers:write'
context_object_name = 'customer' context_object_name = 'customer'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -3335,7 +3335,7 @@ class CustomerAnonymizeView(OrganizerDetailViewMixin, OrganizerPermissionRequire
class ReusableMediaListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView): class ReusableMediaListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
model = ReusableMedium model = ReusableMedium
template_name = 'pretixcontrol/organizers/reusable_media.html' template_name = 'pretixcontrol/organizers/reusable_media.html'
permission = 'can_manage_reusable_media' permission = 'organizer.reusablemedia:read'
context_object_name = 'media' context_object_name = 'media'
def get_queryset(self): def get_queryset(self):
@@ -3359,7 +3359,7 @@ class ReusableMediaListView(OrganizerDetailViewMixin, OrganizerPermissionRequire
class ReusableMediumDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, TemplateView): class ReusableMediumDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/organizers/reusable_medium.html' template_name = 'pretixcontrol/organizers/reusable_medium.html'
permission = 'can_manage_reusable_media' permission = 'organizer.reusablemedia:read'
@cached_property @cached_property
def medium(self): def medium(self):
@@ -3376,7 +3376,7 @@ class ReusableMediumDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequ
class ReusableMediumCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView): class ReusableMediumCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
template_name = 'pretixcontrol/organizers/reusable_medium_edit.html' template_name = 'pretixcontrol/organizers/reusable_medium_edit.html'
permission = 'can_manage_reusable_media' permission = 'organizer.reusablemedia:write'
context_object_name = 'medium' context_object_name = 'medium'
form_class = ReusableMediumCreateForm form_class = ReusableMediumCreateForm
@@ -3405,7 +3405,7 @@ class ReusableMediumCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequ
class ReusableMediumUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView): class ReusableMediumUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
template_name = 'pretixcontrol/organizers/reusable_medium_edit.html' template_name = 'pretixcontrol/organizers/reusable_medium_edit.html'
permission = 'can_manage_reusable_media' permission = 'organizer.reusablemedia:write'
context_object_name = 'medium' context_object_name = 'medium'
form_class = ReusableMediumUpdateForm form_class = ReusableMediumUpdateForm
@@ -3435,7 +3435,7 @@ class ReusableMediumUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequ
class ChannelListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView): class ChannelListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = SalesChannel model = SalesChannel
template_name = 'pretixcontrol/organizers/channels.html' template_name = 'pretixcontrol/organizers/channels.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'channels' context_object_name = 'channels'
def get_queryset(self): def get_queryset(self):
@@ -3454,7 +3454,7 @@ class ChannelEditorMixin:
class ChannelCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ChannelEditorMixin, CreateView): class ChannelCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ChannelEditorMixin, CreateView):
model = SalesChannel model = SalesChannel
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
template_name = 'pretixcontrol/organizers/channel_add.html' template_name = 'pretixcontrol/organizers/channel_add.html'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -3526,7 +3526,7 @@ class ChannelCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMix
class ChannelUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ChannelEditorMixin, UpdateView): class ChannelUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ChannelEditorMixin, UpdateView):
model = SalesChannel model = SalesChannel
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'channel' context_object_name = 'channel'
template_name = 'pretixcontrol/organizers/channel_edit.html' template_name = 'pretixcontrol/organizers/channel_edit.html'
@@ -3571,7 +3571,7 @@ class ChannelUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMix
class ChannelDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView): class ChannelDeleteView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CompatDeleteView):
model = SalesChannel model = SalesChannel
template_name = 'pretixcontrol/organizers/channel_delete.html' template_name = 'pretixcontrol/organizers/channel_delete.html'
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
context_object_name = 'channel' context_object_name = 'channel'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@@ -3627,7 +3627,7 @@ def channel_move(request, channel, up=True):
messages.success(request, _('The order of sales channels has been updated.')) messages.success(request, _('The order of sales channels has been updated.'))
@organizer_permission_required("can_change_organizer_settings") @organizer_permission_required("organizer.settings.general:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def channel_move_up(request, organizer, channel): def channel_move_up(request, organizer, channel):
channel_move(request, channel, up=True) channel_move(request, channel, up=True)
@@ -3635,7 +3635,7 @@ def channel_move_up(request, organizer, channel):
organizer=request.organizer.slug) organizer=request.organizer.slug)
@organizer_permission_required("can_change_organizer_settings") @organizer_permission_required("organizer.settings.general:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def channel_move_down(request, organizer, channel): def channel_move_down(request, organizer, channel):
channel_move(request, channel, up=False) channel_move(request, channel, up=False)
@@ -3644,7 +3644,7 @@ def channel_move_down(request, organizer, channel):
@transaction.atomic @transaction.atomic
@organizer_permission_required("can_change_organizer_settings") @organizer_permission_required("organizer.settings.general:write")
@require_http_methods(["POST"]) @require_http_methods(["POST"])
def reorder_channels(request, organizer): def reorder_channels(request, organizer):
try: try:
+1 -1
View File
@@ -58,7 +58,7 @@ logger = logging.getLogger(__name__)
class BaseEditorView(EventPermissionRequiredMixin, TemplateView): class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/pdf/index.html' template_name = 'pretixcontrol/pdf/index.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
accepted_formats = ( accepted_formats = (
'application/pdf', 'application/pdf',
) )
+2 -2
View File
@@ -85,7 +85,7 @@ class OrderSearch(PaginationMixin, ListView):
if not self.request.user.has_active_staff_session(self.request.session.session_key): if not self.request.user.has_active_staff_session(self.request.session.session_key):
qs = qs.filter( qs = qs.filter(
Q(event_id__in=self.request.user.get_events_with_permission('can_view_orders').values_list('id', flat=True)) Q(event_id__in=self.request.user.get_events_with_permission('event.orders:read').values_list('id', flat=True))
) )
if self.filter_form.is_valid(): if self.filter_form.is_valid():
@@ -159,7 +159,7 @@ class PaymentSearch(PaginationMixin, ListView):
if not self.request.user.has_active_staff_session(self.request.session.session_key): if not self.request.user.has_active_staff_session(self.request.session.session_key):
qs = qs.filter( qs = qs.filter(
Q(order__event_id__in=self.request.user.get_events_with_permission('can_view_orders').values_list('id', flat=True)) Q(order__event_id__in=self.request.user.get_events_with_permission('event.orders:read').values_list('id', flat=True))
) )
if self.filter_form.is_valid(): if self.filter_form.is_valid():
+4 -4
View File
@@ -76,7 +76,7 @@ class ShredderMixin:
class StartShredView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, TemplateView): class StartShredView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, TemplateView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/shredder/index.html' template_name = 'pretixcontrol/shredder/index.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -87,7 +87,7 @@ class StartShredView(RecentAuthenticationRequiredMixin, EventPermissionRequiredM
class ShredDownloadView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, TemplateView): class ShredDownloadView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, TemplateView):
permission = 'can_change_orders' permission = 'event.orders:write'
template_name = 'pretixcontrol/shredder/download.html' template_name = 'pretixcontrol/shredder/download.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -119,7 +119,7 @@ class ShredDownloadView(RecentAuthenticationRequiredMixin, EventPermissionRequir
class ShredExportView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, AsyncAction, View): class ShredExportView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, AsyncAction, View):
permission = 'can_change_orders' permission = 'event.orders:write'
task = export task = export
known_errortypes = ['ShredError'] known_errortypes = ['ShredError']
@@ -148,7 +148,7 @@ class ShredExportView(RecentAuthenticationRequiredMixin, EventPermissionRequired
class ShredDoView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, AsyncAction, View): class ShredDoView(RecentAuthenticationRequiredMixin, EventPermissionRequiredMixin, ShredderMixin, AsyncAction, View):
permission = 'can_change_orders' permission = 'event.orders:write'
task = shred task = shred
known_errortypes = ['ShredError'] known_errortypes = ['ShredError']
+8 -8
View File
@@ -117,7 +117,7 @@ class SubEventList(EventPermissionRequiredMixin, PaginationMixin, SubEventQueryM
model = SubEvent model = SubEvent
context_object_name = 'subevents' context_object_name = 'subevents'
template_name = 'pretixcontrol/subevents/index.html' template_name = 'pretixcontrol/subevents/index.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
def get_queryset(self): def get_queryset(self):
return super().get_queryset(True).prefetch_related( return super().get_queryset(True).prefetch_related(
@@ -156,7 +156,7 @@ class SubEventList(EventPermissionRequiredMixin, PaginationMixin, SubEventQueryM
class SubEventDelete(EventPermissionRequiredMixin, CompatDeleteView): class SubEventDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = SubEvent model = SubEvent
template_name = 'pretixcontrol/subevents/delete.html' template_name = 'pretixcontrol/subevents/delete.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
context_object_name = 'subevents' context_object_name = 'subevents'
def get_object(self, queryset=None) -> SubEvent: def get_object(self, queryset=None) -> SubEvent:
@@ -241,7 +241,7 @@ class SubEventEditorMixin(MetaDataEditorMixin):
property=p, property=p,
disabled=( disabled=(
p.protected and p.protected and
not self.request.user.has_organizer_permission(self.request.organizer, 'can_change_organizer_settings', request=self.request) not self.request.user.has_organizer_permission(self.request.organizer, 'organizer.settings.general:write', request=self.request)
), ),
default=self._default_meta.get(p.name, ''), default=self._default_meta.get(p.name, ''),
instance=val_instances.get(p.pk, self.meta_model(property=p, subevent=self.object)), instance=val_instances.get(p.pk, self.meta_model(property=p, subevent=self.object)),
@@ -508,7 +508,7 @@ class SubEventEditorMixin(MetaDataEditorMixin):
class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateView): class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateView):
model = SubEvent model = SubEvent
template_name = 'pretixcontrol/subevents/detail.html' template_name = 'pretixcontrol/subevents/detail.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
context_object_name = 'subevent' context_object_name = 'subevent'
form_class = SubEventForm form_class = SubEventForm
@@ -575,7 +575,7 @@ class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateVi
class SubEventCreate(SubEventEditorMixin, EventPermissionRequiredMixin, CreateView): class SubEventCreate(SubEventEditorMixin, EventPermissionRequiredMixin, CreateView):
model = SubEvent model = SubEvent
template_name = 'pretixcontrol/subevents/detail.html' template_name = 'pretixcontrol/subevents/detail.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
context_object_name = 'subevent' context_object_name = 'subevent'
form_class = SubEventForm form_class = SubEventForm
@@ -669,7 +669,7 @@ class SubEventCreate(SubEventEditorMixin, EventPermissionRequiredMixin, CreateVi
class SubEventBulkAction(SubEventQueryMixin, EventPermissionRequiredMixin, View): class SubEventBulkAction(SubEventQueryMixin, EventPermissionRequiredMixin, View):
permission = 'can_change_settings' permission = 'event.settings.general:write'
@transaction.atomic @transaction.atomic
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@@ -740,7 +740,7 @@ class SubEventBulkAction(SubEventQueryMixin, EventPermissionRequiredMixin, View)
class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, AsyncFormView): class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, AsyncFormView):
model = SubEvent model = SubEvent
template_name = 'pretixcontrol/subevents/bulk.html' template_name = 'pretixcontrol/subevents/bulk.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
context_object_name = 'subevent' context_object_name = 'subevent'
form_class = SubEventBulkForm form_class = SubEventBulkForm
itemformclass = BulkSubEventItemForm itemformclass = BulkSubEventItemForm
@@ -1065,7 +1065,7 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Asyn
class SubEventBulkEdit(SubEventQueryMixin, EventPermissionRequiredMixin, FormView): class SubEventBulkEdit(SubEventQueryMixin, EventPermissionRequiredMixin, FormView):
permission = 'can_change_settings' permission = 'event.settings.general:write'
form_class = SubEventBulkEditForm form_class = SubEventBulkEditForm
template_name = 'pretixcontrol/subevents/bulk_edit.html' template_name = 'pretixcontrol/subevents/bulk_edit.html'
context_object_name = 'subevent' context_object_name = 'subevent'
+6 -6
View File
@@ -173,7 +173,7 @@ def event_list(request):
return JsonResponse(doc) return JsonResponse(doc)
@organizer_permission_required(("can_manage_gift_cards", "can_manage_reusable_media")) @organizer_permission_required(("organizer.giftcards:read", "organizer.reusablemedia:write"))
def giftcard_select2(request, **kwargs): def giftcard_select2(request, **kwargs):
query = request.GET.get('query', '') query = request.GET.get('query', '')
try: try:
@@ -181,7 +181,7 @@ def giftcard_select2(request, **kwargs):
except ValueError: except ValueError:
page = 1 page = 1
if request.user.has_organizer_permission(request.organizer, 'can_manage_gift_cards', request): if request.user.has_organizer_permission(request.organizer, 'organizer.giftcards:write', request):
qs = request.organizer.issued_gift_cards.filter( qs = request.organizer.issued_gift_cards.filter(
Q(secret__icontains=query) Q(secret__icontains=query)
).order_by('secret') ).order_by('secret')
@@ -211,7 +211,7 @@ def giftcard_select2(request, **kwargs):
return JsonResponse(doc) return JsonResponse(doc)
@organizer_permission_required(("can_manage_reusable_media", "can_manage_gift_cards")) @organizer_permission_required(("organizer.reusablemedia:write", "organizer.giftcards:write"))
def ticket_select2(request, **kwargs): def ticket_select2(request, **kwargs):
query = request.GET.get('query', '') query = request.GET.get('query', '')
try: try:
@@ -276,7 +276,7 @@ def ticket_select2(request, **kwargs):
return JsonResponse(doc) return JsonResponse(doc)
@organizer_permission_required("can_manage_customers") @organizer_permission_required("organizer.customers:write")
def customer_select2(request, **kwargs): def customer_select2(request, **kwargs):
query = request.GET.get('query', '') query = request.GET.get('query', '')
try: try:
@@ -1013,7 +1013,7 @@ def item_meta_values(request, organizer, event):
}) })
@organizer_permission_required(("can_view_orders", "can_change_organizer_settings")) @organizer_permission_required(("event.orders:read", "organizer.settings.general:write"))
# This decorator is a bit of a hack since this is not technically an organizer permission, but it does the job here -- # This decorator is a bit of a hack since this is not technically an organizer permission, but it does the job here --
# anyone who can see orders for any event can see the check-in log view where this is used as a filter # anyone who can see orders for any event can see the check-in log view where this is used as a filter
def devices_select2(request, **kwargs): def devices_select2(request, **kwargs):
@@ -1051,7 +1051,7 @@ def devices_select2(request, **kwargs):
return JsonResponse(doc) return JsonResponse(doc)
@organizer_permission_required(("can_view_orders", "can_change_event_settings", "can_change_organizer_settings")) @organizer_permission_required(("event.orders:read", "event.settings.general:write", "organizer.settings.general:write"))
# This decorator is a bit of a hack since this is not technically an organizer permission, but it does the job here -- # This decorator is a bit of a hack since this is not technically an organizer permission, but it does the job here --
# anyone who can see orders for any event can see the check-in log view where this is used as a filter # anyone who can see orders for any event can see the check-in log view where this is used as a filter
def gate_select2(request, **kwargs): def gate_select2(request, **kwargs):
+13 -13
View File
@@ -83,7 +83,7 @@ class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
model = Voucher model = Voucher
context_object_name = 'vouchers' context_object_name = 'vouchers'
template_name = 'pretixcontrol/vouchers/index.html' template_name = 'pretixcontrol/vouchers/index.html'
permission = 'can_view_vouchers' permission = 'event.vouchers:read'
@scopes_disabled() # we have an event check here, and we can save some performance on subqueries @scopes_disabled() # we have an event check here, and we can save some performance on subqueries
def get_queryset(self): def get_queryset(self):
@@ -155,7 +155,7 @@ class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
class VoucherTags(EventPermissionRequiredMixin, TemplateView): class VoucherTags(EventPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/vouchers/tags.html' template_name = 'pretixcontrol/vouchers/tags.html'
permission = 'can_view_vouchers' permission = 'event.vouchers:read'
def get_queryset(self): def get_queryset(self):
qs = self.request.event.vouchers.order_by('tag').filter( qs = self.request.event.vouchers.order_by('tag').filter(
@@ -196,7 +196,7 @@ class VoucherTags(EventPermissionRequiredMixin, TemplateView):
class VoucherDeleteCarts(EventPermissionRequiredMixin, CompatDeleteView): class VoucherDeleteCarts(EventPermissionRequiredMixin, CompatDeleteView):
model = Voucher model = Voucher
template_name = 'pretixcontrol/vouchers/delete_carts.html' template_name = 'pretixcontrol/vouchers/delete_carts.html'
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
context_object_name = 'voucher' context_object_name = 'voucher'
def get_object(self, queryset=None) -> Voucher: def get_object(self, queryset=None) -> Voucher:
@@ -228,7 +228,7 @@ class VoucherDeleteCarts(EventPermissionRequiredMixin, CompatDeleteView):
class VoucherDelete(EventPermissionRequiredMixin, CompatDeleteView): class VoucherDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = Voucher model = Voucher
template_name = 'pretixcontrol/vouchers/delete.html' template_name = 'pretixcontrol/vouchers/delete.html'
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
context_object_name = 'voucher' context_object_name = 'voucher'
def get_object(self, queryset=None) -> Voucher: def get_object(self, queryset=None) -> Voucher:
@@ -270,7 +270,7 @@ class VoucherDelete(EventPermissionRequiredMixin, CompatDeleteView):
class VoucherUpdate(EventPermissionRequiredMixin, UpdateView): class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
model = Voucher model = Voucher
template_name = 'pretixcontrol/vouchers/detail.html' template_name = 'pretixcontrol/vouchers/detail.html'
permission = ('can_change_vouchers', 'can_view_vouchers') permission = ('event.vouchers:write', 'event.vouchers:read')
context_object_name = 'voucher' context_object_name = 'voucher'
def form_invalid(self, form): def form_invalid(self, form):
@@ -286,7 +286,7 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
def get_form(self, form_class=None): def get_form(self, form_class=None):
form = super().get_form(form_class) form = super().get_form(form_class)
if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'can_change_vouchers', if not self.request.user.has_event_permission(self.request.organizer, self.request.event, 'event.vouchers:write',
request=self.request): request=self.request):
for f in form.fields.values(): for f in form.fields.values():
f.disabled = True f.disabled = True
@@ -313,7 +313,7 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
@transaction.atomic @transaction.atomic
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_vouchers', if not request.user.has_event_permission(request.organizer, request.event, 'event.vouchers:write',
request=request): request=request):
raise PermissionDenied() raise PermissionDenied()
return super().post(request, *args, **kwargs) return super().post(request, *args, **kwargs)
@@ -344,7 +344,7 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
class VoucherCreate(EventPermissionRequiredMixin, CreateView): class VoucherCreate(EventPermissionRequiredMixin, CreateView):
model = Voucher model = Voucher
template_name = 'pretixcontrol/vouchers/detail.html' template_name = 'pretixcontrol/vouchers/detail.html'
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
context_object_name = 'voucher' context_object_name = 'voucher'
def form_invalid(self, form): def form_invalid(self, form):
@@ -389,7 +389,7 @@ class VoucherCreate(EventPermissionRequiredMixin, CreateView):
class VoucherGo(EventPermissionRequiredMixin, View): class VoucherGo(EventPermissionRequiredMixin, View):
permission = 'can_view_vouchers' permission = 'event.vouchers:read'
def get_voucher(self, code): def get_voucher(self, code):
return Voucher.objects.get(code__iexact=code, event=self.request.event) return Voucher.objects.get(code__iexact=code, event=self.request.event)
@@ -408,7 +408,7 @@ class VoucherGo(EventPermissionRequiredMixin, View):
class VoucherBulkCreate(EventPermissionRequiredMixin, AsyncFormView): class VoucherBulkCreate(EventPermissionRequiredMixin, AsyncFormView):
model = Voucher model = Voucher
template_name = 'pretixcontrol/vouchers/bulk.html' template_name = 'pretixcontrol/vouchers/bulk.html'
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
context_object_name = 'voucher' context_object_name = 'voucher'
atomic_execute = True atomic_execute = True
@@ -540,7 +540,7 @@ class VoucherBulkCreate(EventPermissionRequiredMixin, AsyncFormView):
class VoucherBulkMailPreview(EventPermissionRequiredMixin, View): class VoucherBulkMailPreview(EventPermissionRequiredMixin, View):
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
# return the origin text if key is missing in dict # return the origin text if key is missing in dict
class SafeDict(dict): class SafeDict(dict):
@@ -579,7 +579,7 @@ class VoucherBulkMailPreview(EventPermissionRequiredMixin, View):
class VoucherRNG(EventPermissionRequiredMixin, View): class VoucherRNG(EventPermissionRequiredMixin, View):
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
try: try:
@@ -603,7 +603,7 @@ class VoucherRNG(EventPermissionRequiredMixin, View):
class VoucherBulkAction(EventPermissionRequiredMixin, View): class VoucherBulkAction(EventPermissionRequiredMixin, View):
permission = 'can_change_vouchers' permission = 'event.vouchers:write'
@cached_property @cached_property
def objects(self): def objects(self):
+5 -5
View File
@@ -64,7 +64,7 @@ from . import UpdateView
class AutoAssign(EventPermissionRequiredMixin, AsyncAction, View): class AutoAssign(EventPermissionRequiredMixin, AsyncAction, View):
task = assign_automatically task = assign_automatically
known_errortypes = ['WaitingListError'] known_errortypes = ['WaitingListError']
permission = 'can_change_orders' permission = 'event.orders:write'
def get_success_message(self, value): def get_success_message(self, value):
return _('{num} vouchers have been created and sent out via email.').format(num=value) return _('{num} vouchers have been created and sent out via email.').format(num=value)
@@ -154,7 +154,7 @@ class WaitingListQuerySetMixin:
class WaitingListActionView(EventPermissionRequiredMixin, WaitingListQuerySetMixin, View): class WaitingListActionView(EventPermissionRequiredMixin, WaitingListQuerySetMixin, View):
model = WaitingListEntry model = WaitingListEntry
permission = 'can_change_orders' permission = 'event.orders:write'
def _redirect_back(self): def _redirect_back(self):
if "next" in self.request.GET and url_has_allowed_host_and_scheme(self.request.GET.get("next"), allowed_hosts=None): if "next" in self.request.GET and url_has_allowed_host_and_scheme(self.request.GET.get("next"), allowed_hosts=None):
@@ -244,7 +244,7 @@ class WaitingListView(EventPermissionRequiredMixin, WaitingListQuerySetMixin, Pa
model = WaitingListEntry model = WaitingListEntry
context_object_name = 'entries' context_object_name = 'entries'
template_name = 'pretixcontrol/waitinglist/index.html' template_name = 'pretixcontrol/waitinglist/index.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
@@ -371,7 +371,7 @@ class WaitingListView(EventPermissionRequiredMixin, WaitingListQuerySetMixin, Pa
class EntryDelete(EventPermissionRequiredMixin, CompatDeleteView): class EntryDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = WaitingListEntry model = WaitingListEntry
template_name = 'pretixcontrol/waitinglist/delete.html' template_name = 'pretixcontrol/waitinglist/delete.html'
permission = 'can_change_orders' permission = 'event.orders:write'
context_object_name = 'entry' context_object_name = 'entry'
def get_object(self, queryset=None) -> WaitingListEntry: def get_object(self, queryset=None) -> WaitingListEntry:
@@ -404,7 +404,7 @@ class EntryDelete(EventPermissionRequiredMixin, CompatDeleteView):
class EntryEdit(EventPermissionRequiredMixin, UpdateView): class EntryEdit(EventPermissionRequiredMixin, UpdateView):
model = WaitingListEntry model = WaitingListEntry
template_name = 'pretixcontrol/waitinglist/edit.html' template_name = 'pretixcontrol/waitinglist/edit.html'
permission = 'can_change_orders' permission = 'event.orders:write'
form_class = WaitingListEntryEditForm form_class = WaitingListEntryEditForm
context_object_name = 'entry' context_object_name = 'entry'
+1 -1
View File
@@ -108,7 +108,7 @@ class RuleViewSet(viewsets.ModelViewSet):
filter_backends = (DjangoFilterBackend, TotalOrderingFilter) filter_backends = (DjangoFilterBackend, TotalOrderingFilter)
ordering = ("id",) ordering = ("id",)
ordering_fields = ("id",) ordering_fields = ("id",)
permission = "can_change_event_settings" permission = "event.settings.general:write"
def get_queryset(self): def get_queryset(self):
return AutoCheckinRule.objects.filter(event=self.request.event) return AutoCheckinRule.objects.filter(event=self.request.event)
+1 -1
View File
@@ -39,7 +39,7 @@ from pretix.plugins.autocheckin.models import AutoCheckinRule
def nav_event_receiver(sender, request, **kwargs): def nav_event_receiver(sender, request, **kwargs):
url = request.resolver_match url = request.resolver_match
if not request.user.has_event_permission( if not request.user.has_event_permission(
request.organizer, request.event, "can_change_event_settings", request=request request.organizer, request.event, "event.settings.general:write", request=request
): ):
return [] return []
return [ return [
+4 -4
View File
@@ -35,7 +35,7 @@ from pretix.plugins.autocheckin.models import AutoCheckinRule
class IndexView(EventPermissionRequiredMixin, ListView): class IndexView(EventPermissionRequiredMixin, ListView):
permission = "can_change_event_settings" permission = "event.settings.general:write"
template_name = "pretixplugins/autocheckin/index.html" template_name = "pretixplugins/autocheckin/index.html"
paginate_by = 50 paginate_by = 50
context_object_name = "rules" context_object_name = "rules"
@@ -70,7 +70,7 @@ class IndexView(EventPermissionRequiredMixin, ListView):
class RuleAddView(EventPermissionRequiredMixin, CreateView): class RuleAddView(EventPermissionRequiredMixin, CreateView):
template_name = "pretixplugins/autocheckin/add.html" template_name = "pretixplugins/autocheckin/add.html"
permission = "can_change_event_settings" permission = "event.settings.general:write"
form_class = AutoCheckinRuleForm form_class = AutoCheckinRuleForm
model = AutoCheckinRule model = AutoCheckinRule
@@ -140,7 +140,7 @@ class RuleEditView(EventPermissionRequiredMixin, UpdateView):
model = AutoCheckinRule model = AutoCheckinRule
form_class = AutoCheckinRuleForm form_class = AutoCheckinRuleForm
template_name = "pretixplugins/autocheckin/edit.html" template_name = "pretixplugins/autocheckin/edit.html"
permission = "can_change_event_settings" permission = "event.settings.general:write"
def get_object(self, queryset=None) -> AutoCheckinRule: def get_object(self, queryset=None) -> AutoCheckinRule:
return get_object_or_404( return get_object_or_404(
@@ -178,7 +178,7 @@ class RuleEditView(EventPermissionRequiredMixin, UpdateView):
class RuleDeleteView(EventPermissionRequiredMixin, DeleteView): class RuleDeleteView(EventPermissionRequiredMixin, DeleteView):
model = AutoCheckinRule model = AutoCheckinRule
permission = "can_change_event_settings" permission = "event.settings.general:write"
template_name = "pretixplugins/autocheckin/delete.html" template_name = "pretixplugins/autocheckin/delete.html"
context_object_name = "rule" context_object_name = "rule"
+2 -2
View File
@@ -44,8 +44,8 @@ from pretix.plugins.badges.models import BadgeItem, BadgeLayout
def control_nav_import(sender, request=None, **kwargs): def control_nav_import(sender, request=None, **kwargs):
url = resolve(request.path_info) url = resolve(request.path_info)
p = ( p = (
request.user.has_event_permission(request.organizer, request.event, 'can_change_settings', request) request.user.has_event_permission(request.organizer, request.event, 'event.settings.general:write', request)
or request.user.has_event_permission(request.organizer, request.event, 'can_view_orders', request) or request.user.has_event_permission(request.organizer, request.event, 'event.orders:read', request)
) )
if not p: if not p:
return [] return []
+5 -5
View File
@@ -59,7 +59,7 @@ from .templates import TEMPLATES
class LayoutListView(EventPermissionRequiredMixin, ListView): class LayoutListView(EventPermissionRequiredMixin, ListView):
model = BadgeLayout model = BadgeLayout
permission = ('can_change_event_settings', 'can_view_orders') permission = ('event.settings.general:write', 'event.orders:read')
template_name = 'pretixplugins/badges/index.html' template_name = 'pretixplugins/badges/index.html'
context_object_name = 'layouts' context_object_name = 'layouts'
@@ -71,7 +71,7 @@ class LayoutCreate(EventPermissionRequiredMixin, CreateView):
model = BadgeLayout model = BadgeLayout
form_class = BadgeLayoutForm form_class = BadgeLayoutForm
template_name = 'pretixplugins/badges/edit.html' template_name = 'pretixplugins/badges/edit.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'layout' context_object_name = 'layout'
success_url = '/ignored' success_url = '/ignored'
@@ -139,7 +139,7 @@ class LayoutCreate(EventPermissionRequiredMixin, CreateView):
class LayoutSetDefault(EventPermissionRequiredMixin, DetailView): class LayoutSetDefault(EventPermissionRequiredMixin, DetailView):
model = BadgeLayout model = BadgeLayout
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_object(self, queryset=None) -> BadgeLayout: def get_object(self, queryset=None) -> BadgeLayout:
try: try:
@@ -171,7 +171,7 @@ class LayoutSetDefault(EventPermissionRequiredMixin, DetailView):
class LayoutDelete(EventPermissionRequiredMixin, CompatDeleteView): class LayoutDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = BadgeLayout model = BadgeLayout
template_name = 'pretixplugins/badges/delete.html' template_name = 'pretixplugins/badges/delete.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'layout' context_object_name = 'layout'
def get_object(self, queryset=None) -> BadgeLayout: def get_object(self, queryset=None) -> BadgeLayout:
@@ -269,7 +269,7 @@ class LayoutEditorView(BaseEditorView):
class OrderPrintDo(EventPermissionRequiredMixin, AsyncAction, View): class OrderPrintDo(EventPermissionRequiredMixin, AsyncAction, View):
task = badges_create_pdf task = badges_create_pdf
permission = 'can_view_orders' permission = 'event.orders:read'
known_errortypes = ['OrderError', 'ExportError'] known_errortypes = ['OrderError', 'ExportError']
def get_success_message(self, value): def get_success_message(self, value):
+2 -2
View File
@@ -97,7 +97,7 @@ class BankImportJobViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
queryset = BankImportJob.objects.none() queryset = BankImportJob.objects.none()
filter_backends = (DjangoFilterBackend,) filter_backends = (DjangoFilterBackend,)
filterset_class = JobFilter filterset_class = JobFilter
permission = 'can_view_orders' permission = 'event.orders:read'
def get_queryset(self): def get_queryset(self):
return BankImportJob.objects.filter(organizer=self.request.organizer) return BankImportJob.objects.filter(organizer=self.request.organizer)
@@ -107,7 +107,7 @@ class BankImportJobViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
perm_holder = (request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user) perm_holder = (request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user)
if not perm_holder.has_organizer_permission(request.organizer, 'can_change_orders'): if not perm_holder.has_organizer_permission(request.organizer, 'event.orders:write'):
raise PermissionDenied('Invalid set of permissions') raise PermissionDenied('Invalid set of permissions')
if BankImportJob.objects.filter(Q(organizer=request.organizer)).filter( if BankImportJob.objects.filter(Q(organizer=request.organizer)).filter(
+2 -2
View File
@@ -41,7 +41,7 @@ def register_payment_provider(sender, **kwargs):
@receiver(nav_event, dispatch_uid="payment_banktransfer_nav") @receiver(nav_event, dispatch_uid="payment_banktransfer_nav")
def control_nav_import(sender, request=None, **kwargs): def control_nav_import(sender, request=None, **kwargs):
url = resolve(request.path_info) url = resolve(request.path_info)
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_orders', request=request): if not request.user.has_event_permission(request.organizer, request.event, 'event.orders:write', request=request):
return [] return []
return [ return [
{ {
@@ -76,7 +76,7 @@ def control_nav_import(sender, request=None, **kwargs):
@receiver(nav_organizer, dispatch_uid="payment_banktransfer_organav") @receiver(nav_organizer, dispatch_uid="payment_banktransfer_organav")
def control_nav_orga_import(sender, request=None, **kwargs): def control_nav_orga_import(sender, request=None, **kwargs):
url = resolve(request.path_info) url = resolve(request.path_info)
if not request.user.has_organizer_permission(request.organizer, 'can_change_orders', request=request): if not request.user.has_organizer_permission(request.organizer, 'event.orders:write', request=request):
return [] return []
return [ return [
{ {
+15 -15
View File
@@ -80,7 +80,7 @@ logger = logging.getLogger('pretix.plugins.banktransfer')
class ActionView(View): class ActionView(View):
permission = 'can_change_orders' permission = 'event.orders:write'
def _discard(self, trans): def _discard(self, trans):
trans.state = BankTransaction.STATE_DISCARDED trans.state = BankTransaction.STATE_DISCARDED
@@ -280,7 +280,7 @@ class ActionView(View):
class JobDetailView(DetailView): class JobDetailView(DetailView):
template_name = 'pretixplugins/banktransfer/job_detail.html' template_name = 'pretixplugins/banktransfer/job_detail.html'
permission = 'can_change_orders' permission = 'event.orders:write'
context_objectname = 'job' context_objectname = 'job'
def redirect_form(self): def redirect_form(self):
@@ -369,7 +369,7 @@ class BankTransactionFilterForm(forms.Form):
class ImportView(ListView): class ImportView(ListView):
template_name = 'pretixplugins/banktransfer/import_form.html' template_name = 'pretixplugins/banktransfer/import_form.html'
permission = 'can_change_orders' permission = 'event.orders:write'
context_object_name = 'transactions_unhandled' context_object_name = 'transactions_unhandled'
paginate_by = 30 paginate_by = 30
@@ -630,30 +630,30 @@ class OrganizerBanktransferView:
class EventImportView(EventPermissionRequiredMixin, ImportView): class EventImportView(EventPermissionRequiredMixin, ImportView):
permission = 'can_change_orders' permission = 'event.orders:write'
class OrganizerImportView(OrganizerBanktransferView, OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, class OrganizerImportView(OrganizerBanktransferView, OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin,
ImportView): ImportView):
permission = 'can_change_orders' permission = 'event.orders:write'
class EventJobDetailView(EventPermissionRequiredMixin, JobDetailView): class EventJobDetailView(EventPermissionRequiredMixin, JobDetailView):
permission = 'can_change_orders' permission = 'event.orders:write'
class OrganizerJobDetailView(OrganizerBanktransferView, OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, class OrganizerJobDetailView(OrganizerBanktransferView, OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin,
JobDetailView): JobDetailView):
permission = 'can_change_orders' permission = 'event.orders:write'
class EventActionView(EventPermissionRequiredMixin, ActionView): class EventActionView(EventPermissionRequiredMixin, ActionView):
permission = 'can_change_orders' permission = 'event.orders:write'
class OrganizerActionView(OrganizerBanktransferView, OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, class OrganizerActionView(OrganizerBanktransferView, OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin,
ActionView): ActionView):
permission = 'can_change_orders' permission = 'event.orders:write'
def order_qs(self): def order_qs(self):
all = self.request.user.teams.filter( all = self.request.user.teams.filter(
@@ -762,7 +762,7 @@ class RefundExportListView(ListView):
class EventRefundExportListView(EventPermissionRequiredMixin, RefundExportListView): class EventRefundExportListView(EventPermissionRequiredMixin, RefundExportListView):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_success_url(self): def get_success_url(self):
return reverse('plugins:banktransfer:refunds.list', kwargs={ return reverse('plugins:banktransfer:refunds.list', kwargs={
@@ -785,7 +785,7 @@ class EventRefundExportListView(EventPermissionRequiredMixin, RefundExportListVi
class OrganizerRefundExportListView(OrganizerPermissionRequiredMixin, RefundExportListView): class OrganizerRefundExportListView(OrganizerPermissionRequiredMixin, RefundExportListView):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_success_url(self): def get_success_url(self):
return reverse('plugins:banktransfer:refunds.list', kwargs={ return reverse('plugins:banktransfer:refunds.list', kwargs={
@@ -818,7 +818,7 @@ class DownloadRefundExportView(DetailView):
class EventDownloadRefundExportView(EventPermissionRequiredMixin, DownloadRefundExportView): class EventDownloadRefundExportView(EventPermissionRequiredMixin, DownloadRefundExportView):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
return get_object_or_404( return get_object_or_404(
@@ -829,7 +829,7 @@ class EventDownloadRefundExportView(EventPermissionRequiredMixin, DownloadRefund
class OrganizerDownloadRefundExportView(OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, DownloadRefundExportView): class OrganizerDownloadRefundExportView(OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, DownloadRefundExportView):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
return get_object_or_404( return get_object_or_404(
@@ -876,7 +876,7 @@ class SepaXMLExportView(SingleObjectMixin, FormView):
class EventSepaXMLExportView(EventPermissionRequiredMixin, SepaXMLExportView): class EventSepaXMLExportView(EventPermissionRequiredMixin, SepaXMLExportView):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
return get_object_or_404( return get_object_or_404(
@@ -892,7 +892,7 @@ class EventSepaXMLExportView(EventPermissionRequiredMixin, SepaXMLExportView):
class OrganizerSepaXMLExportView(OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, SepaXMLExportView): class OrganizerSepaXMLExportView(OrganizerPermissionRequiredMixin, OrganizerDetailViewMixin, SepaXMLExportView):
permission = 'can_change_orders' permission = 'event.orders:write'
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
return get_object_or_404( return get_object_or_404(
+1 -1
View File
@@ -246,7 +246,7 @@ def webhook(request, *args, **kwargs):
return HttpResponse(status=200) return HttpResponse(status=200)
@event_permission_required('can_change_event_settings') @event_permission_required('event.settings.general:write')
@require_POST @require_POST
def oauth_disconnect(request, **kwargs): def oauth_disconnect(request, **kwargs):
del request.event.settings.payment_paypal_connect_refresh_token del request.event.settings.payment_paypal_connect_refresh_token
+2 -2
View File
@@ -216,7 +216,7 @@ class PayView(PaypalOrderView, TemplateView):
@scopes_disabled() @scopes_disabled()
@event_permission_required('can_change_event_settings') @event_permission_required('event.settings.general:write')
def isu_return(request, *args, **kwargs): def isu_return(request, *args, **kwargs):
getparams = ['merchantId', 'merchantIdInPayPal', 'permissionsGranted', 'accountStatus', 'consentStatus', 'productIntentID', 'isEmailConfirmed'] getparams = ['merchantId', 'merchantIdInPayPal', 'permissionsGranted', 'accountStatus', 'consentStatus', 'productIntentID', 'isEmailConfirmed']
sessionparams = ['payment_paypal_isu_event', 'payment_paypal_isu_tracking_id'] sessionparams = ['payment_paypal_isu_event', 'payment_paypal_isu_tracking_id']
@@ -526,7 +526,7 @@ def webhook(request, *args, **kwargs):
return HttpResponse(status=200) return HttpResponse(status=200)
@event_permission_required('can_change_event_settings') @event_permission_required('event.settings.general:write')
@require_POST @require_POST
def isu_disconnect(request, **kwargs): def isu_disconnect(request, **kwargs):
del request.event.settings.payment_paypal_connect_refresh_token del request.event.settings.payment_paypal_connect_refresh_token
+1 -1
View File
@@ -83,7 +83,7 @@ def check_against_prefix_list(u, allowlist):
@receiver(nav_event_settings, dispatch_uid='returnurl_nav') @receiver(nav_event_settings, dispatch_uid='returnurl_nav')
def navbar_info(sender, request, **kwargs): def navbar_info(sender, request, **kwargs):
url = resolve(request.path_info) url = resolve(request.path_info)
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_event_settings', if not request.user.has_event_permission(request.organizer, request.event, 'event.settings.general:write',
request=request): request=request):
return [] return []
return [{ return [{
+1 -1
View File
@@ -48,7 +48,7 @@ class ReturnSettings(EventSettingsViewMixin, EventSettingsFormView):
model = Event model = Event
form_class = ReturnSettingsForm form_class = ReturnSettingsForm
template_name = 'returnurl/settings.html' template_name = 'returnurl/settings.html'
permission = 'can_change_settings' permission = 'event.settings.general:write'
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('plugins:returnurl:settings', kwargs={ return reverse('plugins:returnurl:settings', kwargs={
+1 -1
View File
@@ -113,7 +113,7 @@ class RuleViewSet(viewsets.ModelViewSet):
filterset_class = RuleFilter filterset_class = RuleFilter
ordering = ('id',) ordering = ('id',)
ordering_fields = ('id',) ordering_fields = ('id',)
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_queryset(self): def get_queryset(self):
return Rule.objects.filter(event=self.request.event) return Rule.objects.filter(event=self.request.event)
+1 -1
View File
@@ -79,7 +79,7 @@ def scheduled_mail_create(sender, **kwargs):
@receiver(nav_event, dispatch_uid="sendmail_nav") @receiver(nav_event, dispatch_uid="sendmail_nav")
def control_nav_import(sender, request=None, **kwargs): def control_nav_import(sender, request=None, **kwargs):
url = resolve(request.path_info) url = resolve(request.path_info)
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_orders', request=request): if not request.user.has_event_permission(request.organizer, request.event, 'event.orders:write', request=request):
return [] return []
return [ return [
{ {
+6 -6
View File
@@ -72,7 +72,7 @@ logger = logging.getLogger('pretix.plugins.sendmail')
class IndexView(EventPermissionRequiredMixin, TemplateView): class IndexView(EventPermissionRequiredMixin, TemplateView):
template_name = 'pretixplugins/sendmail/index.html' template_name = 'pretixplugins/sendmail/index.html'
permission = 'can_change_orders' permission = 'event.orders:write'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
from .signals import sendmail_view_classes from .signals import sendmail_view_classes
@@ -94,7 +94,7 @@ class IndexView(EventPermissionRequiredMixin, TemplateView):
class BaseSenderView(EventPermissionRequiredMixin, FormView): class BaseSenderView(EventPermissionRequiredMixin, FormView):
# These parameters usually SHOULD NOT be overridden # These parameters usually SHOULD NOT be overridden
template_name = 'pretixplugins/sendmail/send_form.html' template_name = 'pretixplugins/sendmail/send_form.html'
permission = 'can_change_orders' permission = 'event.orders:write'
# These parameters MUST be overridden by subclasses # These parameters MUST be overridden by subclasses
form_fragment_name = None form_fragment_name = None
@@ -523,7 +523,7 @@ class WaitinglistSendView(BaseSenderView):
class EmailHistoryView(EventPermissionRequiredMixin, ListView): class EmailHistoryView(EventPermissionRequiredMixin, ListView):
template_name = 'pretixplugins/sendmail/history.html' template_name = 'pretixplugins/sendmail/history.html'
permission = 'can_change_orders' permission = 'event.orders:write'
model = LogEntry model = LogEntry
context_object_name = 'logs' context_object_name = 'logs'
paginate_by = 5 paginate_by = 5
@@ -571,7 +571,7 @@ class EmailHistoryView(EventPermissionRequiredMixin, ListView):
class CreateRule(EventPermissionRequiredMixin, CreateView): class CreateRule(EventPermissionRequiredMixin, CreateView):
template_name = 'pretixplugins/sendmail/rule_create.html' template_name = 'pretixplugins/sendmail/rule_create.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
form_class = forms.RuleForm form_class = forms.RuleForm
model = Rule model = Rule
@@ -621,7 +621,7 @@ class UpdateRule(EventPermissionRequiredMixin, UpdateView):
model = Rule model = Rule
form_class = forms.RuleForm form_class = forms.RuleForm
template_name = 'pretixplugins/sendmail/rule_update.html' template_name = 'pretixplugins/sendmail/rule_update.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_object(self, queryset=None) -> Rule: def get_object(self, queryset=None) -> Rule:
return get_object_or_404( return get_object_or_404(
@@ -701,7 +701,7 @@ class ListRules(EventPermissionRequiredMixin, PaginationMixin, ListView):
class DeleteRule(EventPermissionRequiredMixin, DeleteView): class DeleteRule(EventPermissionRequiredMixin, DeleteView):
model = Rule model = Rule
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
template_name = 'pretixplugins/sendmail/rule_delete.html' template_name = 'pretixplugins/sendmail/rule_delete.html'
context_object_name = 'rule' context_object_name = 'rule'
+1 -1
View File
@@ -30,7 +30,7 @@ from pretix.control.signals import nav_event
@receiver(nav_event, dispatch_uid="statistics_nav") @receiver(nav_event, dispatch_uid="statistics_nav")
def control_nav_import(sender, request=None, **kwargs): def control_nav_import(sender, request=None, **kwargs):
url = resolve(request.path_info) url = resolve(request.path_info)
if not request.user.has_event_permission(request.organizer, request.event, 'can_view_orders', request=request): if not request.user.has_event_permission(request.organizer, request.event, 'event.orders:read', request=request):
return [] return []
return [ return [
{ {
+1 -1
View File
@@ -52,7 +52,7 @@ from pretix.plugins.statistics.signals import clear_cache
class IndexView(EventPermissionRequiredMixin, ChartContainingView, TemplateView): class IndexView(EventPermissionRequiredMixin, ChartContainingView, TemplateView):
template_name = 'pretixplugins/statistics/index.html' template_name = 'pretixplugins/statistics/index.html'
permission = 'can_view_orders' permission = 'event.orders:read'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
+2 -2
View File
@@ -473,7 +473,7 @@ def paymentintent_webhook(event, event_json, paymentintent_id, rso):
return HttpResponse(status=200) return HttpResponse(status=200)
@event_permission_required('can_change_event_settings') @event_permission_required('event.settings.general:write')
def oauth_disconnect(request, **kwargs): def oauth_disconnect(request, **kwargs):
if request.method != "POST": if request.method != "POST":
return render(request, 'pretixplugins/stripe/oauth_disconnect.html', {}) return render(request, 'pretixplugins/stripe/oauth_disconnect.html', {})
@@ -671,7 +671,7 @@ class ScaReturnView(StripeOrderView, View):
class OrganizerSettingsFormView(DecoupleMixin, OrganizerDetailViewMixin, AdministratorPermissionRequiredMixin, FormView): class OrganizerSettingsFormView(DecoupleMixin, OrganizerDetailViewMixin, AdministratorPermissionRequiredMixin, FormView):
model = Organizer model = Organizer
permission = 'can_change_organizer_settings' permission = 'organizer.settings.general:write'
form_class = OrganizerStripeSettingsForm form_class = OrganizerStripeSettingsForm
template_name = 'pretixplugins/stripe/organizer_stripe.html' template_name = 'pretixplugins/stripe/organizer_stripe.html'
+1 -1
View File
@@ -206,7 +206,7 @@ class RenderJobSerializer(serializers.Serializer):
class TicketRendererViewSet(viewsets.ViewSet): class TicketRendererViewSet(viewsets.ViewSet):
permission = 'can_view_orders' permission = 'event.orders:read'
def get_serializer_kwargs(self): def get_serializer_kwargs(self):
return {} return {}
+6 -6
View File
@@ -95,7 +95,7 @@ class EditorView(BaseEditorView):
class LayoutListView(EventPermissionRequiredMixin, ListView): class LayoutListView(EventPermissionRequiredMixin, ListView):
model = TicketLayout model = TicketLayout
permission = ('can_change_event_settings') permission = ('event.settings.general:write')
template_name = 'pretixplugins/ticketoutputpdf/index.html' template_name = 'pretixplugins/ticketoutputpdf/index.html'
context_object_name = 'layouts' context_object_name = 'layouts'
@@ -107,7 +107,7 @@ class LayoutCreate(EventPermissionRequiredMixin, CreateView):
model = TicketLayout model = TicketLayout
form_class = TicketLayoutForm form_class = TicketLayoutForm
template_name = 'pretixplugins/ticketoutputpdf/edit.html' template_name = 'pretixplugins/ticketoutputpdf/edit.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'layout' context_object_name = 'layout'
success_url = '/ignored' success_url = '/ignored'
@@ -157,7 +157,7 @@ class LayoutCreate(EventPermissionRequiredMixin, CreateView):
class LayoutSetDefault(EventPermissionRequiredMixin, DetailView): class LayoutSetDefault(EventPermissionRequiredMixin, DetailView):
model = TicketLayout model = TicketLayout
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get_object(self, queryset=None) -> TicketLayout: def get_object(self, queryset=None) -> TicketLayout:
try: try:
@@ -186,7 +186,7 @@ class LayoutSetDefault(EventPermissionRequiredMixin, DetailView):
class LayoutDelete(EventPermissionRequiredMixin, CompatDeleteView): class LayoutDelete(EventPermissionRequiredMixin, CompatDeleteView):
model = TicketLayout model = TicketLayout
template_name = 'pretixplugins/ticketoutputpdf/delete.html' template_name = 'pretixplugins/ticketoutputpdf/delete.html'
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
context_object_name = 'layout' context_object_name = 'layout'
def get_object(self, queryset=None) -> TicketLayout: def get_object(self, queryset=None) -> TicketLayout:
@@ -218,7 +218,7 @@ class LayoutDelete(EventPermissionRequiredMixin, CompatDeleteView):
class LayoutGetDefault(EventPermissionRequiredMixin, View): class LayoutGetDefault(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings' permission = 'event.settings.general:write'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
layout = self.request.event.ticket_layouts.get_or_create( layout = self.request.event.ticket_layouts.get_or_create(
@@ -304,7 +304,7 @@ class LayoutEditorView(BaseEditorView):
class OrderPrintDo(EventPermissionRequiredMixin, AsyncAction, View): class OrderPrintDo(EventPermissionRequiredMixin, AsyncAction, View):
task = tickets_create_pdf task = tickets_create_pdf
permission = 'can_view_orders' permission = 'event.orders:read'
known_errortypes = ['OrderError', 'ExportError'] known_errortypes = ['OrderError', 'ExportError']
def get_success_message(self, value): def get_success_message(self, value):
+1 -1
View File
@@ -30,7 +30,7 @@ from pretix.control.signals import nav_event
@receiver(nav_event, dispatch_uid='webcheckin_nav_event') @receiver(nav_event, dispatch_uid='webcheckin_nav_event')
def navbar_entry(sender, request, **kwargs): def navbar_entry(sender, request, **kwargs):
url = request.resolver_match url = request.resolver_match
if not request.user.has_event_permission(request.organizer, request.event, ('can_change_orders', 'can_checkin_orders'), request=request): if not request.user.has_event_permission(request.organizer, request.event, ('event.orders:write', 'event.orders:checkin'), request=request):
return [] return []
return [{ return [{
'label': mark_safe(_('Web Check-in') + ' <span class="label label-success">beta</span>'), 'label': mark_safe(_('Web Check-in') + ' <span class="label label-success">beta</span>'),
+1 -1
View File
@@ -26,7 +26,7 @@ from pretix.helpers.countries import CachedCountries
class IndexView(EventPermissionRequiredMixin, TemplateView): class IndexView(EventPermissionRequiredMixin, TemplateView):
permission = ('can_change_orders', 'can_checkin_orders') permission = ('event.orders:write', 'event.orders:checkin')
template_name = 'pretixplugins/webcheckin/index.html' template_name = 'pretixplugins/webcheckin/index.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
+1 -1
View File
@@ -255,7 +255,7 @@ class TicketPageMixin:
ctx['download_buttons'] = self.download_buttons ctx['download_buttons'] = self.download_buttons
ctx['backend_user'] = has_event_access_permission(self.request, 'can_view_orders') ctx['backend_user'] = has_event_access_permission(self.request, 'event.orders:read')
return ctx return ctx
+5 -2
View File
@@ -342,9 +342,10 @@ def test_event_scheduled_export_list_token(token_client, organizer, event, user,
team.limit_organizer_permissions = {"organizer.events:create": True} team.limit_organizer_permissions = {"organizer.events:create": True}
team.all_organizer_permissions = False team.all_organizer_permissions = False
team.all_event_permissions = False
team.save() team.save()
# Token can no longer sees it an gets error message # Token can no longer sees it and gets error message
resp = token_client.get('/api/v1/organizers/{}/events/{}/scheduled_exports/'.format(organizer.slug, event.slug)) resp = token_client.get('/api/v1/organizers/{}/events/{}/scheduled_exports/'.format(organizer.slug, event.slug))
assert resp.status_code == 403 assert resp.status_code == 403
@@ -363,7 +364,9 @@ def test_event_scheduled_export_list_user(user_client, organizer, event, user, t
resp = user_client.get('/api/v1/organizers/{}/events/{}/scheduled_exports/'.format(organizer.slug, event.slug)) resp = user_client.get('/api/v1/organizers/{}/events/{}/scheduled_exports/'.format(organizer.slug, event.slug))
assert [res] == resp.data['results'] assert [res] == resp.data['results']
team.limit_event_permissions["event.settings.general:write"] = False team.limit_organizer_permissions = {"organizer.events:create": True}
team.all_organizer_permissions = False
team.all_event_permissions = False
team.save() team.save()
# Owner still can # Owner still can
+191 -192
View File
@@ -43,239 +43,238 @@ from pretix.base.models import Organizer
event_urls = [ event_urls = [
(None, ''), (None, ''),
(None, 'categories/'), (None, 'categories/'),
('can_view_orders', 'invoices/'), ('event.orders:read', 'invoices/'),
(None, 'items/'), (None, 'items/'),
('can_view_orders', 'orders/'), ('event.orders:read', 'orders/'),
('can_view_orders', 'orderpositions/'), ('event.orders:read', 'orderpositions/'),
(None, 'questions/'), (None, 'questions/'),
(None, 'quotas/'), (None, 'quotas/'),
('can_view_vouchers', 'vouchers/'), ('event.vouchers:read', 'vouchers/'),
(None, 'subevents/'), (None, 'subevents/'),
(None, 'taxrules/'), (None, 'taxrules/'),
('can_view_orders', 'waitinglistentries/'), ('event.orders:read', 'waitinglistentries/'),
('can_view_orders', 'checkinlists/'), ('event.orders:read', 'checkinlists/'),
('can_view_orders', 'checkins/'), ('event.orders:read', 'checkins/'),
(None, 'seats/'), (None, 'seats/'),
] ]
event_permission_sub_urls = [ event_permission_sub_urls = [
('get', 'can_change_event_settings', 'settings/', 200), ('get', 'event.settings.general:write', 'settings/', 200),
('patch', 'can_change_event_settings', 'settings/', 200), ('patch', 'event.settings.general:write', 'settings/', 200),
('get', 'can_view_orders', 'revokedsecrets/', 200), ('get', 'event.orders:read', 'revokedsecrets/', 200),
('get', 'can_view_orders', 'revokedsecrets/1/', 404), ('get', 'event.orders:read', 'revokedsecrets/1/', 404),
('get', 'can_view_orders', 'blockedsecrets/', 200), ('get', 'event.orders:read', 'blockedsecrets/', 200),
('get', 'can_view_orders', 'blockedsecrets/1/', 404), ('get', 'event.orders:read', 'blockedsecrets/1/', 404),
('get', 'can_view_orders', 'transactions/', 200), ('get', 'event.orders:read', 'transactions/', 200),
('get', 'can_view_orders', 'transactions/1/', 404), ('get', 'event.orders:read', 'transactions/1/', 404),
('get', 'can_view_orders', 'orders/', 200), ('get', 'event.orders:read', 'orders/', 200),
('get', 'can_view_orders', 'orderpositions/', 200), ('get', 'event.orders:read', 'orderpositions/', 200),
('delete', 'can_change_orders', 'orderpositions/1/', 404), ('delete', 'event.orders:write', 'orderpositions/1/', 404),
('post', 'can_change_orders', 'orderpositions/1/price_calc/', 404), ('post', 'event.orders:write', 'orderpositions/1/price_calc/', 404),
('get', 'can_view_vouchers', 'vouchers/', 200), ('get', 'event.vouchers:read', 'vouchers/', 200),
('get', 'can_view_orders', 'invoices/', 200), ('get', 'event.orders:read', 'invoices/', 200),
('get', 'can_view_orders', 'invoices/1/', 404), ('get', 'event.orders:read', 'invoices/1/', 404),
('post', 'can_change_orders', 'invoices/1/regenerate/', 404), ('post', 'event.orders:write', 'invoices/1/regenerate/', 404),
('post', 'can_change_orders', 'invoices/1/reissue/', 404), ('post', 'event.orders:write', 'invoices/1/reissue/', 404),
('post', 'can_change_orders', 'invoices/1/retransmit/', 404), ('post', 'event.orders:write', 'invoices/1/retransmit/', 404),
('get', 'can_view_orders', 'waitinglistentries/', 200), ('get', 'event.orders:read', 'waitinglistentries/', 200),
('get', 'can_view_orders', 'waitinglistentries/1/', 404), ('get', 'event.orders:read', 'waitinglistentries/1/', 404),
('post', 'can_change_orders', 'waitinglistentries/', 400), ('post', 'event.orders:write', 'waitinglistentries/', 400),
('delete', 'can_change_orders', 'waitinglistentries/1/', 404), ('delete', 'event.orders:write', 'waitinglistentries/1/', 404),
('patch', 'can_change_orders', 'waitinglistentries/1/', 404), ('patch', 'event.orders:write', 'waitinglistentries/1/', 404),
('put', 'can_change_orders', 'waitinglistentries/1/', 404), ('put', 'event.orders:write', 'waitinglistentries/1/', 404),
('post', 'can_change_orders', 'waitinglistentries/1/send_voucher/', 404), ('post', 'event.orders:write', 'waitinglistentries/1/send_voucher/', 404),
('get', None, 'categories/', 200), ('get', None, 'categories/', 200),
('get', None, 'items/', 200), ('get', None, 'items/', 200),
('get', None, 'questions/', 200), ('get', None, 'questions/', 200),
('get', None, 'quotas/', 200), ('get', None, 'quotas/', 200),
('get', None, 'discounts/', 200), ('get', None, 'discounts/', 200),
('post', 'can_change_items', 'items/', 400), ('post', 'event.items:write', 'items/', 400),
('get', None, 'items/1/', 404), ('get', None, 'items/1/', 404),
('put', 'can_change_items', 'items/1/', 404), ('put', 'event.items:write', 'items/1/', 404),
('patch', 'can_change_items', 'items/1/', 404), ('patch', 'event.items:write', 'items/1/', 404),
('delete', 'can_change_items', 'items/1/', 404), ('delete', 'event.items:write', 'items/1/', 404),
('post', 'can_change_items', 'categories/', 400), ('post', 'event.items:write', 'categories/', 400),
('get', None, 'categories/1/', 404), ('get', None, 'categories/1/', 404),
('put', 'can_change_items', 'categories/1/', 404), ('put', 'event.items:write', 'categories/1/', 404),
('patch', 'can_change_items', 'categories/1/', 404), ('patch', 'event.items:write', 'categories/1/', 404),
('delete', 'can_change_items', 'categories/1/', 404), ('delete', 'event.items:write', 'categories/1/', 404),
('post', 'can_change_items', 'discounts/', 400), ('post', 'event.items:write', 'discounts/', 400),
('get', None, 'discounts/1/', 404), ('get', None, 'discounts/1/', 404),
('put', 'can_change_items', 'discounts/1/', 404), ('put', 'event.items:write', 'discounts/1/', 404),
('patch', 'can_change_items', 'discounts/1/', 404), ('patch', 'event.items:write', 'discounts/1/', 404),
('delete', 'can_change_items', 'discounts/1/', 404), ('delete', 'event.items:write', 'discounts/1/', 404),
('post', 'can_change_items', 'items/1/variations/', 404), ('post', 'event.items:write', 'items/1/variations/', 404),
('get', None, 'items/1/variations/', 404), ('get', None, 'items/1/variations/', 404),
('get', None, 'items/1/variations/1/', 404), ('get', None, 'items/1/variations/1/', 404),
('put', 'can_change_items', 'items/1/variations/1/', 404), ('put', 'event.items:write', 'items/1/variations/1/', 404),
('patch', 'can_change_items', 'items/1/variations/1/', 404), ('patch', 'event.items:write', 'items/1/variations/1/', 404),
('delete', 'can_change_items', 'items/1/variations/1/', 404), ('delete', 'event.items:write', 'items/1/variations/1/', 404),
('get', None, 'items/1/addons/', 404), ('get', None, 'items/1/addons/', 404),
('get', None, 'items/1/addons/1/', 404), ('get', None, 'items/1/addons/1/', 404),
('post', 'can_change_items', 'items/1/addons/', 404), ('post', 'event.items:write', 'items/1/addons/', 404),
('put', 'can_change_items', 'items/1/addons/1/', 404), ('put', 'event.items:write', 'items/1/addons/1/', 404),
('patch', 'can_change_items', 'items/1/addons/1/', 404), ('patch', 'event.items:write', 'items/1/addons/1/', 404),
('delete', 'can_change_items', 'items/1/addons/1/', 404), ('delete', 'event.items:write', 'items/1/addons/1/', 404),
('get', None, 'subevents/', 200), ('get', None, 'subevents/', 200),
('get', None, 'subevents/1/', 404), ('get', None, 'subevents/1/', 404),
('get', None, 'taxrules/', 200), ('get', None, 'taxrules/', 200),
('get', None, 'taxrules/1/', 404), ('get', None, 'taxrules/1/', 404),
('post', 'can_change_event_settings', 'taxrules/', 400), ('post', 'event.settings.general:write', 'taxrules/', 400),
('put', 'can_change_event_settings', 'taxrules/1/', 404), ('put', 'event.settings.general:write', 'taxrules/1/', 404),
('patch', 'can_change_event_settings', 'taxrules/1/', 404), ('patch', 'event.settings.general:write', 'taxrules/1/', 404),
('delete', 'can_change_event_settings', 'taxrules/1/', 404), ('delete', 'event.settings.general:write', 'taxrules/1/', 404),
('get', 'can_change_event_settings', 'sendmail_rules/', 200), ('get', 'event.settings.general:write', 'sendmail_rules/', 200),
('get', 'can_change_event_settings', 'sendmail_rules/1/', 404), ('get', 'event.settings.general:write', 'sendmail_rules/1/', 404),
('post', 'can_change_event_settings', 'sendmail_rules/', 400), ('post', 'event.settings.general:write', 'sendmail_rules/', 400),
('put', 'can_change_event_settings', 'sendmail_rules/1/', 404), ('put', 'event.settings.general:write', 'sendmail_rules/1/', 404),
('patch', 'can_change_event_settings', 'sendmail_rules/1/', 404), ('patch', 'event.settings.general:write', 'sendmail_rules/1/', 404),
('delete', 'can_change_event_settings', 'sendmail_rules/1/', 404), ('delete', 'event.settings.general:write', 'sendmail_rules/1/', 404),
('get', 'can_view_vouchers', 'vouchers/', 200), ('get', 'event.vouchers:read', 'vouchers/', 200),
('get', 'can_view_vouchers', 'vouchers/1/', 404), ('get', 'event.vouchers:read', 'vouchers/1/', 404),
('post', 'can_change_vouchers', 'vouchers/', 201), ('post', 'event.vouchers:write', 'vouchers/', 201),
('put', 'can_change_vouchers', 'vouchers/1/', 404), ('put', 'event.vouchers:write', 'vouchers/1/', 404),
('patch', 'can_change_vouchers', 'vouchers/1/', 404), ('patch', 'event.vouchers:write', 'vouchers/1/', 404),
('delete', 'can_change_vouchers', 'vouchers/1/', 404), ('delete', 'event.vouchers:write', 'vouchers/1/', 404),
('get', None, 'quotas/', 200), ('get', None, 'quotas/', 200),
('get', None, 'quotas/1/', 404), ('get', None, 'quotas/1/', 404),
('post', 'can_change_items', 'quotas/', 400), ('post', 'event.items:write', 'quotas/', 400),
('put', 'can_change_items', 'quotas/1/', 404), ('put', 'event.items:write', 'quotas/1/', 404),
('patch', 'can_change_items', 'quotas/1/', 404), ('patch', 'event.items:write', 'quotas/1/', 404),
('delete', 'can_change_items', 'quotas/1/', 404), ('delete', 'event.items:write', 'quotas/1/', 404),
('get', None, 'questions/', 200), ('get', None, 'questions/', 200),
('get', None, 'questions/1/', 404), ('get', None, 'questions/1/', 404),
('post', 'can_change_items', 'questions/', 400), ('post', 'event.items:write', 'questions/', 400),
('put', 'can_change_items', 'questions/1/', 404), ('put', 'event.items:write', 'questions/1/', 404),
('patch', 'can_change_items', 'questions/1/', 404), ('patch', 'event.items:write', 'questions/1/', 404),
('delete', 'can_change_items', 'questions/1/', 404), ('delete', 'event.items:write', 'questions/1/', 404),
('get', None, 'questions/1/options/', 404), ('get', None, 'questions/1/options/', 404),
('get', None, 'questions/1/options/1/', 404), ('get', None, 'questions/1/options/1/', 404),
('put', 'can_change_items', 'questions/1/options/1/', 404), ('put', 'event.items:write', 'questions/1/options/1/', 404),
('patch', 'can_change_items', 'questions/1/options/1/', 404), ('patch', 'event.items:write', 'questions/1/options/1/', 404),
('delete', 'can_change_items', 'questions/1/options/1/', 404), ('delete', 'event.items:write', 'questions/1/options/1/', 404),
('post', 'can_change_orders', 'orders/', 400), ('post', 'event.orders:write', 'orders/', 400),
('patch', 'can_change_orders', 'orders/ABC12/', 404), ('patch', 'event.orders:write', 'orders/ABC12/', 404),
('post', 'can_change_orders', 'orders/ABC12/mark_paid/', 404), ('post', 'event.orders:write', 'orders/ABC12/mark_paid/', 404),
('post', 'can_change_orders', 'orders/ABC12/mark_pending/', 404), ('post', 'event.orders:write', 'orders/ABC12/mark_pending/', 404),
('post', 'can_change_orders', 'orders/ABC12/mark_expired/', 404), ('post', 'event.orders:write', 'orders/ABC12/mark_expired/', 404),
('post', 'can_change_orders', 'orders/ABC12/mark_canceled/', 404), ('post', 'event.orders:write', 'orders/ABC12/mark_canceled/', 404),
('post', 'can_change_orders', 'orders/ABC12/approve/', 404), ('post', 'event.orders:write', 'orders/ABC12/approve/', 404),
('post', 'can_change_orders', 'orders/ABC12/deny/', 404), ('post', 'event.orders:write', 'orders/ABC12/deny/', 404),
('post', 'can_change_orders', 'orders/ABC12/extend/', 400), ('post', 'event.orders:write', 'orders/ABC12/extend/', 400),
('post', 'can_change_orders', 'orders/ABC12/create_invoice/', 404), ('post', 'event.orders:write', 'orders/ABC12/create_invoice/', 404),
('post', 'can_change_orders', 'orders/ABC12/resend_link/', 404), ('post', 'event.orders:write', 'orders/ABC12/resend_link/', 404),
('post', 'can_change_orders', 'orders/ABC12/regenerate_secrets/', 404), ('post', 'event.orders:write', 'orders/ABC12/regenerate_secrets/', 404),
('get', 'can_view_orders', 'orders/ABC12/payments/', 404), ('get', 'event.orders:read', 'orders/ABC12/payments/', 404),
('get', 'can_view_orders', 'orders/ABC12/payments/1/', 404), ('get', 'event.orders:read', 'orders/ABC12/payments/1/', 404),
('get', 'can_view_orders', 'orders/ABC12/refunds/', 404), ('get', 'event.orders:read', 'orders/ABC12/refunds/', 404),
('get', 'can_view_orders', 'orders/ABC12/refunds/1/', 404), ('get', 'event.orders:read', 'orders/ABC12/refunds/1/', 404),
('post', 'can_change_orders', 'orders/ABC12/payments/1/confirm/', 404), ('post', 'event.orders:write', 'orders/ABC12/payments/1/confirm/', 404),
('post', 'can_change_orders', 'orders/ABC12/payments/1/refund/', 404), ('post', 'event.orders:write', 'orders/ABC12/payments/1/refund/', 404),
('post', 'can_change_orders', 'orders/ABC12/payments/1/cancel/', 404), ('post', 'event.orders:write', 'orders/ABC12/payments/1/cancel/', 404),
('post', 'can_change_orders', 'orders/ABC12/refunds/1/cancel/', 404), ('post', 'event.orders:write', 'orders/ABC12/refunds/1/cancel/', 404),
('post', 'can_change_orders', 'orders/ABC12/refunds/1/process/', 404), ('post', 'event.orders:write', 'orders/ABC12/refunds/1/process/', 404),
('post', 'can_change_orders', 'orders/ABC12/refunds/1/done/', 404), ('post', 'event.orders:write', 'orders/ABC12/refunds/1/done/', 404),
('get', 'can_view_orders', 'checkinlists/', 200), ('get', 'event.orders:read', 'checkinlists/', 200),
('post', 'can_change_orders', 'checkinlists/1/failed_checkins/', 400), ('post', 'event.orders:write', 'checkinlists/1/failed_checkins/', 400),
('get', 'can_view_orders', 'checkins/', 200), ('get', 'event.orders:read', 'checkins/', 200),
('get', 'can_view_orders', 'checkins/1/', 404), ('get', 'event.orders:read', 'checkins/1/', 404),
('post', 'can_change_event_settings', 'checkinlists/', 400), ('post', 'event.settings.general:write', 'checkinlists/', 400),
('put', 'can_change_event_settings', 'checkinlists/1/', 404), ('put', 'event.settings.general:write', 'checkinlists/1/', 404),
('patch', 'can_change_event_settings', 'checkinlists/1/', 404), ('patch', 'event.settings.general:write', 'checkinlists/1/', 404),
('delete', 'can_change_event_settings', 'checkinlists/1/', 404), ('delete', 'event.settings.general:write', 'checkinlists/1/', 404),
('get', 'can_view_orders', 'checkinlists/1/positions/', 404), ('get', 'event.orders:read', 'checkinlists/1/positions/', 404),
('post', 'can_change_orders', 'checkinlists/1/positions/3/redeem/', 404), ('post', 'event.orders:write', 'checkinlists/1/positions/3/redeem/', 404),
('post', 'can_create_events', 'clone/', 400), ('post', 'organizer.events:create', 'clone/', 400),
('get', 'can_view_orders', 'cartpositions/', 200), ('get', 'event.orders:read', 'cartpositions/', 200),
('get', 'can_view_orders', 'cartpositions/1/', 404), ('get', 'event.orders:read', 'cartpositions/1/', 404),
('post', 'can_change_orders', 'cartpositions/', 400), ('post', 'event.orders:write', 'cartpositions/', 400),
('delete', 'can_change_orders', 'cartpositions/1/', 404), ('delete', 'event.orders:write', 'cartpositions/1/', 404),
('post', 'can_view_orders', 'exporters/invoicedata/run/', 400), ('post', 'event.orders:read', 'exporters/invoicedata/run/', 400),
('get', 'can_view_orders', 'exporters/invoicedata/download/bc3f9884-26ee-425b-8636-80613f84b6fa/3cb49ae6-eda3' ('get', 'event.orders:read', 'exporters/invoicedata/download/bc3f9884-26ee-425b-8636-80613f84b6fa/3cb49ae6-eda3-4605-814e-099e23777b36/', 404),
'-4605-814e-099e23777b36/', 404),
('get', None, 'item_meta_properties/', 200), ('get', None, 'item_meta_properties/', 200),
('get', None, 'item_meta_properties/0/', 404), ('get', None, 'item_meta_properties/0/', 404),
('post', 'can_change_event_settings', 'item_meta_properties/', 400), ('post', 'event.settings.general:write', 'item_meta_properties/', 400),
('patch', 'can_change_event_settings', 'item_meta_properties/0/', 404), ('patch', 'event.settings.general:write', 'item_meta_properties/0/', 404),
('delete', 'can_change_event_settings', 'item_meta_properties/0/', 404), ('delete', 'event.settings.general:write', 'item_meta_properties/0/', 404),
('get', None, 'seats/', 200), ('get', None, 'seats/', 200),
('get', 'can_view_orders', 'seats/?expand=orderposition', 200), ('get', 'event.orders:read', 'seats/?expand=orderposition', 200),
('get', 'can_view_orders', 'seats/?expand=cartposition', 200), ('get', 'event.orders:read', 'seats/?expand=cartposition', 200),
('get', 'can_view_vouchers', 'seats/?expand=voucher', 200), ('get', 'event.vouchers:read', 'seats/?expand=voucher', 200),
('get', None, 'seats/1/', 404), ('get', None, 'seats/1/', 404),
('patch', 'can_change_event_settings', 'seats/1/', 404), ('patch', 'event.settings.general:write', 'seats/1/', 404),
] ]
org_permission_sub_urls = [ org_permission_sub_urls = [
('patch', 'can_change_organizer_settings', '', 200), ('patch', 'organizer.settings.general:write', '', 200),
('patch', 'can_change_organizer_settings', 'settings/', 200), ('patch', 'organizer.settings.general:write', 'settings/', 200),
('get', 'can_change_organizer_settings', 'webhooks/', 200), ('get', 'organizer.settings.general:write', 'webhooks/', 200),
('post', 'can_change_organizer_settings', 'webhooks/', 400), ('post', 'organizer.settings.general:write', 'webhooks/', 400),
('get', 'can_change_organizer_settings', 'webhooks/1/', 404), ('get', 'organizer.settings.general:write', 'webhooks/1/', 404),
('put', 'can_change_organizer_settings', 'webhooks/1/', 404), ('put', 'organizer.settings.general:write', 'webhooks/1/', 404),
('patch', 'can_change_organizer_settings', 'webhooks/1/', 404), ('patch', 'organizer.settings.general:write', 'webhooks/1/', 404),
('delete', 'can_change_organizer_settings', 'webhooks/1/', 404), ('delete', 'organizer.settings.general:write', 'webhooks/1/', 404),
('get', 'can_manage_customers', 'customers/', 200), ('get', 'organizer.customers:write', 'customers/', 200),
('post', 'can_manage_customers', 'customers/', 201), ('post', 'organizer.customers:write', 'customers/', 201),
('get', 'can_manage_customers', 'customers/1/', 404), ('get', 'organizer.customers:write', 'customers/1/', 404),
('patch', 'can_manage_customers', 'customers/1/', 404), ('patch', 'organizer.customers:write', 'customers/1/', 404),
('post', 'can_manage_customers', 'customers/1/anonymize/', 404), ('post', 'organizer.customers:write', 'customers/1/anonymize/', 404),
('put', 'can_manage_customers', 'customers/1/', 404), ('put', 'organizer.customers:write', 'customers/1/', 404),
('delete', 'can_manage_customers', 'customers/1/', 404), ('delete', 'organizer.customers:write', 'customers/1/', 404),
('get', 'can_manage_customers', 'memberships/', 200), ('get', 'organizer.customers:write', 'memberships/', 200),
('post', 'can_manage_customers', 'memberships/', 400), ('post', 'organizer.customers:write', 'memberships/', 400),
('get', 'can_manage_customers', 'memberships/1/', 404), ('get', 'organizer.customers:write', 'memberships/1/', 404),
('patch', 'can_manage_customers', 'memberships/1/', 404), ('patch', 'organizer.customers:write', 'memberships/1/', 404),
('put', 'can_manage_customers', 'memberships/1/', 404), ('put', 'organizer.customers:write', 'memberships/1/', 404),
('delete', 'can_manage_customers', 'memberships/1/', 404), ('delete', 'organizer.customers:write', 'memberships/1/', 404),
('get', 'can_change_organizer_settings', 'saleschannels/', 200), ('get', 'organizer.settings.general:write', 'saleschannels/', 200),
('post', 'can_change_organizer_settings', 'saleschannels/', 400), ('post', 'organizer.settings.general:write', 'saleschannels/', 400),
('get', 'can_change_organizer_settings', 'saleschannels/web/', 200), ('get', 'organizer.settings.general:write', 'saleschannels/web/', 200),
('patch', 'can_change_organizer_settings', 'saleschannels/web/', 200), ('patch', 'organizer.settings.general:write', 'saleschannels/web/', 200),
('put', 'can_change_organizer_settings', 'saleschannels/api.1/', 404), ('put', 'organizer.settings.general:write', 'saleschannels/api.1/', 404),
('delete', 'can_change_organizer_settings', 'saleschannels/api.1/', 404), ('delete', 'organizer.settings.general:write', 'saleschannels/api.1/', 404),
('get', 'can_change_organizer_settings', 'membershiptypes/', 200), ('get', 'organizer.settings.general:write', 'membershiptypes/', 200),
('post', 'can_change_organizer_settings', 'membershiptypes/', 400), ('post', 'organizer.settings.general:write', 'membershiptypes/', 400),
('get', 'can_change_organizer_settings', 'membershiptypes/1/', 404), ('get', 'organizer.settings.general:write', 'membershiptypes/1/', 404),
('patch', 'can_change_organizer_settings', 'membershiptypes/1/', 404), ('patch', 'organizer.settings.general:write', 'membershiptypes/1/', 404),
('put', 'can_change_organizer_settings', 'membershiptypes/1/', 404), ('put', 'organizer.settings.general:write', 'membershiptypes/1/', 404),
('delete', 'can_change_organizer_settings', 'membershiptypes/1/', 404), ('delete', 'organizer.settings.general:write', 'membershiptypes/1/', 404),
('get', 'can_manage_gift_cards', 'giftcards/', 200), ('get', 'organizer.giftcards:write', 'giftcards/', 200),
('post', 'can_manage_gift_cards', 'giftcards/', 400), ('post', 'organizer.giftcards:write', 'giftcards/', 400),
('get', 'can_manage_gift_cards', 'giftcards/1/', 404), ('get', 'organizer.giftcards:write', 'giftcards/1/', 404),
('put', 'can_manage_gift_cards', 'giftcards/1/', 404), ('put', 'organizer.giftcards:write', 'giftcards/1/', 404),
('patch', 'can_manage_gift_cards', 'giftcards/1/', 404), ('patch', 'organizer.giftcards:write', 'giftcards/1/', 404),
('get', 'can_manage_gift_cards', 'giftcards/1/transactions/', 404), ('get', 'organizer.giftcards:write', 'giftcards/1/transactions/', 404),
('get', 'can_manage_gift_cards', 'giftcards/1/transactions/1/', 404), ('get', 'organizer.giftcards:write', 'giftcards/1/transactions/1/', 404),
('get', 'can_change_organizer_settings', 'devices/', 200), ('get', 'organizer.settings.general:write', 'devices/', 200),
('post', 'can_change_organizer_settings', 'devices/', 400), ('post', 'organizer.settings.general:write', 'devices/', 400),
('get', 'can_change_organizer_settings', 'devices/1/', 404), ('get', 'organizer.settings.general:write', 'devices/1/', 404),
('put', 'can_change_organizer_settings', 'devices/1/', 404), ('put', 'organizer.settings.general:write', 'devices/1/', 404),
('patch', 'can_change_organizer_settings', 'devices/1/', 404), ('patch', 'organizer.settings.general:write', 'devices/1/', 404),
('get', 'can_change_teams', 'teams/', 200), ('get', 'organizer.teams:write', 'teams/', 200),
('post', 'can_change_teams', 'teams/', 400), ('post', 'organizer.teams:write', 'teams/', 400),
('get', 'can_change_teams', 'teams/{team_id}/', 200), ('get', 'organizer.teams:write', 'teams/{team_id}/', 200),
('put', 'can_change_teams', 'teams/{team_id}/', 400), ('put', 'organizer.teams:write', 'teams/{team_id}/', 400),
('patch', 'can_change_teams', 'teams/{team_id}/', 200), ('patch', 'organizer.teams:write', 'teams/{team_id}/', 200),
('get', 'can_change_teams', 'teams/{team_id}/members/', 200), ('get', 'organizer.teams:write', 'teams/{team_id}/members/', 200),
('delete', 'can_change_teams', 'teams/{team_id}/members/2/', 404), ('delete', 'organizer.teams:write', 'teams/{team_id}/members/2/', 404),
('get', 'can_change_teams', 'teams/{team_id}/invites/', 200), ('get', 'organizer.teams:write', 'teams/{team_id}/invites/', 200),
('get', 'can_change_teams', 'teams/{team_id}/invites/2/', 404), ('get', 'organizer.teams:write', 'teams/{team_id}/invites/2/', 404),
('delete', 'can_change_teams', 'teams/{team_id}/invites/2/', 404), ('delete', 'organizer.teams:write', 'teams/{team_id}/invites/2/', 404),
('post', 'can_change_teams', 'teams/{team_id}/invites/', 400), ('post', 'organizer.teams:write', 'teams/{team_id}/invites/', 400),
('get', 'can_change_teams', 'teams/{team_id}/tokens/', 200), ('get', 'organizer.teams:write', 'teams/{team_id}/tokens/', 200),
('get', 'can_change_teams', 'teams/{team_id}/tokens/0/', 404), ('get', 'organizer.teams:write', 'teams/{team_id}/tokens/0/', 404),
('delete', 'can_change_teams', 'teams/{team_id}/tokens/0/', 404), ('delete', 'organizer.teams:write', 'teams/{team_id}/tokens/0/', 404),
('post', 'can_change_teams', 'teams/{team_id}/tokens/', 400), ('post', 'organizer.teams:write', 'teams/{team_id}/tokens/', 400),
('get', 'can_manage_reusable_media', 'reusablemedia/1/', 404), ('get', 'organizer.reusablemedia:read', 'reusablemedia/1/', 404),
] ]
event_permission_root_urls = [ event_permission_root_urls = [
('post', 'can_create_events', 400), ('post', 'organizer.events:create', 400),
('put', 'can_change_event_settings', 400), ('put', 'event.settings.general:write', 400),
('patch', 'can_change_event_settings', 200), ('patch', 'event.settings.general:write', 200),
('delete', 'can_change_event_settings', 204), ('delete', 'event.settings.general:write', 204),
] ]
@@ -537,7 +536,7 @@ def test_update_session_activity(user_client, team, organizer, event):
@pytest.mark.django_db @pytest.mark.django_db
@pytest.mark.parametrize("urlset", event_permission_sub_urls) @pytest.mark.parametrize("urlset", event_permission_sub_urls)
def test_device_subresource_permission_check(device_client, device, organizer, event, urlset): def test_device_subresource_permission_check(device_client, device, organizer, event, urlset):
if urlset == ('get', 'can_change_event_settings', 'settings/', 200): if urlset == ('get', 'event.settings.general:write', 'settings/', 200):
return return
resp = getattr(device_client, urlset[0])('/api/v1/organizers/{}/events/{}/{}'.format( resp = getattr(device_client, urlset[0])('/api/v1/organizers/{}/events/{}/{}'.format(
organizer.slug, event.slug, urlset[2])) organizer.slug, event.slug, urlset[2]))
+36 -36
View File
@@ -117,52 +117,52 @@ def test_any_event_permission_all(event, user):
@pytest.mark.django_db @pytest.mark.django_db
def test_specific_event_permission_limited(event, user): def test_specific_event_permission_limited(event, user):
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
team = Team.objects.create(organizer=event.organizer, limit_event_permissions={"event.orders:write": True}) team = Team.objects.create(organizer=event.organizer, limit_event_permissions={"event.orders:write": True})
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
team.members.add(user) team.members.add(user)
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
team.limit_events.add(event) team.limit_events.add(event)
user._teamcache = {} user._teamcache = {}
assert user.has_event_permission(event.organizer, event, 'can_change_orders') assert user.has_event_permission(event.organizer, event, 'event.orders:write')
assert not user.has_event_permission(event.organizer, event, 'can_change_event_settings') assert not user.has_event_permission(event.organizer, event, 'event.settings.general:write')
assert user.has_event_permission(event.organizer, event, ('can_change_orders', 'can_change_event_settings')) assert user.has_event_permission(event.organizer, event, ('event.orders:write', 'event.settings.general:write'))
assert not user.has_event_permission(event.organizer, event, ('can_change_teams', 'can_change_event_settings')) assert not user.has_event_permission(event.organizer, event, ('organizer.teams:write', 'event.settings.general:write'))
team.limit_event_permissions = {} team.limit_event_permissions = {}
team.save() team.save()
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
@pytest.mark.django_db @pytest.mark.django_db
def test_specific_event_permission_all(event, user): def test_specific_event_permission_all(event, user):
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
team = Team.objects.create(organizer=event.organizer, limit_event_permissions={"event.orders:write": True}) team = Team.objects.create(organizer=event.organizer, limit_event_permissions={"event.orders:write": True})
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
team.members.add(user) team.members.add(user)
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
team.all_events = True team.all_events = True
team.save() team.save()
user._teamcache = {} user._teamcache = {}
assert user.has_event_permission(event.organizer, event, 'can_change_orders') assert user.has_event_permission(event.organizer, event, 'event.orders:write')
team.limit_event_permissions = {} team.limit_event_permissions = {}
team.save() team.save()
user._teamcache = {} user._teamcache = {}
assert not user.has_event_permission(event.organizer, event, 'can_change_orders') assert not user.has_event_permission(event.organizer, event, 'event.orders:write')
@pytest.mark.django_db @pytest.mark.django_db
@@ -180,12 +180,12 @@ def test_event_permissions_multiple_teams(event, user):
team2.limit_events.add(event) team2.limit_events.add(event)
team3.limit_events.add(event2) team3.limit_events.add(event2)
assert user.has_event_permission(event.organizer, event, 'can_change_orders') assert user.has_event_permission(event.organizer, event, 'event.orders:write')
assert user.has_event_permission(event.organizer, event, 'can_change_vouchers') assert user.has_event_permission(event.organizer, event, 'event.vouchers:write')
assert not user.has_event_permission(event.organizer, event, 'can_change_event_settings') assert not user.has_event_permission(event.organizer, event, 'event.settings.general:write')
assert user.get_event_permission_set(event.organizer, event) == {'can_change_orders', 'can_change_vouchers'} assert user.get_event_permission_set(event.organizer, event) == {'event.orders:write', 'event.vouchers:write'}
assert user.get_event_permission_set(event.organizer, event2) == {'can_change_orders', 'can_change_event_settings', assert user.get_event_permission_set(event.organizer, event2) == {'event.orders:write', 'event.settings.general:write',
'can_change_settings'} 'event.settings.general:write'}
@pytest.mark.django_db @pytest.mark.django_db
@@ -205,16 +205,16 @@ def test_any_organizer_permission(event, user):
@pytest.mark.django_db @pytest.mark.django_db
def test_specific_organizer_permission(event, user): def test_specific_organizer_permission(event, user):
user._teamcache = {} user._teamcache = {}
assert not user.has_organizer_permission(event.organizer, 'can_create_events') assert not user.has_organizer_permission(event.organizer, 'organizer.events:create')
team = Team.objects.create(organizer=event.organizer, limit_organizer_permissions={"organizer.events:create": True}) team = Team.objects.create(organizer=event.organizer, limit_organizer_permissions={"organizer.events:create": True})
user._teamcache = {} user._teamcache = {}
assert not user.has_organizer_permission(event.organizer, 'can_create_events') assert not user.has_organizer_permission(event.organizer, 'organizer.events:create')
team.members.add(user) team.members.add(user)
user._teamcache = {} user._teamcache = {}
assert user.has_organizer_permission(event.organizer, 'can_create_events') assert user.has_organizer_permission(event.organizer, 'organizer.events:create')
assert user.has_organizer_permission(event.organizer, ('can_create_events', 'can_change_organizer_settings')) assert user.has_organizer_permission(event.organizer, ('organizer.events:create', 'organizer.settings.general:write'))
@pytest.mark.django_db @pytest.mark.django_db
@@ -227,19 +227,19 @@ def test_organizer_permissions_multiple_teams(event, user):
team3 = Team.objects.create(organizer=orga2, limit_organizer_permissions={"organizer.teams:write": True}) team3 = Team.objects.create(organizer=orga2, limit_organizer_permissions={"organizer.teams:write": True})
team3.members.add(user) team3.members.add(user)
assert user.has_organizer_permission(event.organizer, 'can_create_events') assert user.has_organizer_permission(event.organizer, 'organizer.events:create')
assert user.has_organizer_permission(event.organizer, 'can_change_organizer_settings') assert user.has_organizer_permission(event.organizer, 'organizer.settings.general:write')
assert not user.has_organizer_permission(event.organizer, 'can_change_teams') assert not user.has_organizer_permission(event.organizer, 'organizer.teams:write')
assert user.get_organizer_permission_set(event.organizer) == {'can_create_events', 'can_change_organizer_settings'} assert user.get_organizer_permission_set(event.organizer) == {'organizer.events:create', 'organizer.settings.general:write'}
assert user.get_organizer_permission_set(orga2) == {'can_change_teams'} assert user.get_organizer_permission_set(orga2) == {'organizer.teams:write'}
@pytest.mark.django_db @pytest.mark.django_db
def test_superuser(event, admin, admin_request): def test_superuser(event, admin, admin_request):
assert admin.has_organizer_permission(event.organizer, request=admin_request) assert admin.has_organizer_permission(event.organizer, request=admin_request)
assert admin.has_organizer_permission(event.organizer, 'can_create_events', request=admin_request) assert admin.has_organizer_permission(event.organizer, 'organizer.events:create', request=admin_request)
assert admin.has_event_permission(event.organizer, event, request=admin_request) assert admin.has_event_permission(event.organizer, event, request=admin_request)
assert admin.has_event_permission(event.organizer, event, 'can_change_event_settings', request=admin_request) assert admin.has_event_permission(event.organizer, event, 'event.settings.general:write', request=admin_request)
assert 'arbitrary' not in admin.get_event_permission_set(event.organizer, event) assert 'arbitrary' not in admin.get_event_permission_set(event.organizer, event)
assert 'arbitrary' not in admin.get_organizer_permission_set(event.organizer) assert 'arbitrary' not in admin.get_organizer_permission_set(event.organizer)
@@ -282,7 +282,7 @@ def test_list_of_events(event, user, admin, admin_request):
assert event3 in events assert event3 in events
assert event4 not in events assert event4 not in events
events = list(user.get_events_with_permission('can_change_event_settings', request=admin_request)) events = list(user.get_events_with_permission('event.settings.general:write', request=admin_request))
assert event not in events assert event not in events
assert event2 not in events assert event2 not in events
assert event3 in events assert event3 in events
@@ -293,8 +293,8 @@ def test_list_of_events(event, user, admin, admin_request):
assert set(event3.get_users_with_any_permission()) == {user} assert set(event3.get_users_with_any_permission()) == {user}
assert set(event4.get_users_with_any_permission()) == set() assert set(event4.get_users_with_any_permission()) == set()
assert set(event.get_users_with_permission('can_change_event_settings')) == set() assert set(event.get_users_with_permission('event.settings.general:write')) == set()
assert set(event2.get_users_with_permission('can_change_event_settings')) == set() assert set(event2.get_users_with_permission('event.settings.general:write')) == set()
assert set(event3.get_users_with_permission('can_change_event_settings')) == {user} assert set(event3.get_users_with_permission('event.settings.general:write')) == {user}
assert set(event4.get_users_with_permission('can_change_event_settings')) == set() assert set(event4.get_users_with_permission('event.settings.general:write')) == set()
assert set(event.get_users_with_permission('can_change_orders')) == {user} assert set(event.get_users_with_permission('event.orders:write')) == {user}
+163 -163
View File
@@ -307,115 +307,115 @@ HTTP_POST = "post"
HTTP_GET = "get" HTTP_GET = "get"
event_permission_urls = [ event_permission_urls = [
("can_change_event_settings", "live/", 200, HTTP_GET), ("event.settings.general:write", "live/", 200, HTTP_GET),
("can_change_event_settings", "delete/", 200, HTTP_GET), ("event.settings.general:write", "delete/", 200, HTTP_GET),
("can_change_event_settings", "dangerzone/", 200, HTTP_GET), ("event.settings.general:write", "dangerzone/", 200, HTTP_GET),
("can_change_event_settings", "settings/", 200, HTTP_GET), ("event.settings.general:write", "settings/", 200, HTTP_GET),
("can_change_event_settings", "settings/plugins", 200, HTTP_GET), ("event.settings.general:write", "settings/plugins", 200, HTTP_GET),
("can_change_event_settings", "settings/payment", 200, HTTP_GET), ("event.settings.general:write", "settings/payment", 200, HTTP_GET),
("can_change_event_settings", "settings/tickets", 200, HTTP_GET), ("event.settings.general:write", "settings/tickets", 200, HTTP_GET),
("can_change_event_settings", "settings/email", 200, HTTP_GET), ("event.settings.general:write", "settings/email", 200, HTTP_GET),
("can_change_event_settings", "settings/email/setup", 200, HTTP_GET), ("event.settings.general:write", "settings/email/setup", 200, HTTP_GET),
("can_change_event_settings", "settings/cancel", 200, HTTP_GET), ("event.settings.general:write", "settings/cancel", 200, HTTP_GET),
("can_change_event_settings", "settings/invoice", 200, HTTP_GET), ("event.settings.general:write", "settings/invoice", 200, HTTP_GET),
("can_change_event_settings", "settings/widget", 200, HTTP_GET), ("event.settings.general:write", "settings/widget", 200, HTTP_GET),
("can_change_event_settings", "settings/invoice/preview", 200, HTTP_GET), ("event.settings.general:write", "settings/invoice/preview", 200, HTTP_GET),
("can_change_event_settings", "settings/tax/", 200, HTTP_GET), ("event.settings.general:write", "settings/tax/", 200, HTTP_GET),
("can_change_event_settings", "settings/tax/1/", 404, HTTP_GET), ("event.settings.general:write", "settings/tax/1/", 404, HTTP_GET),
("can_change_event_settings", "settings/tax/add", 200, HTTP_GET), ("event.settings.general:write", "settings/tax/add", 200, HTTP_GET),
("can_change_event_settings", "settings/tax/1/delete", 404, HTTP_GET), ("event.settings.general:write", "settings/tax/1/delete", 404, HTTP_GET),
("can_change_event_settings", "settings/tax/1/default", 404, HTTP_POST), ("event.settings.general:write", "settings/tax/1/default", 404, HTTP_POST),
("can_change_event_settings", "comment/", 405, HTTP_GET), ("event.settings.general:write", "comment/", 405, HTTP_GET),
# Lists are currently not access-controlled # Lists are currently not access-controlled
# ("can_change_items", "items/", 200), # ("event.items:write", "items/", 200),
("can_change_items", "items/add", 200, HTTP_GET), ("event.items:write", "items/add", 200, HTTP_GET),
("can_change_items", "items/1/up", 404, HTTP_POST), ("event.items:write", "items/1/up", 404, HTTP_POST),
("can_change_items", "items/1/down", 404, HTTP_POST), ("event.items:write", "items/1/down", 404, HTTP_POST),
("can_change_items", "items/reorder/2/", 400, HTTP_POST), ("event.items:write", "items/reorder/2/", 400, HTTP_POST),
("can_change_items", "items/1/delete", 404, HTTP_GET), ("event.items:write", "items/1/delete", 404, HTTP_GET),
# ("can_change_items", "categories/", 200), # ("event.items:write", "categories/", 200),
# We don't have to create categories and similar objects # We don't have to create categories and similar objects
# for testing this, it is enough to test that a 404 error # for testing this, it is enough to test that a 404 error
# is returned instead of a 403 one. # is returned instead of a 403 one.
("can_change_items", "categories/2/", 404, HTTP_GET), ("event.items:write", "categories/2/", 404, HTTP_GET),
("can_change_items", "categories/2/delete", 404, HTTP_GET), ("event.items:write", "categories/2/delete", 404, HTTP_GET),
("can_change_items", "categories/2/up", 404, HTTP_POST), ("event.items:write", "categories/2/up", 404, HTTP_POST),
("can_change_items", "categories/2/down", 404, HTTP_POST), ("event.items:write", "categories/2/down", 404, HTTP_POST),
("can_change_items", "categories/reorder", 400, HTTP_POST), ("event.items:write", "categories/reorder", 400, HTTP_POST),
("can_change_items", "categories/add", 200, HTTP_GET), ("event.items:write", "categories/add", 200, HTTP_GET),
# ("can_change_items", "questions/", 200, HTTP_GET), # ("event.items:write", "questions/", 200, HTTP_GET),
("can_change_items", "questions/2/", 404, HTTP_GET), ("event.items:write", "questions/2/", 404, HTTP_GET),
("can_change_items", "questions/2/delete", 404, HTTP_GET), ("event.items:write", "questions/2/delete", 404, HTTP_GET),
("can_change_items", "questions/reorder", 400, HTTP_POST), ("event.items:write", "questions/reorder", 400, HTTP_POST),
("can_change_items", "questions/add", 200, HTTP_GET), ("event.items:write", "questions/add", 200, HTTP_GET),
# ("can_change_items", "quotas/", 200, HTTP_GET), # ("event.items:write", "quotas/", 200, HTTP_GET),
("can_change_items", "quotas/2/change", 404, HTTP_GET), ("event.items:write", "quotas/2/change", 404, HTTP_GET),
("can_change_items", "quotas/2/delete", 404, HTTP_GET), ("event.items:write", "quotas/2/delete", 404, HTTP_GET),
("can_change_items", "quotas/add", 200, HTTP_GET), ("event.items:write", "quotas/add", 200, HTTP_GET),
# ("can_change_items", "discounts/", 200), # ("event.items:write", "discounts/", 200),
# We don't have to create categories and similar objects # We don't have to create categories and similar objects
# for testing this, it is enough to test that a 404 error # for testing this, it is enough to test that a 404 error
# is returned instead of a 403 one. # is returned instead of a 403 one.
("can_change_items", "discounts/2/", 404, HTTP_GET), ("event.items:write", "discounts/2/", 404, HTTP_GET),
("can_change_items", "discounts/2/delete", 404, HTTP_GET), ("event.items:write", "discounts/2/delete", 404, HTTP_GET),
("can_change_items", "discounts/2/up", 404, HTTP_POST), ("event.items:write", "discounts/2/up", 404, HTTP_POST),
("can_change_items", "discounts/2/down", 404, HTTP_POST), ("event.items:write", "discounts/2/down", 404, HTTP_POST),
("can_change_items", "discounts/reorder", 400, HTTP_POST), ("event.items:write", "discounts/reorder", 400, HTTP_POST),
("can_change_items", "discounts/add", 200, HTTP_GET), ("event.items:write", "discounts/add", 200, HTTP_GET),
("can_change_event_settings", "subevents/", 200, HTTP_GET), ("event.settings.general:write", "subevents/", 200, HTTP_GET),
("can_change_event_settings", "subevents/2/", 404, HTTP_GET), ("event.settings.general:write", "subevents/2/", 404, HTTP_GET),
("can_change_event_settings", "subevents/2/delete", 404, HTTP_GET), ("event.settings.general:write", "subevents/2/delete", 404, HTTP_GET),
("can_change_event_settings", "subevents/add", 200, HTTP_GET), ("event.settings.general:write", "subevents/add", 200, HTTP_GET),
("can_view_orders", "orders/overview/", 200, HTTP_GET), ("event.orders:read", "orders/overview/", 200, HTTP_GET),
("can_view_orders", "orders/export/", 200, HTTP_GET), ("event.orders:read", "orders/export/", 200, HTTP_GET),
("can_view_orders", "orders/export/do", 302, HTTP_POST), ("event.orders:read", "orders/export/do", 302, HTTP_POST),
("can_view_orders", "orders/", 200, HTTP_GET), ("event.orders:read", "orders/", 200, HTTP_GET),
("can_view_orders", "orders/FOO/", 200, HTTP_GET), ("event.orders:read", "orders/FOO/", 200, HTTP_GET),
("can_change_orders", "orders/FOO/extend", 200, HTTP_GET), ("event.orders:write", "orders/FOO/extend", 200, HTTP_GET),
("can_change_orders", "orders/FOO/reactivate", 302, HTTP_GET), ("event.orders:write", "orders/FOO/reactivate", 302, HTTP_GET),
("can_change_orders", "orders/FOO/contact", 200, HTTP_GET), ("event.orders:write", "orders/FOO/contact", 200, HTTP_GET),
("can_change_orders", "orders/FOO/transition", 405, HTTP_GET), ("event.orders:write", "orders/FOO/transition", 405, HTTP_GET),
("can_change_orders", "orders/FOO/checkvatid", 405, HTTP_GET), ("event.orders:write", "orders/FOO/checkvatid", 405, HTTP_GET),
("can_change_orders", "orders/FOO/resend", 405, HTTP_GET), ("event.orders:write", "orders/FOO/resend", 405, HTTP_GET),
("can_change_orders", "orders/FOO/invoice", 405, HTTP_GET), ("event.orders:write", "orders/FOO/invoice", 405, HTTP_GET),
("can_change_orders", "orders/FOO/change", 200, HTTP_GET), ("event.orders:write", "orders/FOO/change", 200, HTTP_GET),
("can_change_orders", "orders/FOO/approve", 200, HTTP_GET), ("event.orders:write", "orders/FOO/approve", 200, HTTP_GET),
("can_change_orders", "orders/FOO/deny", 200, HTTP_GET), ("event.orders:write", "orders/FOO/deny", 200, HTTP_GET),
("can_change_orders", "orders/FOO/delete", 302, HTTP_GET), ("event.orders:write", "orders/FOO/delete", 302, HTTP_GET),
("can_change_orders", "orders/FOO/comment", 405, HTTP_GET), ("event.orders:write", "orders/FOO/comment", 405, HTTP_GET),
("can_change_orders", "orders/FOO/locale", 200, HTTP_GET), ("event.orders:write", "orders/FOO/locale", 200, HTTP_GET),
("can_change_orders", "orders/FOO/sendmail", 200, HTTP_GET), ("event.orders:write", "orders/FOO/sendmail", 200, HTTP_GET),
("can_change_orders", "orders/FOO/1/sendmail", 404, HTTP_GET), ("event.orders:write", "orders/FOO/1/sendmail", 404, HTTP_GET),
("can_change_orders", "orders/import/", 200, HTTP_GET), ("event.orders:write", "orders/import/", 200, HTTP_GET),
("can_change_orders", "orders/import/0ab7b081-92d3-4480-82de-2f8b056fd32f/", 404, HTTP_GET), ("event.orders:write", "orders/import/0ab7b081-92d3-4480-82de-2f8b056fd32f/", 404, HTTP_GET),
("can_view_orders", "orders/FOO/answer/5/", 404, HTTP_GET), ("event.orders:read", "orders/FOO/answer/5/", 404, HTTP_GET),
("can_change_orders", "cancel/", 200, HTTP_GET), ("event.orders:write", "cancel/", 200, HTTP_GET),
("can_change_vouchers", "vouchers/add", 200, HTTP_GET), ("event.vouchers:write", "vouchers/add", 200, HTTP_GET),
("can_change_vouchers", "vouchers/bulk_add", 200, HTTP_GET), ("event.vouchers:write", "vouchers/bulk_add", 200, HTTP_GET),
("can_view_vouchers", "vouchers/", 200, HTTP_GET), ("event.vouchers:read", "vouchers/", 200, HTTP_GET),
("can_view_vouchers", "vouchers/tags/", 200, HTTP_GET), ("event.vouchers:read", "vouchers/tags/", 200, HTTP_GET),
("can_view_vouchers", "vouchers/1234/", 404, HTTP_GET), ("event.vouchers:read", "vouchers/1234/", 404, HTTP_GET),
("can_change_vouchers", "vouchers/1234/", 404, HTTP_POST), ("event.vouchers:write", "vouchers/1234/", 404, HTTP_POST),
("can_change_vouchers", "vouchers/1234/delete", 404, HTTP_GET), ("event.vouchers:write", "vouchers/1234/delete", 404, HTTP_GET),
("can_view_orders", "waitinglist/", 200, HTTP_GET), ("event.orders:read", "waitinglist/", 200, HTTP_GET),
("can_change_orders", "waitinglist/auto_assign", 405, HTTP_GET), ("event.orders:write", "waitinglist/auto_assign", 405, HTTP_GET),
("can_change_orders", "waitinglist/action", 405, HTTP_GET), ("event.orders:write", "waitinglist/action", 405, HTTP_GET),
("can_view_orders", "checkins/", 200, HTTP_GET), ("event.orders:read", "checkins/", 200, HTTP_GET),
("can_view_orders", "checkinlists/", 200, HTTP_GET), ("event.orders:read", "checkinlists/", 200, HTTP_GET),
("can_view_orders", "checkinlists/1/", 404, HTTP_GET), ("event.orders:read", "checkinlists/1/", 404, HTTP_GET),
("can_change_orders", "checkinlists/1/bulk_action", 404, HTTP_POST), ("event.orders:write", "checkinlists/1/bulk_action", 404, HTTP_POST),
("can_checkin_orders", "checkinlists/1/bulk_action", 404, HTTP_POST), ("event.orders:checkin", "checkinlists/1/bulk_action", 404, HTTP_POST),
("can_change_event_settings", "checkinlists/add", 200, HTTP_GET), ("event.settings.general:write", "checkinlists/add", 200, HTTP_GET),
("can_change_event_settings", "checkinlists/1/change", 404, HTTP_GET), ("event.settings.general:write", "checkinlists/1/change", 404, HTTP_GET),
("can_change_event_settings", "checkinlists/1/delete", 404, HTTP_GET), ("event.settings.general:write", "checkinlists/1/delete", 404, HTTP_GET),
# bank transfer # bank transfer
("can_change_orders", "banktransfer/import/", 200, HTTP_GET), ("event.orders:write", "banktransfer/import/", 200, HTTP_GET),
("can_change_orders", "banktransfer/job/1/", 404, HTTP_GET), ("event.orders:write", "banktransfer/job/1/", 404, HTTP_GET),
("can_change_orders", "banktransfer/action/", 200, HTTP_GET), ("event.orders:write", "banktransfer/action/", 200, HTTP_GET),
("can_change_orders", "banktransfer/refunds/", 200, HTTP_GET), ("event.orders:write", "banktransfer/refunds/", 200, HTTP_GET),
("can_change_orders", "banktransfer/export/1/", 404, HTTP_GET), ("event.orders:write", "banktransfer/export/1/", 404, HTTP_GET),
("can_change_orders", "banktransfer/sepa-export/1/", 404, HTTP_GET), ("event.orders:write", "banktransfer/sepa-export/1/", 404, HTTP_GET),
] ]
@@ -460,14 +460,14 @@ def test_current_permission(client, env):
t = Team( t = Team(
pk=2, organizer=env[2], all_events=True pk=2, organizer=env[2], all_events=True
) )
setattr(t, 'can_change_event_settings', True) setattr(t, 'event.settings.general:write', True)
t.save() t.save()
t.members.add(env[1]) t.members.add(env[1])
client.login(email='dummy@dummy.dummy', password='dummy') client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/settings/') response = client.get('/control/event/dummy/dummy/settings/')
assert response.status_code == 200 assert response.status_code == 200
setattr(t, 'can_change_event_settings', False) setattr(t, 'event.settings.general:write', False)
t.save() t.save()
response = client.get('/control/event/dummy/dummy/settings/') response = client.get('/control/event/dummy/dummy/settings/')
assert response.status_code == 403 assert response.status_code == 403
@@ -521,69 +521,69 @@ def test_wrong_organizer(perf_patch, client, env, url):
organizer_permission_urls = [ organizer_permission_urls = [
("can_change_teams", "organizer/dummy/teams", 200), ("organizer.teams:write", "organizer/dummy/teams", 200),
("can_change_teams", "organizer/dummy/team/add", 200), ("organizer.teams:write", "organizer/dummy/team/add", 200),
("can_change_teams", "organizer/dummy/team/1/", 200), ("organizer.teams:write", "organizer/dummy/team/1/", 200),
("can_change_teams", "organizer/dummy/team/1/edit", 200), ("organizer.teams:write", "organizer/dummy/team/1/edit", 200),
("can_change_teams", "organizer/dummy/team/1/delete", 200), ("organizer.teams:write", "organizer/dummy/team/1/delete", 200),
("can_change_organizer_settings", "organizer/dummy/edit", 200), ("organizer.settings.general:write", "organizer/dummy/edit", 200),
("can_change_organizer_settings", "organizer/dummy/settings/plugins", 200), ("organizer.settings.general:write", "organizer/dummy/settings/plugins", 200),
("can_change_organizer_settings", "organizer/dummy/settings/plugins/pretix.plugins.sendmail/events", 200), ("organizer.settings.general:write", "organizer/dummy/settings/plugins/pretix.plugins.sendmail/events", 200),
("can_change_organizer_settings", "organizer/dummy/settings/email", 200), ("organizer.settings.general:write", "organizer/dummy/settings/email", 200),
("can_change_organizer_settings", "organizer/dummy/settings/email/setup", 200), ("organizer.settings.general:write", "organizer/dummy/settings/email/setup", 200),
("can_change_organizer_settings", "organizer/dummy/outgoingmails", 200), ("organizer.settings.general:write", "organizer/dummy/outgoingmails", 200),
("can_change_organizer_settings", "organizer/dummy/outgoingmail/1/", 404), ("organizer.settings.general:write", "organizer/dummy/outgoingmail/1/", 404),
("can_change_organizer_settings", "organizer/dummy/outgoingmail/bulk_action", 405), ("organizer.settings.general:write", "organizer/dummy/outgoingmail/bulk_action", 405),
("can_change_organizer_settings", "organizer/dummy/devices", 200), ("organizer.settings.general:write", "organizer/dummy/devices", 200),
("can_change_organizer_settings", "organizer/dummy/devices/select2", 200), ("organizer.settings.general:write", "organizer/dummy/devices/select2", 200),
("can_change_organizer_settings", "organizer/dummy/device/add", 200), ("organizer.settings.general:write", "organizer/dummy/device/add", 200),
("can_change_organizer_settings", "organizer/dummy/device/1/edit", 404), ("organizer.settings.general:write", "organizer/dummy/device/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/device/1/connect", 404), ("organizer.settings.general:write", "organizer/dummy/device/1/connect", 404),
("can_change_organizer_settings", "organizer/dummy/device/1/revoke", 404), ("organizer.settings.general:write", "organizer/dummy/device/1/revoke", 404),
("can_change_organizer_settings", "organizer/dummy/gates", 200), ("organizer.settings.general:write", "organizer/dummy/gates", 200),
("can_change_organizer_settings", "organizer/dummy/gates/select2", 200), ("organizer.settings.general:write", "organizer/dummy/gates/select2", 200),
("can_change_organizer_settings", "organizer/dummy/gate/add", 200), ("organizer.settings.general:write", "organizer/dummy/gate/add", 200),
("can_change_organizer_settings", "organizer/dummy/gate/1/edit", 404), ("organizer.settings.general:write", "organizer/dummy/gate/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/gate/1/delete", 404), ("organizer.settings.general:write", "organizer/dummy/gate/1/delete", 404),
("can_change_organizer_settings", "organizer/dummy/properties", 200), ("organizer.settings.general:write", "organizer/dummy/properties", 200),
("can_change_organizer_settings", "organizer/dummy/property/add", 200), ("organizer.settings.general:write", "organizer/dummy/property/add", 200),
("can_change_organizer_settings", "organizer/dummy/property/1/edit", 404), ("organizer.settings.general:write", "organizer/dummy/property/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/property/1/delete", 404), ("organizer.settings.general:write", "organizer/dummy/property/1/delete", 404),
("can_change_organizer_settings", "organizer/dummy/channels", 200), ("organizer.settings.general:write", "organizer/dummy/channels", 200),
("can_change_organizer_settings", "organizer/dummy/channel/add", 200), ("organizer.settings.general:write", "organizer/dummy/channel/add", 200),
("can_change_organizer_settings", "organizer/dummy/channel/web/edit", 200), ("organizer.settings.general:write", "organizer/dummy/channel/web/edit", 200),
("can_change_organizer_settings", "organizer/dummy/channel/web/delete", 200), ("organizer.settings.general:write", "organizer/dummy/channel/web/delete", 200),
("can_change_organizer_settings", "organizer/dummy/membershiptypes", 200), ("organizer.settings.general:write", "organizer/dummy/membershiptypes", 200),
("can_change_organizer_settings", "organizer/dummy/membershiptype/add", 200), ("organizer.settings.general:write", "organizer/dummy/membershiptype/add", 200),
("can_change_organizer_settings", "organizer/dummy/membershiptype/1/edit", 404), ("organizer.settings.general:write", "organizer/dummy/membershiptype/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/membershiptype/1/delete", 404), ("organizer.settings.general:write", "organizer/dummy/membershiptype/1/delete", 404),
("can_change_organizer_settings", "organizer/dummy/ssoproviders", 200), ("organizer.settings.general:write", "organizer/dummy/ssoproviders", 200),
("can_change_organizer_settings", "organizer/dummy/ssoprovider/add", 200), ("organizer.settings.general:write", "organizer/dummy/ssoprovider/add", 200),
("can_change_organizer_settings", "organizer/dummy/ssoprovider/1/edit", 404), ("organizer.settings.general:write", "organizer/dummy/ssoprovider/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/ssoprovider/1/delete", 404), ("organizer.settings.general:write", "organizer/dummy/ssoprovider/1/delete", 404),
("can_manage_customers", "organizer/dummy/customers", 200), ("organizer.customers:write", "organizer/dummy/customers", 200),
("can_manage_customers", "organizer/dummy/customer/ABC/edit", 404), ("organizer.customers:write", "organizer/dummy/customer/ABC/edit", 404),
("can_manage_customers", "organizer/dummy/customer/ABC/anonymize", 404), ("organizer.customers:write", "organizer/dummy/customer/ABC/anonymize", 404),
("can_manage_customers", "organizer/dummy/customer/ABC/membership/add", 404), ("organizer.customers:write", "organizer/dummy/customer/ABC/membership/add", 404),
("can_manage_customers", "organizer/dummy/customer/ABC/membership/1/edit", 404), ("organizer.customers:write", "organizer/dummy/customer/ABC/membership/1/edit", 404),
("can_manage_customers", "organizer/dummy/customer/ABC/", 404), ("organizer.customers:write", "organizer/dummy/customer/ABC/", 404),
("can_manage_reusable_media", "organizer/dummy/reusable_media", 200), ("organizer.reusablemedia:read", "organizer/dummy/reusable_media", 200),
("can_manage_reusable_media", "organizer/dummy/reusable_media/1/edit", 404), ("organizer.reusablemedia:write", "organizer/dummy/reusable_media/1/edit", 404),
("can_manage_reusable_media", "organizer/dummy/reusable_media/1/", 404), ("organizer.reusablemedia:read", "organizer/dummy/reusable_media/1/", 404),
("can_manage_gift_cards", "organizer/dummy/giftcards", 200), ("organizer.giftcards:read", "organizer/dummy/giftcards", 200),
("can_manage_gift_cards", "organizer/dummy/giftcard/add", 200), ("organizer.giftcards:write", "organizer/dummy/giftcard/add", 200),
("can_manage_gift_cards", "organizer/dummy/giftcard/1/", 404), ("organizer.giftcards:read", "organizer/dummy/giftcard/1/", 404),
("can_manage_gift_cards", "organizer/dummy/giftcard/1/edit", 404), ("organizer.giftcards:write", "organizer/dummy/giftcard/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/giftcards/acceptance", 200), ("organizer.settings.general:write", "organizer/dummy/giftcards/acceptance", 200),
("can_change_organizer_settings", "organizer/dummy/giftcards/acceptance/invite", 200), ("organizer.settings.general:write", "organizer/dummy/giftcards/acceptance/invite", 200),
# bank transfer # bank transfer
("can_change_orders", "organizer/dummy/banktransfer/import/", 200), ("event.orders:write", "organizer/dummy/banktransfer/import/", 200),
("can_change_orders", "organizer/dummy/banktransfer/job/1/", 404), ("event.orders:write", "organizer/dummy/banktransfer/job/1/", 404),
("can_change_orders", "organizer/dummy/banktransfer/action/", 200), ("event.orders:write", "organizer/dummy/banktransfer/action/", 200),
("can_change_orders", "organizer/dummy/banktransfer/refunds/", 200), ("event.orders:write", "organizer/dummy/banktransfer/refunds/", 200),
("can_change_orders", "organizer/dummy/banktransfer/export/1/", 404), ("event.orders:write", "organizer/dummy/banktransfer/export/1/", 404),
("can_change_orders", "organizer/dummy/banktransfer/sepa-export/1/", 404), ("event.orders:write", "organizer/dummy/banktransfer/sepa-export/1/", 404),
] ]
+5 -5
View File
@@ -231,9 +231,9 @@ def test_create_team(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy') client.login(email='dummy@dummy.dummy', password='dummy')
client.post('/control/organizer/dummy/team/add', { client.post('/control/organizer/dummy/team/add', {
'name': 'Foo', 'name': 'Foo',
'can_create_events': 'on', 'organizer.events:create': 'on',
'limit_events': str(event.pk), 'limit_events': str(event.pk),
'can_change_event_settings': 'on' 'event.settings.general:write': 'on'
}, follow=True) }, follow=True)
with scopes_disabled(): with scopes_disabled():
t = Team.objects.last() t = Team.objects.last()
@@ -249,9 +249,9 @@ def test_update_team(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy') client.login(email='dummy@dummy.dummy', password='dummy')
client.post('/control/organizer/dummy/team/{}/edit'.format(admin_team.pk), { client.post('/control/organizer/dummy/team/{}/edit'.format(admin_team.pk), {
'name': 'Admin', 'name': 'Admin',
'can_change_teams': 'on', 'organizer.teams:write': 'on',
'limit_events': str(event.pk), 'limit_events': str(event.pk),
'can_change_event_settings': 'on' 'event.settings.general:write': 'on'
}, follow=True) }, follow=True)
admin_team.refresh_from_db() admin_team.refresh_from_db()
assert admin_team.can_change_event_settings assert admin_team.can_change_event_settings
@@ -265,7 +265,7 @@ def test_update_last_team_to_be_no_admin(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy') client.login(email='dummy@dummy.dummy', password='dummy')
resp = client.post('/control/organizer/dummy/team/{}/edit'.format(admin_team.pk), { resp = client.post('/control/organizer/dummy/team/{}/edit'.format(admin_team.pk), {
'name': 'Admin', 'name': 'Admin',
'can_change_event_settings': 'on' 'event.settings.general:write': 'on'
}, follow=True) }, follow=True)
assert 'alert-danger' in resp.content.decode() assert 'alert-danger' in resp.content.decode()