|
1 | 1 | from django.contrib.auth import get_user_model |
| 2 | +from django.db.models import Count |
2 | 3 |
|
3 | 4 | from rest_framework import generics, status |
4 | 5 | from rest_framework.response import Response |
@@ -97,6 +98,60 @@ def get(self, request, *args, **kwargs): |
97 | 98 | return self.get_paginated_response(projects_serializer.data) |
98 | 99 |
|
99 | 100 |
|
| 101 | +class ScoredProjects(generics.ListAPIView): |
| 102 | + serializer_class = ProjectScoreGetSerializer |
| 103 | + permission_classes = [IsExpert] |
| 104 | + pagination_class = RateProjectsPagination |
| 105 | + |
| 106 | + def get(self, request, *args, **kwargs): |
| 107 | + user = self.request.user |
| 108 | + program_id = self.kwargs.get("program_id") |
| 109 | + |
| 110 | + criterias = Criteria.objects.prefetch_related("partner_program").filter( |
| 111 | + partner_program_id=program_id |
| 112 | + ) |
| 113 | + quantity_criterias = criterias.count() |
| 114 | + |
| 115 | + scores = ProjectScore.objects.prefetch_related("criteria").filter( |
| 116 | + criteria__in=criterias.values_list("id", flat=True), user=user |
| 117 | + ) |
| 118 | + unpaginated_projects = ( |
| 119 | + Project.objects.filter( |
| 120 | + partner_program_profiles__partner_program_id=program_id |
| 121 | + ) |
| 122 | + .annotate(scores_count=Count("scores")) |
| 123 | + .distinct() |
| 124 | + ) |
| 125 | + |
| 126 | + unpaginated_projects = unpaginated_projects.exclude( |
| 127 | + scores_count__lt=quantity_criterias |
| 128 | + ) |
| 129 | + |
| 130 | + projects = self.paginate_queryset(unpaginated_projects) |
| 131 | + |
| 132 | + criteria_serializer = CriteriaSerializer(data=criterias, many=True) |
| 133 | + scores_serializer = ProjectScoreSerializer(data=scores, many=True) |
| 134 | + |
| 135 | + criteria_serializer.is_valid() |
| 136 | + scores_serializer.is_valid() |
| 137 | + |
| 138 | + projects_serializer = self.get_serializer( |
| 139 | + data=projects, |
| 140 | + context={ |
| 141 | + "data_criterias": criteria_serializer.data, |
| 142 | + "data_scores": scores_serializer.data, |
| 143 | + }, |
| 144 | + many=True, |
| 145 | + ) |
| 146 | + |
| 147 | + projects_serializer.is_valid() |
| 148 | + |
| 149 | + for project in projects_serializer.data: |
| 150 | + project["is_scored"] = True |
| 151 | + |
| 152 | + return self.get_paginated_response(projects_serializer.data) |
| 153 | + |
| 154 | + |
100 | 155 | class RateProjectsDetails(generics.ListAPIView): |
101 | 156 | serializer_class = ProjectScoreGetSerializer |
102 | 157 | permission_classes = [IsExpert] |
|
0 commit comments