#31 API basic implementation Refactor

* reorganizes code into proper api/utils/serializer subclasses to keep serialization logic away from regular view logic
This commit is contained in:
2022-01-24 10:31:48 +01:00
parent ee828598cc
commit a06eaa49fb
11 changed files with 328 additions and 260 deletions

View File

@@ -1,36 +0,0 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 21.01.22
"""
from api.views.v1.views import AbstractModelAPIViewV1
from compensation.models import Compensation
class APICompensationViewV1(AbstractModelAPIViewV1):
model = Compensation
def prepare_lookup(self, id):
self.lookup["id"] = id
del self.lookup["users__in"]
self.lookup["intervention__users__in"] = [self.user]
def intervention_to_json(self, entry):
return {
"id": entry.pk,
"identifier": entry.identifier,
"title": entry.title,
}
def extend_properties_data(self, entry):
self.properties_data["is_cef"] = entry.is_cef
self.properties_data["is_coherence_keeping"] = entry.is_coherence_keeping
self.properties_data["intervention"] = self.intervention_to_json(entry.intervention)
self.properties_data["before_states"] = self.compensation_state_to_json(entry.before_states.all())
self.properties_data["after_states"] = self.compensation_state_to_json(entry.after_states.all())
self.properties_data["actions"] = self.compensation_actions_to_json(entry.actions.all())
self.properties_data["deadlines"] = self.deadlines_to_json(entry.deadlines.all())

View File

@@ -1,37 +0,0 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 21.01.22
"""
from api.views.v1.views import AbstractModelAPIViewV1
from compensation.models import EcoAccount
from intervention.models import Legal, Responsibility
class APIEcoAccountViewV1(AbstractModelAPIViewV1):
model = EcoAccount
def extend_properties_data(self, entry):
self.properties_data["deductable_surface"] = entry.deductable_surface
self.properties_data["deductable_surface_available"] = entry.deductable_surface - entry.get_deductions_surface()
self.properties_data["responsible"] = self.responsible_to_json(entry.responsible)
self.properties_data["legal"] = self.legal_to_json(entry.legal)
self.properties_data["before_states"] = self.compensation_state_to_json(entry.before_states.all())
self.properties_data["after_states"] = self.compensation_state_to_json(entry.after_states.all())
self.properties_data["actions"] = self.compensation_actions_to_json(entry.actions.all())
self.properties_data["deadlines"] = self.deadlines_to_json(entry.deadlines.all())
self.properties_data["deductions"] = self.deductions_to_json(entry.deductions.all())
def legal_to_json(self, legal: Legal):
return {
"agreement_date": legal.registration_date,
}
def responsible_to_json(self, responsible: Responsibility):
return {
"conservation_office": self.konova_code_to_json(responsible.conservation_office),
"conservation_file_number": responsible.conservation_file_number,
"handler": responsible.handler,
}

View File

@@ -1,28 +0,0 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 21.01.22
"""
from api.views.v1.views import AbstractModelAPIViewV1
from ema.models import Ema
from intervention.models import Responsibility
class APIEmaViewV1(AbstractModelAPIViewV1):
model = Ema
def responsible_to_json(self, responsible: Responsibility):
return {
"conservation_office": self.konova_code_to_json(responsible.conservation_office),
"conservation_file_number": responsible.conservation_file_number,
"handler": responsible.handler,
}
def extend_properties_data(self, entry):
self.properties_data["responsible"] = self.responsible_to_json(entry.responsible)
self.properties_data["before_states"] = self.compensation_state_to_json(entry.before_states.all())
self.properties_data["after_states"] = self.compensation_state_to_json(entry.after_states.all())
self.properties_data["actions"] = self.compensation_actions_to_json(entry.actions.all())
self.properties_data["deadlines"] = self.deadlines_to_json(entry.deadlines.all())

View File

@@ -1,29 +0,0 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 21.01.22
"""
from django.db.models import QuerySet
from api.views.v1.views import AbstractModelAPIViewV1
from intervention.models import Intervention
class APIInterventionViewV1(AbstractModelAPIViewV1):
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())

View File

