@@ -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+
79112class 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