Skip to content

Commit 66f532d

Browse files
committed
Изменена схема выдачи детальной информации о проекте, произведена оптимизация по запросам
1 parent a8cc117 commit 66f532d

1 file changed

Lines changed: 40 additions & 61 deletions

File tree

projects/serializers.py

Lines changed: 40 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,39 @@ class Meta:
7676
fields = ["collaborators"]
7777

7878

79+
class PartnerProgramProjectSerializer(serializers.ModelSerializer):
80+
program_link_id = serializers.IntegerField(source="pk", read_only=True)
81+
program_id = serializers.IntegerField(source="partner_program.id", read_only=True)
82+
is_submitted = serializers.BooleanField(source="submitted", read_only=True)
83+
can_submit = serializers.SerializerMethodField()
84+
program_fields = serializers.SerializerMethodField()
85+
program_field_values = serializers.SerializerMethodField()
86+
87+
class Meta:
88+
model = PartnerProgramProject
89+
fields = [
90+
"program_link_id",
91+
"program_id",
92+
"is_submitted",
93+
"can_submit",
94+
"program_fields",
95+
"program_field_values",
96+
]
97+
98+
def get_can_submit(self, obj):
99+
return obj.partner_program.is_competitive and not obj.submitted
100+
101+
def get_program_fields(self, obj):
102+
fields_qs = obj.partner_program.fields.all()
103+
return PartnerProgramFieldSerializer(fields_qs, many=True).data
104+
105+
def get_program_field_values(self, obj):
106+
values_qs = PartnerProgramFieldValue.objects.filter(
107+
program_project=obj
108+
).select_related("field")
109+
return PartnerProgramFieldValueSerializer(values_qs, many=True).data
110+
111+
79112
class ProjectDetailSerializer(serializers.ModelSerializer):
80113
achievements = AchievementListSerializer(many=True, read_only=True)
81114
cover = UserFileSerializer(required=False)
@@ -87,73 +120,23 @@ class ProjectDetailSerializer(serializers.ModelSerializer):
87120
industry_id = serializers.IntegerField(required=False)
88121
views_count = serializers.SerializerMethodField(method_name="count_views")
89122
links = serializers.SerializerMethodField()
90-
partner_programs_tags = serializers.SerializerMethodField()
123+
partner_program = serializers.SerializerMethodField()
124+
partner_program_tags = serializers.SerializerMethodField()
91125
track = serializers.CharField(required=False, allow_null=True, allow_blank=True)
92126
direction = serializers.CharField(required=False, allow_null=True, allow_blank=True)
93127
actuality = serializers.CharField(required=False, allow_null=True, allow_blank=True)
94128
goal = serializers.CharField(required=False, allow_null=True, allow_blank=True)
95129
problem = serializers.CharField(required=False, allow_null=True, allow_blank=True)
96-
can_submit = serializers.SerializerMethodField()
97-
is_submitted = serializers.SerializerMethodField()
98-
partner_program_fields = serializers.SerializerMethodField()
99-
partner_program_field_values = serializers.SerializerMethodField()
100-
partner_program_id = serializers.SerializerMethodField()
101-
102-
# Необходимо оптимизировать запросы с получением информации
103-
# о програмах по всему классу.
104-
def get_program_project(self, project):
105-
try:
106-
return project.program_links.select_related("partner_program").get()
107-
except PartnerProgramProject.DoesNotExist:
108-
return None
109-
110-
def get_is_submitted(self, project):
111-
program_project = self.get_program_project(project)
112-
return program_project.submitted if program_project else False
113-
114-
def get_can_submit(self, project):
115-
program_project = self.get_program_project(project)
116-
if not program_project:
117-
return False
118-
119-
return (
120-
program_project.partner_program.is_competitive
121-
and not program_project.submitted
122-
)
123-
124-
def get_partner_program_fields(self, project):
125-
try:
126-
program_project = project.program_links.select_related(
127-
"partner_program"
128-
).get()
129-
except PartnerProgramProject.DoesNotExist:
130-
return []
131-
fields_qs = program_project.partner_program.fields.all()
132-
serializer = PartnerProgramFieldSerializer(fields_qs, many=True)
133-
return serializer.data
134-
135-
def get_partner_program_field_values(self, project):
136-
try:
137-
program_project = project.program_links.select_related(
138-
"partner_program"
139-
).get()
140-
except PartnerProgramProject.DoesNotExist:
141-
return []
142-
values_qs = PartnerProgramFieldValue.objects.filter(
143-
program_project=program_project
144-
).select_related("field")
145-
serializer = PartnerProgramFieldValueSerializer(values_qs, many=True)
146-
return serializer.data
147130

148-
def get_partner_program_id(self, project):
131+
def get_partner_program(self, project):
149132
try:
150133
link = project.program_links.select_related("partner_program").get()
151-
return link.partner_program.id
134+
return PartnerProgramProjectSerializer(link).data
152135
except PartnerProgramProject.DoesNotExist:
153136
return None
154137

155138
@classmethod
156-
def get_partner_programs_tags(cls, project):
139+
def get_partner_program_tags(cls, project):
157140
profiles_qs = project.partner_program_profiles.select_related(
158141
"partner_program"
159142
).only("partner_program__tag")
@@ -204,17 +187,13 @@ class Meta:
204187
"views_count",
205188
"cover",
206189
"cover_image_address",
207-
"can_submit",
208-
"is_submitted",
209-
"partner_programs_tags",
210-
"partner_program_id",
211-
"partner_program_fields",
212-
"partner_program_field_values",
213190
"track",
214191
"direction",
215192
"actuality",
216193
"goal",
217194
"problem",
195+
"partner_program_tags",
196+
"partner_program",
218197
]
219198
read_only_fields = [
220199
"leader",

0 commit comments

Comments
 (0)