Coverage for website/pizzas/decorators.py: 40.91%

18 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from django.core.exceptions import PermissionDenied 

2 

3from events import services 

4from pizzas.models import FoodEvent 

5 

6 

7def organiser_only(view_function): 

8 """See OrganiserOnly.""" 

9 return OrganiserOnly(view_function) 

10 

11 

12class OrganiserOnly: 

13 """Decorator that denies access on certain conditions. 

14 

15 The conditions are: 

16 1. There is no `pk` in the request 

17 2. The specified pizza event does not exist 

18 3. The user is no organiser of the specified pizza event 

19 """ 

20 

21 def __init__(self, view_function): 

22 self.view_function = view_function 

23 

24 def __call__(self, request, *args, **kwargs): 

25 pizza_event = None 

26 

27 if "pk" in kwargs: 

28 try: 

29 pizza_event = FoodEvent.objects.get(pk=kwargs.get("pk")) 

30 except FoodEvent.DoesNotExist: 

31 pass 

32 

33 if pizza_event and services.is_organiser(request.member, pizza_event.event): 

34 return self.view_function(request, *args, **kwargs) 

35 

36 raise PermissionDenied