Skip to content

Commit

Permalink
Merge pull request #1499 from open-zaak/feature/1497-zaaktype-imports…
Browse files Browse the repository at this point in the history
…-various-improvments

Feature/1497 zaaktype imports various improvments
  • Loading branch information
Coperh committed Dec 1, 2023
2 parents 996830b + 053388e commit d24b67f
Show file tree
Hide file tree
Showing 5 changed files with 632 additions and 59 deletions.
122 changes: 72 additions & 50 deletions src/openzaak/components/catalogi/admin/admin_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,18 @@ def post(self, request, *args, **kwargs):
request.session["file_content"] = import_file.read()

iotypen = retrieve_iotypen(catalogus_pk, request.session["file_content"])
request.session["iotypen"] = iotypen
request.session["iotypen"] = (
sorted(iotypen, key=lambda x: x["omschrijving"]) if iotypen else iotypen
)

besluittypen = retrieve_besluittypen(
catalogus_pk, request.session["file_content"]
)
request.session["besluittypen"] = besluittypen
request.session["besluittypen"] = (
sorted(besluittypen, key=lambda x: x[0]["omschrijving"])
if besluittypen
else besluittypen
)

if besluittypen or iotypen:
return HttpResponseRedirect(
Expand Down Expand Up @@ -88,52 +94,65 @@ def get_context_data(self, **kwargs):

iotypen = self.request.session.get("iotypen")
if iotypen:
iot_dict = {
obj.omschrijving: obj.pk
for obj in InformatieObjectType.objects.filter(catalogus=catalogus)
.order_by("omschrijving", "-datum_begin_geldigheid")
.distinct("omschrijving")

form_kwargs = {
"catalogus_pk": catalogus_pk,
"labels": [str(catalogus) + " - " + i["omschrijving"] for i in iotypen],
}
prefix = "iotype"

iotypen = sorted(iotypen, key=lambda x: x["omschrijving"])
iotype_forms = InformatieObjectTypeFormSet(
initial=[
{"existing": iot_dict.get(instance["omschrijving"])}
for instance in iotypen
],
form_kwargs={
"catalogus_pk": catalogus_pk,
"labels": [
str(catalogus) + " - " + i["omschrijving"] for i in iotypen
if self.request.POST:
iotype_forms = InformatieObjectTypeFormSet(
self.request.POST, form_kwargs=form_kwargs, prefix=prefix
)
else:
iot_dict = {
obj.omschrijving: obj.pk
for obj in InformatieObjectType.objects.filter(catalogus=catalogus)
.order_by("omschrijving", "-datum_begin_geldigheid")
.distinct("omschrijving")
}
iotype_forms = InformatieObjectTypeFormSet(
initial=[
{"existing": iot_dict.get(instance["omschrijving"])}
for instance in iotypen
],
},
prefix="iotype",
)
form_kwargs=form_kwargs,
prefix=prefix,
)

context["iotype_forms"] = iotype_forms

besluittypen = self.request.session.get("besluittypen")
if besluittypen:
besluittypen_dict = {
obj.omschrijving: obj.pk
for obj in BesluitType.objects.filter(catalogus=catalogus)
.order_by("omschrijving", "-datum_begin_geldigheid")
.distinct("omschrijving")
}
besluittypen = sorted(besluittypen, key=lambda x: x[0]["omschrijving"])
besluittype_forms = BesluitTypeFormSet(
initial=[
{"existing": besluittypen_dict.get(instance["omschrijving"])}
for instance, uuids in besluittypen
form_kwargs = {
"catalogus_pk": catalogus_pk,
"labels": [
str(catalogus) + " - " + i["omschrijving"]
for i, uuids in besluittypen
],
form_kwargs={
"catalogus_pk": catalogus_pk,
"labels": [
str(catalogus) + " - " + i["omschrijving"]
for i, uuids in besluittypen
}
prefix = "besluittype"

if self.request.POST:
besluittype_forms = BesluitTypeFormSet(
self.request.POST, form_kwargs=form_kwargs, prefix=prefix
)
else:
besluittypen_dict = {
obj.omschrijving: obj.pk
for obj in BesluitType.objects.filter(catalogus=catalogus)
.order_by("omschrijving", "-datum_begin_geldigheid")
.distinct("omschrijving")
}
besluittype_forms = BesluitTypeFormSet(
initial=[
{"existing": besluittypen_dict.get(instance["omschrijving"])}
for instance, uuids in besluittypen
],
},
prefix="besluittype",
)
form_kwargs=form_kwargs,
prefix=prefix,
)
context["besluittype_forms"] = besluittype_forms
return context

Expand All @@ -148,28 +167,31 @@ def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)

def post(self, request, *args, **kwargs):

context = self.get_context_data(**kwargs)

try:
with transaction.atomic():
with (transaction.atomic()):
iotypen_uuid_mapping = {}
if "iotype-TOTAL_FORMS" in request.POST:
iotype_forms = InformatieObjectTypeFormSet(
request.POST, prefix="iotype"
)

if context.get("iotype_forms"):
iotype_forms = context["iotype_forms"]
if iotype_forms.is_valid():
iotypen_uuid_mapping = construct_iotypen(
request.session["iotypen"], iotype_forms.cleaned_data
request.session["iotypen"],
iotype_forms.cleaned_data,
iotype_forms,
)

besluittypen_uuid_mapping = {}
if "besluittype-TOTAL_FORMS" in request.POST:
besluittype_forms = BesluitTypeFormSet(
request.POST, prefix="besluittype"
)
if context.get("besluittype_forms"):
besluittype_forms = context["besluittype_forms"]
if besluittype_forms.is_valid():
besluittypen_uuid_mapping = construct_besluittypen(
request.session["besluittypen"],
besluittype_forms.cleaned_data,
iotypen_uuid_mapping,
besluittype_forms,
)

import_zaaktype_for_catalogus(
Expand All @@ -185,5 +207,5 @@ def post(self, request, *args, **kwargs):
return HttpResponseRedirect(reverse("admin:catalogi_catalogus_changelist"))
except (CommandError, IntegrityError) as exc:
messages.add_message(request, messages.ERROR, exc)
context = self.get_context_data(**kwargs)

return TemplateResponse(request, self.template_name, context)
10 changes: 8 additions & 2 deletions src/openzaak/components/catalogi/admin/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -508,15 +508,21 @@ def __init__(self, *args, **kwargs):

class ExistingInformatieObjectTypeForm(ExistingTypeForm):
existing = forms.ModelChoiceField(
queryset=InformatieObjectType.objects.all(),
queryset=InformatieObjectType.objects.all().order_by(
"omschrijving", "datum_begin_geldigheid"
),
required=False,
empty_label=_("Create new"),
)


class ExistingBesluitTypeForm(ExistingTypeForm):
existing = forms.ModelChoiceField(
queryset=BesluitType.objects.all(), required=False, empty_label=_("Create new")
queryset=BesluitType.objects.all().order_by(
"omschrijving", "datum_begin_geldigheid"
),
required=False,
empty_label=_("Create new"),
)


Expand Down
39 changes: 32 additions & 7 deletions src/openzaak/components/catalogi/admin/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,25 @@
setattr(REQUEST, "version", "1")


def format_serializer_errors(errors, related=False):
"""
Formats a DRF serializer's validation errors to a single string
:param errors: standard DRF error dict returned from a serializer
:param related: whether an error dict is from a related serializer
:returns: errors formatted as a string
"""

# if list of errors
if isinstance(errors, list):
return ",".join([f"{error.title()}" for error in errors])

seperator = ", " if related else "\n"
# otherwise nested error list
return seperator.join(
[f"{k}: {format_serializer_errors(v, True)}" for k, v in errors.items()]
)


def retrieve_iotypen(catalogus_pk, import_file_content):
catalogus = Catalogus.objects.get(pk=catalogus_pk)
catalogus_uuid = str(catalogus.uuid)
Expand Down Expand Up @@ -77,9 +96,9 @@ def retrieve_besluittypen(catalogus_pk, import_file_content):
return besluittypen


def construct_iotypen(iotypen, iotype_form_data):
def construct_iotypen(iotypen, iotype_form_data, iot_formset):
iotypen_uuid_mapping = {}
for imported, form_data in zip(iotypen, iotype_form_data):
for imported, form_data, form in zip(iotypen, iotype_form_data, iot_formset.forms):
uuid = imported["url"].split("/")[-1]
if form_data["existing"]:
iotypen_uuid_mapping[uuid] = form_data["existing"]
Expand All @@ -94,20 +113,24 @@ def construct_iotypen(iotypen, iotype_form_data):
instance = InformatieObjectType(**data)
instance.omschrijving_generiek = omschrijving_generiek
else:
error_message = format_serializer_errors(deserialized.errors)
form.add_error("existing", error_message)
raise CommandError(
_(
"A validation error occurred while deserializing a {}\n{}"
).format("InformatieObjectType", deserialized.errors)
).format("InformatieObjectType", error_message)
)
instance.save()
iotypen_uuid_mapping[uuid] = instance
return iotypen_uuid_mapping


def construct_besluittypen(besluittypen, besluittype_form_data, iotypen_uuid_mapping):
def construct_besluittypen(
besluittypen, besluittype_form_data, iotypen_uuid_mapping, besluittype_formset
):
besluittypen_uuid_mapping = {}
for (imported, related_iotypen_uuids,), form_data in zip(
besluittypen, besluittype_form_data
for (imported, related_iotypen_uuids,), form_data, form in zip(
besluittypen, besluittype_form_data, besluittype_formset
):
uuid = imported["url"].split("/")[-1]
if form_data["existing"]:
Expand All @@ -122,10 +145,12 @@ def construct_besluittypen(besluittypen, besluittype_form_data, iotypen_uuid_map

instance = BesluitType(**deserialized.validated_data)
else:
error_message = format_serializer_errors(deserialized.errors)
form.add_error("existing", error_message)
raise CommandError(
_(
"A validation error occurred while deserializing a {}\n{}"
).format("BesluitType", deserialized.errors)
).format("BesluitType", error_message)
)
instance.save()
chosen_object = instance
Expand Down

0 comments on commit d24b67f

Please sign in to comment.