-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathviews.py
More file actions
126 lines (95 loc) · 4.37 KB
/
views.py
File metadata and controls
126 lines (95 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from django.contrib.auth import get_user_model
from django.db.models import QuerySet
from rest_framework import generics, status
from rest_framework.response import Response
from project_rates.constants import RatesRequestData
from project_rates.services import (
get_querysets,
serialize_project_criterias,
count_scored_criterias,
)
from project_rates.models import ProjectScore
from project_rates.pagination import RateProjectsPagination
from project_rates.serializers import (
ProjectScoreCreateSerializer,
ProjectScoreGetSerializer,
)
from users.models import Expert
from users.permissions import IsExpert, IsExpertPost
User = get_user_model()
class RateProject(generics.CreateAPIView):
serializer_class = ProjectScoreCreateSerializer
permission_classes = [IsExpertPost]
def get_needed_data(self) -> tuple[dict, list[int]]:
data = self.request.data
user_id = self.request.user.id
project_id = self.kwargs.get("project_id")
criteria_to_get = [
criterion["criterion_id"] for criterion in data
] # is needed for validation later
Expert.objects.get(user__id=user_id, programs__criterias__id=criteria_to_get[0])
for criterion in data:
criterion["user"] = user_id
criterion["project"] = project_id
criterion["criteria"] = criterion.pop("criterion_id")
return data, criteria_to_get
def create(self, request, *args, **kwargs) -> Response:
try:
data, criteria_to_get = self.get_needed_data()
serializer = ProjectScoreCreateSerializer(
data=data, criteria_to_get=criteria_to_get, many=True
)
serializer.is_valid(raise_exception=True)
ProjectScore.objects.bulk_create(
[ProjectScore(**item) for item in serializer.validated_data],
update_conflicts=True,
update_fields=["value"],
unique_fields=["criteria", "user", "project"],
)
return Response({"success": True}, status=status.HTTP_201_CREATED)
except Expert.DoesNotExist:
return Response(
{"error": "you have no permission to rate this program"},
status=status.HTTP_403_FORBIDDEN,
)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
class RateProjects(generics.ListAPIView):
serializer_class = ProjectScoreGetSerializer
permission_classes = [IsExpert]
pagination_class = RateProjectsPagination
def get_request_data(self) -> RatesRequestData:
scored = True if self.request.query_params.get("scored") == "true" else False
return RatesRequestData(
program_id=self.kwargs.get("program_id"),
user=self.request.user,
view=self,
scored=scored,
)
def get_querysets_dict(self) -> dict[str, QuerySet]:
return get_querysets(self.get_request_data())
def serialize_querysets(self) -> list[dict]:
return serialize_project_criterias(self.get_querysets_dict())
def get(self, request, *args, **kwargs):
serialized_data = self.serialize_querysets()
if self.request.query_params.get("scored") == "true":
[project.update({"is_scored": True}) for project in serialized_data]
else:
[count_scored_criterias(project) for project in serialized_data]
return self.get_paginated_response(serialized_data)
class RateProjectsDetails(RateProjects):
permission_classes = [IsExpertPost] # потом решить проблему с этим
def get_request_data(self) -> RatesRequestData:
request_data = super().get_request_data()
project_id = self.request.query_params.get("project_id")
program_id = self.request.query_params.get("program_id")
request_data.project_id = int(project_id) if project_id else None
request_data.program_id = int(program_id) if program_id else None
return request_data
def get(self, request, *args, **kwargs):
try:
serialized_data = self.serialize_querysets()[0]
count_scored_criterias(serialized_data)
return Response(serialized_data, status=status.HTTP_200_OK)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)