@receiver(post_delete,sender=Dataset)defdelete_dataset_from_v2(sender,instance:Dataset,**kwargs):"""Sync Metax V2 when deleting dataset from v3"""ifnotsettings.METAX_V2_INTEGRATION_ENABLED:returnparams={"removed":"true","hard":"true"}if"soft"inkwargsandkwargs["soft"]isTrue:params["hard"]=Nonehost,headers=get_v2_request_settings()res=requests.delete(url=f"{host}/{instance.id}",headers=headers,params=params)ifres.status_code<=204:logger.info(f"response form metax v2: {res}")returnlogger.warning(f"Syncing data with Metax v2 did not work properly: {res.content=}")
defjson_serial(obj):"""JSON serializer for objects not serializable by default json code"""ifisinstance(obj,(datetime,date)):returnobj.isoformat()raiseTypeError("Type %s not serializable"%type(obj))
defupdate_dataset_in_v2(dataset:Dataset,created=False):ifnotsettings.METAX_V2_INTEGRATION_ENABLED:returnifdataset.state!="published"ordataset.removedordataset.api_version<3:returnv2_dataset=dataset.as_v2_dataset()identifier=v2_dataset["identifier"]host,headers=get_v2_request_settings()found=Falseifnotcreated:response=requests.get(url=f"{host}/{identifier}",headers=headers)found=response.status_code==200res:requests.Responsebody=json.dumps(v2_dataset,cls=DjangoJSONEncoder)iffound:res=requests.put(url=f"{host}/{identifier}?migration_override",data=body,headers=headers)else:res=requests.post(url=f"{host}?migration_override",data=body,headers=headers)ifres.status_codein{200,201}:logger.info(f"Sync {identifier} to V2: {res.status_code=}")else:logger.error(f"Sync {identifier} to V2 failed: {res.status_code=}:\n{res.content=}, \n{res.headers=}")raiseLegacyUpdateFailed(f"Failed to sync dataset ({identifier}) to Metax V2")