#31 API POST Intervention
* adds support for proper POST of intervention * makes /<id> optional (required for Post)
This commit is contained in:
parent
45ac5b68b9
commit
d0f3fb9f61
@ -12,7 +12,11 @@ from api.views.v1.views import EmaAPIViewV1, EcoAccountAPIViewV1, CompensationAP
|
|||||||
app_name = "v1"
|
app_name = "v1"
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("intervention/<id>", InterventionAPIViewV1.as_view(), name="intervention"),
|
path("intervention/<id>", InterventionAPIViewV1.as_view(), name="intervention"),
|
||||||
|
path("intervention/", InterventionAPIViewV1.as_view(), name="intervention"),
|
||||||
path("compensation/<id>", CompensationAPIViewV1.as_view(), name="compensation"),
|
path("compensation/<id>", CompensationAPIViewV1.as_view(), name="compensation"),
|
||||||
|
path("compensation/", CompensationAPIViewV1.as_view(), name="compensation"),
|
||||||
path("ecoaccount/<id>", EcoAccountAPIViewV1.as_view(), name="ecoaccount"),
|
path("ecoaccount/<id>", EcoAccountAPIViewV1.as_view(), name="ecoaccount"),
|
||||||
|
path("ecoaccount/", EcoAccountAPIViewV1.as_view(), name="ecoaccount"),
|
||||||
path("ema/<id>", EmaAPIViewV1.as_view(), name="ema"),
|
path("ema/<id>", EmaAPIViewV1.as_view(), name="ema"),
|
||||||
|
path("ema/", EmaAPIViewV1.as_view(), name="ema"),
|
||||||
]
|
]
|
||||||
|
@ -5,12 +5,15 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
|||||||
Created on: 24.01.22
|
Created on: 24.01.22
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
import json
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
|
|
||||||
|
from django.contrib.gis import geos
|
||||||
|
from django.contrib.gis.geos import GEOSGeometry
|
||||||
|
|
||||||
|
|
||||||
class AbstractModelAPISerializer:
|
class AbstractModelAPISerializer:
|
||||||
model = None
|
model = None
|
||||||
user = None
|
|
||||||
lookup = None
|
lookup = None
|
||||||
properties_data = None
|
properties_data = None
|
||||||
|
|
||||||
@ -74,3 +77,30 @@ class AbstractModelAPISerializer:
|
|||||||
entry = self.model.objects.get(**self.lookup)
|
entry = self.model.objects.get(**self.lookup)
|
||||||
serialized_data = self.model_to_geo_json(entry)
|
serialized_data = self.model_to_geo_json(entry)
|
||||||
return serialized_data
|
return serialized_data
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def create_model_from_json(self, json_model, user):
|
||||||
|
""" Creates a new instance from given json data
|
||||||
|
|
||||||
|
Args:
|
||||||
|
json_model (dict): JSON data
|
||||||
|
user (User): The performing user
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
raise NotImplementedError("Must be implemented in subclasses")
|
||||||
|
|
||||||
|
def create_geometry_from_json(self, geojson) -> GEOSGeometry:
|
||||||
|
""" Creates a GEOSGeometry object based on the given geojson
|
||||||
|
|
||||||
|
Args:
|
||||||
|
geojson (str|dict): The geojson as str or dict
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
geometry (GEOSGeometry)
|
||||||
|
"""
|
||||||
|
if isinstance(geojson, dict):
|
||||||
|
geojson = json.dumps(geojson)
|
||||||
|
geometry = geos.fromstr(geojson)
|
||||||
|
return geometry
|
7
api/utils/serializer/v1/__init__.py
Normal file
7
api/utils/serializer/v1/__init__.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Author: Michel Peltriaux
|
||||||
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
||||||
|
Contact: michel.peltriaux@sgdnord.rlp.de
|
||||||
|
Created on: 24.01.22
|
||||||
|
|
||||||
|
"""
|
@ -5,7 +5,7 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
|||||||
Created on: 24.01.22
|
Created on: 24.01.22
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from api.utils.v1.serializer import AbstractModelAPISerializerV1
|
from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1
|
||||||
from compensation.models import Compensation
|
from compensation.models import Compensation
|
||||||
|
|
||||||
|
|
@ -5,7 +5,7 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
|||||||
Created on: 24.01.22
|
Created on: 24.01.22
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from api.utils.v1.serializer import AbstractModelAPISerializerV1
|
from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1
|
||||||
from compensation.models import EcoAccount
|
from compensation.models import EcoAccount
|
||||||
from intervention.models import Legal, Responsibility
|
from intervention.models import Legal, Responsibility
|
||||||
|
|
@ -5,7 +5,7 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
|||||||
Created on: 24.01.22
|
Created on: 24.01.22
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from api.utils.v1.serializer import AbstractModelAPISerializerV1
|
from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1
|
||||||
from ema.models import Ema
|
from ema.models import Ema
|
||||||
from intervention.models import Responsibility
|
from intervention.models import Responsibility
|
||||||
|
|
88
api/utils/serializer/v1/intervention.py
Normal file
88
api/utils/serializer/v1/intervention.py
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
"""
|
||||||
|
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 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
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
obj.responsible.save()
|
||||||
|
obj.geometry.save()
|
||||||
|
obj.legal.save()
|
||||||
|
obj.save()
|
||||||
|
|
||||||
|
obj.users.add(user)
|
||||||
|
|
||||||
|
celery_update_parcels.delay(geometry.id)
|
||||||
|
|
||||||
|
return obj.id
|
@ -10,7 +10,7 @@ import json
|
|||||||
|
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
|
|
||||||
from api.utils.serializer import AbstractModelAPISerializer
|
from api.utils.serializer.serializer import AbstractModelAPISerializer
|
||||||
from codelist.models import KonovaCode
|
from codelist.models import KonovaCode
|
||||||
from intervention.models import Responsibility, Legal
|
from intervention.models import Responsibility, Legal
|
||||||
|
|
||||||
@ -53,6 +53,22 @@ class AbstractModelAPISerializerV1(AbstractModelAPISerializer):
|
|||||||
"short_name": konova_code.short_name,
|
"short_name": konova_code.short_name,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def konova_code_from_json(self, json_str, code_list_identifier):
|
||||||
|
""" Returns a konova code instance
|
||||||
|
|
||||||
|
Args:
|
||||||
|
json_str (str): The value for the code (atom id)
|
||||||
|
code_list_identifier (str): From which konova code list this code is supposed to be from
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
code = KonovaCode.objects.get(
|
||||||
|
atom_id=json_str,
|
||||||
|
code_lists__in=[code_list_identifier]
|
||||||
|
)
|
||||||
|
return code
|
||||||
|
|
||||||
def responsible_to_json(self, responsible: Responsibility):
|
def responsible_to_json(self, responsible: Responsibility):
|
||||||
""" Serializes Responsibility model into json
|
""" Serializes Responsibility model into json
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
"""
|
|
||||||
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.models import QuerySet
|
|
||||||
|
|
||||||
from api.utils.v1.serializer import AbstractModelAPISerializerV1
|
|
||||||
from intervention.models import Intervention
|
|
||||||
|
|
||||||
|
|
||||||
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())
|
|
@ -5,12 +5,14 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
|||||||
Created on: 21.01.22
|
Created on: 21.01.22
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
import json
|
||||||
|
|
||||||
from django.http import JsonResponse, HttpRequest
|
from django.http import JsonResponse, HttpRequest
|
||||||
|
|
||||||
from api.utils.v1.compensation import CompensationAPISerializerV1
|
from api.utils.serializer.v1.compensation import CompensationAPISerializerV1
|
||||||
from api.utils.v1.ecoaccount import EcoAccountAPISerializerV1
|
from api.utils.serializer.v1.ecoaccount import EcoAccountAPISerializerV1
|
||||||
from api.utils.v1.ema import EmaAPISerializerV1
|
from api.utils.serializer.v1.ema import EmaAPISerializerV1
|
||||||
from api.utils.v1.intervention import InterventionAPISerializerV1
|
from api.utils.serializer.v1.intervention import InterventionAPISerializerV1
|
||||||
from api.views.views import AbstractModelAPIView
|
from api.views.views import AbstractModelAPIView
|
||||||
|
|
||||||
|
|
||||||
@ -19,7 +21,7 @@ class AbstractModelAPIViewV1(AbstractModelAPIView):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def get(self, request: HttpRequest, id):
|
def get(self, request: HttpRequest, id=None):
|
||||||
""" Handles the GET request
|
""" Handles the GET request
|
||||||
|
|
||||||
Performs the fetching and serialization of the data
|
Performs the fetching and serialization of the data
|
||||||
@ -32,12 +34,23 @@ class AbstractModelAPIViewV1(AbstractModelAPIView):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
|
if id is None:
|
||||||
|
raise AttributeError("No id provided")
|
||||||
self.serializer.prepare_lookup(id, self.user)
|
self.serializer.prepare_lookup(id, self.user)
|
||||||
data = self.serializer.fetch_and_serialize()
|
data = self.serializer.fetch_and_serialize()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return self.return_error_response(e, 500)
|
return self.return_error_response(e, 500)
|
||||||
return JsonResponse(data)
|
return JsonResponse(data)
|
||||||
|
|
||||||
|
def post(self, request: HttpRequest, id=None):
|
||||||
|
try:
|
||||||
|
body = request.body.decode("utf-8")
|
||||||
|
body = json.loads(body)
|
||||||
|
created_id = self.serializer.create_model_from_json(body, self.user)
|
||||||
|
except Exception as e:
|
||||||
|
return self.return_error_response(e, 500)
|
||||||
|
return JsonResponse({"id": created_id})
|
||||||
|
|
||||||
|
|
||||||
class InterventionAPIViewV1(AbstractModelAPIViewV1):
|
class InterventionAPIViewV1(AbstractModelAPIViewV1):
|
||||||
serializer = InterventionAPISerializerV1
|
serializer = InterventionAPISerializerV1
|
||||||
|
@ -8,6 +8,7 @@ Created on: 21.01.22
|
|||||||
|
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
|
||||||
from api.models import APIUserToken
|
from api.models import APIUserToken
|
||||||
from api.settings import KSP_TOKEN_HEADER_IDENTIFIER
|
from api.settings import KSP_TOKEN_HEADER_IDENTIFIER
|
||||||
@ -36,6 +37,7 @@ class AbstractModelAPIView(View):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.serializer = self.serializer()
|
self.serializer = self.serializer()
|
||||||
|
|
||||||
|
@csrf_exempt
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
# Fetch the proper user from the given request header token
|
# Fetch the proper user from the given request header token
|
||||||
|
Loading…
Reference in New Issue
Block a user