#31 API POST/PUT Intervention

* splits code in smaller, reusable methods
* adds put method to view
* adds update_model_from_json() method
This commit is contained in:
mpeltriaux 2022-01-24 13:04:39 +01:00
parent 854e358b73
commit b1a42b126e
3 changed files with 108 additions and 36 deletions

View File

@ -78,6 +78,20 @@ class AbstractModelAPISerializer:
serialized_data = self.model_to_geo_json(entry)
return serialized_data
@abstractmethod
def update_model_from_json(self, id, json_model, user):
""" Updates an instance from given json data
Args:
id (str): The instance's to be updated
json_model (dict): JSON data
user (User): The performing user
Returns:
"""
raise NotImplementedError("Must be implemented in subclasses")
@abstractmethod
def create_model_from_json(self, json_model, user):
""" Creates a new instance from given json data

View File

@ -34,47 +34,96 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1):
self.properties_data["payments"] = self.payments_to_json(entry.payments.all())
self.properties_data["deductions"] = self.deductions_to_json(entry.deductions.all())
def create_model_from_json(self, json_model, user):
with transaction.atomic():
# Create geometry
json_geom = self.create_geometry_from_json(json_model)
geometry = Geometry()
geometry.geom = json_geom
def initialize_objects(self, json_model, user):
""" Initializes all needed objects from the json_model data
# Create linked objects
obj = Intervention()
resp = Responsibility()
legal = Legal()
created = UserActionLogEntry.get_created_action(user, comment="API Import")
obj.legal = legal
obj.created = created
obj.geometry = geometry
obj.responsible = resp
Does not persist data to the DB!
Args:
json_model (dict): The json data
user (User): The API user
Returns:
obj (Intervention)
"""
# Create geometry
json_geom = self.create_geometry_from_json(json_model)
geometry = Geometry()
geometry.geom = json_geom
# Create linked objects
obj = Intervention()
resp = Responsibility()
legal = Legal()
created = UserActionLogEntry.get_created_action(user, comment="API Import")
obj.legal = legal
obj.created = created
obj.geometry = geometry
obj.responsible = resp
return obj
def set_legal(self, obj, legal_data):
""" Sets the legal data contents to the provided legal_data dict
Args:
obj (Intervention): The intervention object
legal_data (dict): The new data
Returns:
obj
"""
obj.legal.registration_date = legal_data["registration_date"]
obj.legal.binding_date = legal_data["binding_date"]
obj.legal.process_type = self.konova_code_from_json(
legal_data["process_type"],
CODELIST_PROCESS_TYPE_ID,
)
laws = [self.konova_code_from_json(law, CODELIST_LAW_ID) for law in legal_data["laws"]]
obj.legal.laws.set(laws)
return obj
def set_responsibility(self, obj, responsibility_data: dict):
""" Sets the responsible data contents to the provided responsibility_data dict
Args:
obj (Intervention): The intervention object
responsibility_data (dict): The new data
Returns:
obj
"""
obj.responsible.registration_office = self.konova_code_from_json(
responsibility_data["registration_office"],
CODELIST_REGISTRATION_OFFICE_ID
)
obj.responsible.registration_file_number = responsibility_data["registration_file_number"]
obj.responsible.conservation_office = self.konova_code_from_json(
responsibility_data["conservation_office"],
CODELIST_CONSERVATION_OFFICE_ID,
)
obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"]
obj.responsible.handler = responsibility_data["handler"]
return obj
def create_model_from_json(self, json_model, user):
""" Creates a new entry for the model based on the contents of json_model
Args:
json_model (dict): The json containing data
user (User): The API user
Returns:
created_id (str): The id of the newly created Intervention entry
"""
with transaction.atomic():
obj = self.initialize_objects(json_model, user)
# Fill in data to objects
properties = json_model["properties"]
obj.identifier = obj.generate_new_identifier()
obj.title = properties["title"]
obj.responsible.registration_office = self.konova_code_from_json(
properties["responsible"]["registration_office"],
CODELIST_REGISTRATION_OFFICE_ID
)
obj.responsible.registration_file_number = properties["responsible"]["registration_file_number"]
obj.responsible.conservation_office = self.konova_code_from_json(
properties["responsible"]["conservation_office"],
CODELIST_CONSERVATION_OFFICE_ID,
)
obj.responsible.conservation_file_number = properties["responsible"]["conservation_file_number"]
obj.responsible.handler = properties["responsible"]["handler"]
obj.legal.registration_date = properties["legal"]["registration_date"]
obj.legal.binding_date = properties["legal"]["binding_date"]
obj.legal.process_type = self.konova_code_from_json(
properties["legal"]["process_type"],
CODELIST_PROCESS_TYPE_ID,
)
laws = [self.konova_code_from_json(law, CODELIST_LAW_ID) for law in properties["legal"]["laws"]]
obj.legal.laws.set(laws)
self.set_responsibility(obj, properties["responsible"])
self.set_legal(obj, properties["legal"])
obj.responsible.save()
obj.geometry.save()
@ -83,6 +132,6 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1):
obj.users.add(user)
celery_update_parcels.delay(geometry.id)
celery_update_parcels.delay(obj.geometry.id)
return obj.id

View File

@ -51,6 +51,15 @@ class AbstractModelAPIViewV1(AbstractModelAPIView):
return self.return_error_response(e, 500)
return JsonResponse({"id": created_id})
def put(self, request: HttpRequest, id=None):
try:
body = request.body.decode("utf-8")
body = json.loads(body)
updated_id = self.serializer.update_model_from_json(id, body, self.user)
except Exception as e:
return self.return_error_response(e, 500)
return JsonResponse({"id": updated_id})
class InterventionAPIViewV1(AbstractModelAPIViewV1):
serializer = InterventionAPISerializerV1