Coverage for src / mesh / crud / reviewer_list.py: 62%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-08-11 09:47 +0000

1from django.db.models import Exists, OuterRef 

2 

3from ..models import Review, User 

4from ..models.orm.user_models import SuggestedReviewer 

5from ..views.forms.reviewer_forms import SuggestedReviewerForm 

6 

7 

8def get_all_reviewers() -> list: 

9 """ 

10 Retourne la liste consolidée de tous les reviewers : 

11 - les User ayant déjà au moins une Review 

12 - les SuggestedReviewer (sans compte) 

13 Chaque objet est enrichi d'attributs de stats (type, total, pending, accepted, declined). 

14 """ 

15 subquery = Review.objects.filter(reviewer=OuterRef("pk")).order_by().values("reviewer") 

16 user_reviewers = User.objects.filter(Exists(subquery)) 

17 

18 reviewers = [] 

19 

20 for reviewer in user_reviewers: 

21 reviewer.type = "user" 

22 reviewer.total = reviewer.review_set.count() 

23 reviewer.pending = reviewer.review_set.exclude( 

24 recommendation__isnull=False, accepted__isnull=False 

25 ).count() 

26 reviewer.accepted = reviewer.review_set.filter(accepted=True).count() 

27 reviewer.declined = reviewer.review_set.filter(accepted=False).count() 

28 reviewers.append(reviewer) 

29 

30 for reviewer in SuggestedReviewer.objects.all(): 

31 reviewer.type = "suggested" 

32 reviewers.append(reviewer) 

33 

34 return reviewers 

35 

36 

37def create_suggested_reviewer(form: SuggestedReviewerForm) -> SuggestedReviewer: 

38 """ 

39 Persiste un nouveau SuggestedReviewer à partir d'un form déjà validé. 

40 Retourne l'instance créée. 

41 """ 

42 return form.save()