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

1from django.db.models import Sum 

2from django.utils import timezone 

3 

4from sales.models.order import Order, OrderItem 

5 

6 

7def is_adult(member): 

8 today = timezone.now().date() 

9 return member.profile.birthday <= today.replace(year=today.year - 18) 

10 

11 

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 

24 

25 

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) 

30 

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() 

37 

38 

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 } 

47 

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) 

57 

58 return data