@@ -5,14 +5,13 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 21.01.22
"""
import json
from django.db.models import QuerySet
from django.http import JsonResponse, HttpRequest
from api.utils.v1.compensation import CompensationAPISerializerV1
from api.utils.v1.ecoaccount import EcoAccountAPISerializerV1
from api.utils.v1.ema import EmaAPISerializerV1
from api.utils.v1.intervention import InterventionAPISerializerV1
from api.views.views import AbstractModelAPIView
from codelist.models import KonovaCode
from intervention.models import Responsibility, Legal
class AbstractModelAPIViewV1(AbstractModelAPIView):
@@ -32,205 +31,25 @@ class AbstractModelAPIViewV1(AbstractModelAPIView):
Returns:
"""
self.prepare_lookup(id)
try:
data = self.fetch_and_serialize()
self.serializer.prepare_lookup(id, self.user)
data = self.serializer.fetch_and_serialize()
except Exception as e:
return self.return_error_response(e, 500)
return JsonResponse(data)
def model_to_geo_json(self, entry):
""" Adds the basic data, which all elements hold
Args:
entry (): The data entry
class InterventionAPIViewV1(AbstractModelAPIViewV1):
serializer = InterventionAPISerializerV1
Returns:
"""
geom = entry.geometry.geom.geojson
geo_json = json.loads(geom)
self.properties_data = {
"id": entry.id,
"identifier": entry.identifier,
"title": entry.title,
"created_on": self.created_on_to_json(entry),
"modified_on": self.modified_on_to_json(entry),
}
self.extend_properties_data(entry)
geo_json["properties"] = self.properties_data
return geo_json
class CompensationAPIViewV1(AbstractModelAPIViewV1):
serializer = CompensationAPISerializerV1
def prepare_lookup(self, id):
""" Customizes lookup values for db filtering
Args:
id (str): The entries id
class EcoAccountAPIViewV1(AbstractModelAPIViewV1):
serializer = EcoAccountAPISerializerV1
Returns:
"""
self.lookup["id"] = id
self.lookup["users__in"] = [self.user]
def konova_code_to_json(self, konova_code: KonovaCode):
""" Serializes KonovaCode model into json
Args:
konova_code (KonovaCode): The KonovaCode entry
Returns:
serialized_json (dict)
"""
return {
"atom_id": konova_code.atom_id,
"long_name": konova_code.long_name,
"short_name": konova_code.short_name,
}
def responsible_to_json(self, responsible: Responsibility):
""" Serializes Responsibility model into json
Args:
responsible (Responsibility): The Responsibility entry
Returns:
serialized_json (dict)
"""
return {
"registration_office": self.konova_code_to_json(responsible.registration_office),
"registration_file_number": responsible.registration_file_number,
"conservation_office": self.konova_code_to_json(responsible.conservation_office),
"conservation_file_number": responsible.conservation_file_number,
"handler": responsible.handler,
}
def legal_to_json(self, legal: Legal):
""" Serializes Legal model into json
Args:
legal (Legal): The Legal entry
Returns:
serialized_json (dict)
"""
return {
"registration_date": legal.registration_date,
"binding_date": legal.binding_date,
"process_type": self.konova_code_to_json(legal.process_type),
"laws": [self.konova_code_to_json(law) for law in legal.laws.all()],
}
def payments_to_json(self, qs: QuerySet):
""" Serializes payments into json
Args:
qs (QuerySet): A queryset of Payment entries
Returns:
serialized_json (list)
"""
return list(qs.values("amount", "due_on", "comment"))
def deductions_to_json(self, qs: QuerySet):
""" Serializes eco account deductions into json
Args:
qs (QuerySet): A queryset of EcoAccountDeduction entries
Returns:
serialized_json (list)
"""
return [
{
"id": entry.pk,
"eco_account": {
"id": entry.account.pk,
"identifier": entry.account.identifier,
"title": entry.account.title,
},
"surface": entry.surface,
"intervention": {
"id": entry.intervention.pk,
"identifier": entry.intervention.identifier,
"title": entry.intervention.title,
}
}
for entry in qs
]
def compensation_state_to_json(self, qs: QuerySet):
""" Serializes compensation states into json
Args:
qs (QuerySet): A queryset of CompensationState entries
Returns:
serialized_json (list)
"""
return [
{
"biotope": self.konova_code_to_json(entry.biotope_type),
"surface": entry.surface,
}
for entry in qs
]
def compensation_actions_to_json(self, qs: QuerySet):
""" Serializes CompensationActions into json
Args:
qs (QuerySet): A queryset of CompensationAction entries
Returns:
serialized_json (list)
"""
return [
{
"action": self.konova_code_to_json(entry.action_type),
"amount": entry.amount,
"unit": entry.unit,
"comment": entry.comment,
}
for entry in qs
]
def deadlines_to_json(self, qs: QuerySet):
""" Serializes deadlines into json
Args:
qs (QuerySet): A queryset of Deadline entries
Returns:
serialized_json (list)
"""
return list(qs.values(
"type",
"date",
"comment",
))
def created_on_to_json(self, entry):
""" Serializes the created_on into json
Args:
entry (BaseObject): The entry
Returns:
created_on (timestamp)
"""
return entry.created.timestamp
def modified_on_to_json(self, entry):
""" Serializes the modified_on into json
Args:
entry (BaseObject): The entry
Returns:
modified_on (timestamp)
"""
modified_on = entry.modified or entry.created
modified_on = modified_on.timestamp
return modified_on
class EmaAPIViewV1(AbstractModelAPIViewV1):
serializer = EmaAPISerializerV1