@@ -139,12 +139,21 @@ def get_aas_descriptor_by_id(self, request: Request, url_args: Dict, response_t:
139139 return response_t (descriptor )
140140
141141 def put_aas_descriptor_by_id (self , request : Request , url_args : Dict , response_t : Type [APIResponse ],
142- ** _kwargs ) -> Response :
143- descriptor = self ._get_aas_descriptor (url_args )
144- descriptor .update_from (HTTPApiDecoder .request_body (request , server_model .AssetAdministrationShellDescriptor ,
145- is_stripped_request (request )))
146- descriptor .commit ()
147- return response_t ()
142+ map_adapter : MapAdapter , ** _kwargs ) -> Response :
143+ try :
144+ descriptor = self ._get_aas_descriptor (url_args )
145+ descriptor .update_from (HTTPApiDecoder .request_body (request , server_model .AssetAdministrationShellDescriptor ,
146+ is_stripped_request (request )))
147+ descriptor .commit ()
148+ return response_t ()
149+ except NotFound :
150+ descriptor = HTTPApiDecoder .request_body (request , server_model .AssetAdministrationShellDescriptor , False )
151+ self .object_store .add (descriptor )
152+ descriptor .commit ()
153+ created_resource_url = map_adapter .build (self .get_aas_descriptor_by_id , {
154+ "aas_id" : descriptor .id
155+ }, force_external = True )
156+ return response_t (descriptor , status = 201 , headers = {"Location" : created_resource_url })
148157
149158 def delete_aas_descriptor_by_id (self , request : Request , url_args : Dict , response_t : Type [APIResponse ],
150159 ** _kwargs ) -> Response :
@@ -211,21 +220,36 @@ def put_submodel_descriptor_by_id_through_superpath(self,
211220 response_t :
212221 Type [
213222 APIResponse ],
214- ** _kwargs ) -> Response :
223+ map_adapter : MapAdapter , ** _kwargs ) -> Response :
215224 aas_descriptor = self ._get_aas_descriptor (url_args )
216- submodel_id = url_args ["submodel_id" ]
217- submodel_descriptor = next (
218- (sd for sd in aas_descriptor .submodel_descriptors if
219- sd .id == submodel_id ), None )
220- if submodel_descriptor is None :
221- raise NotFound (
222- f"Submodel Descriptor with Identifier { submodel_id } not found in AssetAdministrationShell!" )
223- submodel_descriptor .update_from (
224- HTTPApiDecoder .request_body (request ,
225- server_model .SubmodelDescriptor ,
226- is_stripped_request (request )))
227- aas_descriptor .commit ()
228- return response_t ()
225+ try :
226+ submodel_id = url_args ["submodel_id" ]
227+ submodel_descriptor = next (
228+ (sd for sd in aas_descriptor .submodel_descriptors if
229+ sd .id == submodel_id ), None )
230+ if submodel_descriptor is None :
231+ raise NotFound (
232+ f"Submodel Descriptor with Identifier { submodel_id } not found in AssetAdministrationShell!" )
233+ submodel_descriptor .update_from (
234+ HTTPApiDecoder .request_body (request ,
235+ server_model .SubmodelDescriptor ,
236+ is_stripped_request (request )))
237+ aas_descriptor .commit ()
238+ return response_t ()
239+ except NotFound :
240+ submodel_descriptor = HTTPApiDecoder .request_body (request ,
241+ server_model .SubmodelDescriptor ,
242+ is_stripped_request (
243+ request ))
244+ aas_descriptor .submodel_descriptors .append (submodel_descriptor )
245+ aas_descriptor .commit ()
246+ created_resource_url = map_adapter .build (
247+ self .get_submodel_descriptor_by_id_through_superpath , {
248+ "aas_id" : aas_descriptor .id ,
249+ "submodel_id" : submodel_descriptor .id
250+ }, force_external = True )
251+ return response_t (submodel_descriptor , status = 201 ,
252+ headers = {"Location" : created_resource_url })
229253
230254 def delete_submodel_descriptor_by_id_through_superpath (self ,
231255 request : Request ,
@@ -270,12 +294,22 @@ def post_submodel_descriptor(self, request: Request, url_args: Dict, response_t:
270294 return response_t (submodel_descriptor , status = 201 , headers = {"Location" : created_resource_url })
271295
272296 def put_submodel_descriptor_by_id (self , request : Request , url_args : Dict , response_t : Type [APIResponse ],
273- ** _kwargs ) -> Response :
274- submodel_descriptor = self ._get_submodel_descriptor (url_args )
275- submodel_descriptor .update_from (
276- HTTPApiDecoder .request_body (request , server_model .SubmodelDescriptor , is_stripped_request (request )))
277- submodel_descriptor .commit ()
278- return response_t ()
297+ map_adapter : MapAdapter , ** _kwargs ) -> Response :
298+ try :
299+ submodel_descriptor = self ._get_submodel_descriptor (url_args )
300+ submodel_descriptor .update_from (
301+ HTTPApiDecoder .request_body (request , server_model .SubmodelDescriptor , is_stripped_request (request )))
302+ submodel_descriptor .commit ()
303+ return response_t ()
304+ except NotFound :
305+ submodel_descriptor = HTTPApiDecoder .request_body (request , server_model .SubmodelDescriptor ,
306+ is_stripped_request (request ))
307+ self .object_store .add (submodel_descriptor )
308+ submodel_descriptor .commit ()
309+ created_resource_url = map_adapter .build (self .get_submodel_descriptor_by_id , {
310+ "submodel_id" : submodel_descriptor .id
311+ }, force_external = True )
312+ return response_t (submodel_descriptor , status = 201 , headers = {"Location" : created_resource_url })
279313
280314 def delete_submodel_descriptor_by_id (self , request : Request , url_args : Dict , response_t : Type [APIResponse ],
281315 ** _kwargs ) -> Response :
0 commit comments