Coverage for website/pizzas/services.py: 36.36%

18 statements  

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

1from django.db.models import Count 

2from django.utils import timezone 

3 

4from events.services import is_organiser 

5 

6from .models import FoodOrder, Product 

7 

8 

9def gen_stats_pizza_orders() -> dict: 

10 """Generate statistics about number of orders per product.""" 

11 data = { 

12 "labels": [], 

13 "datasets": [ 

14 {"data": []}, 

15 ], 

16 } 

17 

18 for product in ( 

19 Product.objects.annotate(count=Count("foodorder")) 

20 .filter(count__gt=0) 

21 .order_by("-count")[:10] 

22 ): 

23 data["labels"].append(product.name) 

24 data["datasets"][0]["data"].append(product.count) 

25 

26 return data 

27 

28 

29def can_change_order(member, food_event): 

30 """Determine if a certain member can edit orders of an event. 

31 

32 :param member: Member who wants to change and order 

33 :param food_event: The event for which we want to change an order 

34 :return: True if we can change an order else False 

35 """ 

36 return ( 

37 food_event 

38 and member.has_perm("pizzas.change_foodorder") 

39 and is_organiser(member, food_event.event) 

40 ) 

41 

42 

43def execute_data_minimisation(dry_run=False): 

44 """Anonymizes pizzas orders older than 3 years.""" 

45 # Sometimes years are 366 days of course, but better delete 1 or 2 days early than late 

46 deletion_period = timezone.now().date() - timezone.timedelta(days=365 * 3) 

47 

48 queryset = FoodOrder.objects.filter(food_event__end__lte=deletion_period).exclude( 

49 name="<removed>" 

50 ) 

51 if not dry_run: 

52 queryset.update(member=None, name="<removed>") 

53 return queryset