Coverage for website/activemembers/services.py: 22.22%

21 statements  

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

1from django.db.models import Count, Q 

2from django.utils import timezone 

3 

4from activemembers.models import Committee 

5from members.models.member import Member 

6 

7 

8def generate_statistics() -> dict: 

9 """Generate statistics about number of members in each committee.""" 

10 now = timezone.now() 

11 committees = Committee.active_objects.annotate( 

12 member_count=( 

13 Count( 

14 "members", 

15 filter=( 

16 Q(membergroupmembership__until=None) 

17 | Q( 

18 membergroupmembership__since__lte=now, 

19 membergroupmembership__until__gte=now, 

20 ) 

21 ), 

22 ) 

23 ) 

24 ) 

25 

26 data = { 

27 "labels": [], 

28 "datasets": [ 

29 {"data": []}, 

30 ], 

31 } 

32 for committee in committees: 

33 data["labels"].append(committee.name) 

34 data["datasets"][0]["data"].append(committee.member_count) 

35 

36 return data 

37 

38 

39def revoke_staff_permission_for_users_in_no_commitee(): 

40 members = Member.objects.filter(is_staff=True) 

41 revoked = [] 

42 for member in members: 

43 if not member.get_member_groups().exists() and not member.is_superuser: 

44 revoked.append(member.id) 

45 member.is_staff = False 

46 member.save() 

47 return Member.objects.filter(pk__in=revoked)