@@ -134,19 +134,8 @@ class TargetSerializer(serializers.ModelSerializer):
134
134
zip_archive = serializers .SerializerMethodField ()
135
135
metadata = serializers .SerializerMethodField ()
136
136
137
- def get_template_protein (self , obj ):
138
- exp_upload = (
139
- models .ExperimentUpload .objects .filter (
140
- target = obj ,
141
- )
142
- .order_by ('-commit_datetime' )
143
- .first ()
144
- )
145
-
146
- yaml_path = exp_upload .get_upload_path ()
147
-
148
- # last components of path, need for reconstruction later
149
- comps = yaml_path .parts [- 2 :]
137
+ def get_template_protein_path (self , experiment_upload ) -> Path | None :
138
+ yaml_path = experiment_upload .get_upload_path ()
150
139
151
140
# and the file itself
152
141
yaml_path = yaml_path .joinpath (XTALFORMS_FILE )
@@ -158,44 +147,56 @@ def get_template_protein(self, obj):
158
147
assemblies = contents ["assemblies" ]
159
148
except KeyError :
160
149
logger .error ("No 'assemblies' section in '%s'" , XTALFORMS_FILE )
161
- return ''
150
+ return None
162
151
163
152
try :
164
153
first = list (assemblies .values ())[0 ]
165
154
except IndexError :
166
155
logger .error ("No assemblies in 'assemblies' section" )
167
- return ''
156
+ return None
168
157
169
158
try :
170
159
reference = first ["reference" ]
171
160
except KeyError :
172
161
logger .error ("No assemblies in 'assemblies' section" )
173
- return ''
162
+ return None
174
163
175
164
ref_path = (
176
165
Path (settings .TARGET_LOADER_MEDIA_DIRECTORY )
177
- .joinpath (exp_upload .task_id )
178
- .joinpath (comps [0 ])
179
- .joinpath (comps [1 ])
166
+ .joinpath (experiment_upload .target .zip_archive .name )
167
+ .joinpath (experiment_upload .upload_data_dir )
180
168
.joinpath ("crystallographic_files" )
181
169
.joinpath (reference )
182
170
.joinpath (f"{ reference } .pdb" )
183
171
)
184
172
logger .debug ('ref_path: %s' , ref_path )
185
173
if Path (settings .MEDIA_ROOT ).joinpath (ref_path ).is_file ():
186
- request = self .context .get ('request' , None )
187
- if request is not None :
188
- return request .build_absolute_uri (
189
- Path (settings .MEDIA_URL ).joinpath (ref_path )
190
- )
191
- else :
192
- return ''
174
+ return ref_path
193
175
else :
194
176
logger .error ("Reference pdb file doesn't exist" )
195
- return ''
177
+ return None
196
178
else :
197
179
logger .error ("'%s' missing" , XTALFORMS_FILE )
198
- return ''
180
+ return None
181
+
182
+ def get_template_protein (self , obj ):
183
+ # loop through exp uploads from latest to earliest, and try to
184
+ # find template protein
185
+ for exp_upload in models .ExperimentUpload .objects .filter (
186
+ target = obj ,
187
+ ).order_by ('-commit_datetime' ):
188
+ path = self .get_template_protein_path (exp_upload )
189
+ if path is None :
190
+ continue
191
+ else :
192
+ request = self .context .get ('request' , None )
193
+ if request is not None :
194
+ return request .build_absolute_uri (
195
+ Path (settings .MEDIA_URL ).joinpath (path )
196
+ )
197
+ else :
198
+ return None
199
+ return None
199
200
200
201
def get_zip_archive (self , obj ):
201
202
# The if-check is because the filefield in target has null=True.
0 commit comments