Coverage for website/sales/services.py: 42.86%
22 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 Sum
2from django.utils import timezone
4from sales.models.order import Order, OrderItem
7def is_adult(member):
8 today = timezone.now().date()
9 return member.profile.birthday <= today.replace(year=today.year - 18)
12def is_manager(member, shift):
13 if member and member.is_authenticated: 13 ↛ 23line 13 didn't jump to line 23 because the condition on line 13 was always true
14 return (
15 member.is_superuser
16 or member.has_perm("sales.override_manager")
17 or (
18 member.get_member_groups()
19 .filter(pk__in=shift.managers.values_list("pk"))
20 .exists()
21 )
22 )
23 return False
26def execute_data_minimisation(dry_run=False):
27 """Anonymizes orders older than 3 years."""
28 # Sometimes years are 366 days of course, but better delete 1 or 2 days early than late
29 deletion_period = timezone.now().date() - timezone.timedelta(days=365 * 3)
31 queryset = Order.objects.filter(created_at__lte=deletion_period).exclude(
32 payer__isnull=True
33 )
34 if not dry_run:
35 queryset.update(payer=None)
36 return queryset.all()
39def gen_stats_sales_orders() -> dict:
40 """Generate statistics about number of orders per product."""
41 data = {
42 "labels": [],
43 "datasets": [
44 {"data": []},
45 ],
46 }
48 for product, count in (
49 OrderItem.objects.values("product_name")
50 .annotate(count=Sum("amount"))
51 .filter(count__gt=0)
52 .order_by("-count")
53 .values_list("product_name", "count")[:10]
54 ):
55 data["labels"].append(product)
56 data["datasets"][0]["data"].append(count)
58 return data