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
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
1from django.db.models import Exists, OuterRef
3from ..models import Review, User
4from ..models.orm.user_models import SuggestedReviewer
5from ..views.forms.reviewer_forms import SuggestedReviewerForm
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))
18 reviewers = []
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)
30 for reviewer in SuggestedReviewer.objects.all():
31 reviewer.type = "suggested"
32 reviewers.append(reviewer)
34 return reviewers
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()