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
« 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
4from events.services import is_organiser
6from .models import FoodOrder, Product
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 }
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)
26 return data
29def can_change_order(member, food_event):
30 """Determine if a certain member can edit orders of an event.
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 )
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)
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