Skip to content

Commit 805d447

Browse files
committed
added rout for scored projects
1 parent 9347e82 commit 805d447

3 files changed

Lines changed: 69 additions & 1 deletion

File tree

project_rates/serializers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ def count_views(cls, project):
6262
return get_views_count(project)
6363

6464

65+
class ScoredProjectsSerializer(ProjectScoreGetSerializer):
66+
scores_count = serializers.IntegerField()
67+
68+
class Meta(ProjectScoreGetSerializer.Meta):
69+
fields = ProjectScoreGetSerializer.Meta.fields + ["scores_count"]
70+
71+
6572
def serialize_data_func(criteria_to_get: list, data: dict):
6673
criteria = Criteria.objects.in_bulk(criteria_to_get)
6774

project_rates/urls.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
from django.urls import path
22

3-
from project_rates.views import RateProject, RateProjects, RateProjectsDetails
3+
from project_rates.views import (
4+
RateProject,
5+
RateProjects,
6+
RateProjectsDetails,
7+
ScoredProjects,
8+
)
49

510
urlpatterns = [
611
path("rate/<int:project_id>", RateProject.as_view()),
712
path("<int:program_id>", RateProjects.as_view()),
13+
path("scored/<int:program_id>", ScoredProjects.as_view()),
814
path("details", RateProjectsDetails.as_view()),
915
]

project_rates/views.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.contrib.auth import get_user_model
2+
from django.db.models import Count
23

34
from rest_framework import generics, status
45
from rest_framework.response import Response
@@ -97,6 +98,60 @@ def get(self, request, *args, **kwargs):
9798
return self.get_paginated_response(projects_serializer.data)
9899

99100

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+
100155
class RateProjectsDetails(generics.ListAPIView):
101156
serializer_class = ProjectScoreGetSerializer
102157
permission_classes = [IsExpert]

0 commit comments

Comments
 (0)