mpeltriaux
fa01733815
* adds support for POST of new compensations * adds shared_users property to BaseObject and Compensation to simplify fetching of shared users (Compensation inherits from intervention) * extends compensation admin index * modifies compensation manager which led to invisibility of deleted entries in the admin backend * fixes bug in sanitize_db.py where CREATED useractions would be removed if they are not found on any log but still are used on the .created attribute of the objects
173 lines
5.9 KiB
Python
173 lines
5.9 KiB
Python
"""
|
|
Author: Michel Peltriaux
|
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
|
Contact: michel.peltriaux@sgdnord.rlp.de
|
|
Created on: 24.01.22
|
|
|
|
"""
|
|
from django.db import transaction
|
|
from django.db.models import QuerySet
|
|
|
|
from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1
|
|
from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID, \
|
|
CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID
|
|
from intervention.models import Intervention, Responsibility, Legal
|
|
from konova.models import Geometry
|
|
from konova.tasks import celery_update_parcels
|
|
from user.models import UserActionLogEntry
|
|
|
|
|
|
class InterventionAPISerializerV1(AbstractModelAPISerializerV1):
|
|
model = Intervention
|
|
|
|
def compensations_to_json(self, qs: QuerySet):
|
|
return list(
|
|
qs.values(
|
|
"id", "identifier", "title"
|
|
)
|
|
)
|
|
|
|
def extend_properties_data(self, entry):
|
|
self.properties_data["responsible"] = self.responsible_to_json(entry.responsible)
|
|
self.properties_data["legal"] = self.legal_to_json(entry.legal)
|
|
self.properties_data["compensations"] = self.compensations_to_json(entry.compensations.all())
|
|
self.properties_data["payments"] = self.payments_to_json(entry.payments.all())
|
|
self.properties_data["deductions"] = self.deductions_to_json(entry.deductions.all())
|
|
|
|
def initialize_objects(self, json_model, user):
|
|
""" Initializes all needed objects from the json_model data
|
|
|
|
Does not persist data to the DB!
|
|
|
|
Args:
|
|
json_model (dict): The json data
|
|
user (User): The API user
|
|
|
|
Returns:
|
|
obj (Intervention)
|
|
"""
|
|
create_action = UserActionLogEntry.get_created_action(user, comment="API Import")
|
|
# Create geometry
|
|
json_geom = self.create_geometry_from_json(json_model)
|
|
geometry = Geometry()
|
|
geometry.geom = json_geom
|
|
geometry.created = create_action
|
|
|
|
# Create linked objects
|
|
obj = Intervention()
|
|
resp = Responsibility()
|
|
legal = Legal()
|
|
created = create_action
|
|
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"]
|
|
self.set_responsibility(obj, properties["responsible"])
|
|
self.set_legal(obj, properties["legal"])
|
|
|
|
obj.responsible.save()
|
|
obj.geometry.save()
|
|
obj.legal.save()
|
|
obj.save()
|
|
|
|
obj.users.add(user)
|
|
obj.log.add(obj.created)
|
|
|
|
celery_update_parcels.delay(obj.geometry.id)
|
|
|
|
return obj.id
|
|
|
|
def update_model_from_json(self, id, json_model, user):
|
|
""" Updates an entry for the model based on the contents of json_model
|
|
|
|
Args:
|
|
id (str): The object's id
|
|
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.get_obj_from_db(id, user)
|
|
|
|
# Fill in data to objects
|
|
properties = json_model["properties"]
|
|
obj.title = properties["title"]
|
|
self.set_responsibility(obj, properties["responsible"])
|
|
self.set_legal(obj, properties["legal"])
|
|
obj.geometry.geom = self.create_geometry_from_json(json_model)
|
|
|
|
obj.responsible.save()
|
|
obj.geometry.save()
|
|
obj.legal.save()
|
|
obj.save()
|
|
|
|
obj.users.add(user)
|
|
|
|
celery_update_parcels.delay(obj.geometry.id)
|
|
|
|
return obj.id
|