2022-01-28 15:44:09 +01:00
|
|
|
"""
|
|
|
|
Author: Michel Peltriaux
|
|
|
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
|
|
|
Contact: michel.peltriaux@sgdnord.rlp.de
|
|
|
|
Created on: 28.01.22
|
|
|
|
|
|
|
|
"""
|
|
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
|
|
|
|
|
|
from api.utils.serializer.v1.serializer import DeductableAPISerializerV1Mixin, AbstractModelAPISerializerV1
|
|
|
|
from compensation.models import EcoAccountDeduction, EcoAccount
|
|
|
|
from intervention.models import Intervention
|
|
|
|
from konova.utils.message_templates import DATA_UNSHARED
|
|
|
|
|
|
|
|
|
|
|
|
class DeductionAPISerializerV1(AbstractModelAPISerializerV1,
|
|
|
|
DeductableAPISerializerV1Mixin):
|
|
|
|
model = EcoAccountDeduction
|
|
|
|
|
|
|
|
def prepare_lookup(self, _id, user):
|
|
|
|
""" Updates lookup dict for db fetching
|
|
|
|
|
|
|
|
Args:
|
|
|
|
_id (str): The object's id
|
|
|
|
user (User): The user requesting for
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
"""
|
|
|
|
super().prepare_lookup(_id, user)
|
|
|
|
del self.lookup["users__in"]
|
|
|
|
del self.lookup["deleted__isnull"]
|
|
|
|
self.lookup["intervention__users__in"] = [user]
|
|
|
|
|
|
|
|
def _model_to_geo_json(self, entry):
|
|
|
|
""" Adds the basic data
|
|
|
|
|
|
|
|
Args:
|
|
|
|
entry (): The data entry
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
"""
|
|
|
|
return self._single_deduction_to_json(entry)
|
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
acc_id = json_model["eco_account"]
|
|
|
|
intervention_id = json_model["intervention"]
|
|
|
|
surface = float(json_model["surface"])
|
|
|
|
if surface <= 0:
|
|
|
|
raise ValueError("Surface must be > 0 m²")
|
|
|
|
|
|
|
|
acc = EcoAccount.objects.get(
|
|
|
|
id=acc_id,
|
|
|
|
deleted__isnull=True,
|
|
|
|
)
|
|
|
|
intervention = Intervention.objects.get(
|
|
|
|
id=intervention_id,
|
|
|
|
deleted__isnull=True,
|
|
|
|
)
|
|
|
|
acc_shared = acc.is_shared_with(user)
|
|
|
|
intervention_shared = intervention.is_shared_with(user)
|
|
|
|
if not acc_shared:
|
|
|
|
raise PermissionError(f"Account: {DATA_UNSHARED}")
|
|
|
|
if not intervention_shared:
|
|
|
|
raise PermissionError(f"Intervention: {DATA_UNSHARED}")
|
|
|
|
|
|
|
|
deduction = self.model.objects.create(
|
|
|
|
intervention=intervention,
|
|
|
|
account=acc,
|
|
|
|
surface=surface
|
|
|
|
)
|
2022-01-28 15:55:00 +01:00
|
|
|
deduction.intervention.mark_as_edited(user)
|
2022-01-28 15:44:09 +01:00
|
|
|
return str(deduction.id)
|
|
|
|
|
|
|
|
def _get_obj_from_db(self, id, user):
|
|
|
|
""" Returns the object from database
|
|
|
|
|
|
|
|
Fails if id not found or user does not have shared access
|
|
|
|
|
|
|
|
Args:
|
|
|
|
id (str): The object's id
|
|
|
|
user (User): The API user
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
"""
|
|
|
|
obj = self.model.objects.get(
|
|
|
|
id=id,
|
|
|
|
)
|
|
|
|
shared_with = obj.intervention.is_shared_with(user)
|
|
|
|
if not shared_with:
|
|
|
|
raise PermissionError(f"Intervention: {DATA_UNSHARED}")
|
|
|
|
return obj
|
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
deduction = self._get_obj_from_db(id, user)
|
|
|
|
|
|
|
|
acc_id = json_model["eco_account"]
|
|
|
|
intervention_id = json_model["intervention"]
|
|
|
|
surface = float(json_model["surface"])
|
|
|
|
if surface <= 0:
|
|
|
|
raise ValueError("Surface must be > 0 m²")
|
|
|
|
|
|
|
|
acc = EcoAccount.objects.get(
|
|
|
|
id=acc_id,
|
|
|
|
deleted__isnull=True,
|
|
|
|
)
|
|
|
|
intervention = Intervention.objects.get(
|
|
|
|
id=intervention_id,
|
|
|
|
deleted__isnull=True,
|
|
|
|
)
|
|
|
|
acc_shared = acc.is_shared_with(user)
|
|
|
|
intervention_shared = intervention.is_shared_with(user)
|
|
|
|
if not acc_shared:
|
|
|
|
raise PermissionError(f"Account: {DATA_UNSHARED}")
|
|
|
|
if not intervention_shared:
|
|
|
|
raise PermissionError(f"Intervention: {DATA_UNSHARED}")
|
|
|
|
|
|
|
|
deduction.intervention = intervention
|
|
|
|
deduction.account = acc
|
|
|
|
deduction.surface = surface
|
|
|
|
deduction.save()
|
|
|
|
|
2022-01-28 15:55:00 +01:00
|
|
|
deduction.intervention.mark_as_edited(user)
|
|
|
|
|
2022-01-28 15:44:09 +01:00
|
|
|
return str(deduction.id)
|
|
|
|
|
|
|
|
def delete_entry(self, id, user):
|
|
|
|
""" Deletes the entry
|
|
|
|
|
|
|
|
Args:
|
|
|
|
id (str): The entry's id
|
|
|
|
user (User): The API user
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
"""
|
|
|
|
entry = self._get_obj_from_db(id, user)
|
|
|
|
entry.intervention.mark_as_edited(user)
|
|
|
|
entry.delete()
|
|
|
|
try:
|
|
|
|
entry.refresh_from_db()
|
|
|
|
success = False
|
|
|
|
except ObjectDoesNotExist:
|
|
|
|
success = True
|
|
|
|
return success
|