Skip to content

Commit

Permalink
Merge pull request #1534 from open-zaak/feature/1504-fix-zaaktype-imp…
Browse files Browse the repository at this point in the history
…ort-silent-failure

✨[#1504] show warning if zaaktype import does nothing
  • Loading branch information
Coperh committed Feb 9, 2024
2 parents ce24ee6 + 4c4a670 commit 2188590
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/openzaak/components/catalogi/admin/admin_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ def post(self, request, *args, **kwargs):
)
except CommandError as exc:
messages.add_message(request, messages.ERROR, exc)

return TemplateResponse(request, self.template_name, context)


Expand Down
22 changes: 21 additions & 1 deletion src/openzaak/components/catalogi/admin/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from django.core.exceptions import ValidationError
from django.core.management import CommandError
from django.utils.html import format_html
from django.utils.translation import ngettext, ugettext_lazy as _

from dateutil.relativedelta import relativedelta
Expand Down Expand Up @@ -178,7 +179,12 @@ def import_zaaktype_for_catalogus(

uuid_mapping = {}

files_not_found = []
files_found = []

with zipfile.ZipFile(import_file, "r") as zip_file:

files_received = zip_file.namelist()
for resource in [
"ZaakType",
"ZaakTypeInformatieObjectType",
Expand All @@ -187,8 +193,9 @@ def import_zaaktype_for_catalogus(
"StatusType",
"Eigenschap",
]:
if f"{resource}.json" in zip_file.namelist():
if f"{resource}.json" in files_received:
data = zip_file.read(f"{resource}.json").decode()
files_found.append(f"{resource}.json")

if resource == "ZaakTypeInformatieObjectType":
for old, new in iotypen_uuid_mapping.items():
Expand Down Expand Up @@ -239,6 +246,19 @@ def import_zaaktype_for_catalogus(
"A validation error occurred while deserializing a {}\n{}"
).format(resource, deserialized.errors)
)
else:
files_not_found.append(f"{resource}.json")

if len(files_found) < 1:
msg = _(
"No files found. Expected: {files_not_found} but received:<br> {files_received}"
)
msg_dict = {
"files_not_found": ", ".join(files_not_found),
"files_received": ", ".join(files_received),
}

raise CommandError(format_html(msg, **msg_dict))


def format_duration(rel_delta: relativedelta) -> str:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from django.contrib.sites.models import Site
from django.test import override_settings, tag
from django.urls import reverse
from django.utils.html import format_html
from django.utils.translation import ugettext as _

import requests_mock
Expand Down Expand Up @@ -1567,6 +1568,154 @@ def test_import_zaaktype_with_different_identification_exceeds_max_length(
response.text,
)

def test_import_zaaktype_with_bad_filenames(self, *mocks):
catalogus = CatalogusFactory.create(rsin="000000000", domein="TEST")
ZaakTypeFactory.create(
catalogus=catalogus,
vertrouwelijkheidaanduiding="openbaar",
zaaktype_omschrijving="bla",
datum_begin_geldigheid="2023-01-01",
)

url = reverse("admin:catalogi_catalogus_import_zaaktype", args=(catalogus.pk,))
response = self.app.get(url)

form = response.form
f = io.BytesIO()
f.name = "test.zip"
f.seek(0)

# files are not read, content does not matter
with zipfile.ZipFile(f, "w") as zip_file:
# zip_file.mkdir("some_dir")
zip_file.writestr("some_dir/ZaakType.json", '{"placeholder": "data"}')
zip_file.writestr(
"some_dir/ZaakTypeInformatieObjectType.json", '{"placeholder": "data"}'
)
zip_file.writestr("some_dir/ResultaatType.json", '{"placeholder": "data"}')
zip_file.writestr("some_dir/RolType.json", '{"placeholder": "data"}')
zip_file.writestr("some_dir/StatusType.json", '{"placeholder": "data"}')
zip_file.writestr("some_dir/Eigenschap.json", '{"placeholder": "data"}')

f.seek(0)
form["file"] = (
"test.zip",
f.read(),
)

response = form.submit("_import_zaaktype")
self.assertEqual(response.status_code, 200)
messages = list(response.context["messages"])

msg = _(
"No files found. Expected: {files_not_found} but received:<br> {files_received}"
)
files_not_found = (
"ZaakType.json, ZaakTypeInformatieObjectType.json, ResultaatType.json, RolType.json, "
"StatusType.json, Eigenschap.json"
)
files_received = (
"some_dir/ZaakType.json, some_dir/ZaakTypeInformatieObjectType.json, some_dir/ResultaatType.json, "
"some_dir/RolType.json, some_dir/StatusType.json, some_dir/Eigenschap.json"
)

self.assertEqual(
str(messages[0]),
format_html(
msg, files_not_found=files_not_found, files_received=files_received
),
)

def test_import_zaaktype_with_bad_filenames_with_correct_besluittype_and_informatieobjecttype(
self, *mocks
):
catalogus = CatalogusFactory.create(rsin="000000000", domein="TEST")
zaaktype = ZaakTypeFactory.create(
catalogus=catalogus,
vertrouwelijkheidaanduiding="openbaar",
zaaktype_omschrijving="bla",
datum_begin_geldigheid="2023-01-01",
)

InformatieObjectTypeFactory.create(
catalogus=catalogus,
vertrouwelijkheidaanduiding="openbaar",
omschrijving="Alpha",
zaaktypen__zaaktype=zaaktype,
datum_begin_geldigheid="2023-01-01",
datum_einde_geldigheid="2023-03-31",
)
BesluitTypeFactory.create(
catalogus=catalogus,
omschrijving="Apple",
zaaktypen=[zaaktype],
datum_begin_geldigheid="2023-01-01",
datum_einde_geldigheid="2023-03-31",
)

url = reverse("admin:catalogi_zaaktype_change", args=(zaaktype.pk,))

response = self.app.get(url)
form = response.forms["zaaktype_form"]

response = form.submit("_export")

data = response.content

url = reverse("admin:catalogi_catalogus_import_zaaktype", args=(catalogus.pk,))

response = self.app.get(url)

form = response.form
fin = io.BytesIO(data)
fin.name = "test.zip"
fin.seek(0)

fout = io.BytesIO()
fout.name = "test.zip"
fout.seek(0)

# create zip with bad structure
with zipfile.ZipFile(fin, "r") as zin:
with zipfile.ZipFile(fout, "w") as zout:
for zipInfo in zin.infolist():
buffer = zin.read(zipInfo.filename)
if zipInfo.filename not in [
"InformatieObjectType.json",
"BesluitType.json",
]:
zipInfo.filename = "some_dir/" + zipInfo.filename
zout.writestr(zipInfo, buffer)
fout.seek(0)
form["file"] = (
"test.zip",
fout.read(),
)

response = form.submit("_import_zaaktype").follow()
response = response.form.submit("_select")

self.assertEqual(response.status_code, 200)
messages = list(response.context["messages"])

msg = _(
"No files found. Expected: {files_not_found} but received:<br> {files_received}"
)
files_not_found = (
"ZaakType.json, ZaakTypeInformatieObjectType.json, ResultaatType.json, RolType.json, "
"StatusType.json, Eigenschap.json"
)
files_received = (
"some_dir/ZaakType.json, BesluitType.json, InformatieObjectType.json, "
"some_dir/ZaakTypeInformatieObjectType.json"
)
self.assertEqual(
str(messages[0]),
format_html(
msg, files_not_found=files_not_found, files_received=files_received
),
)


@patch(
"openzaak.components.catalogi.models.zaaktype.Service.get_client",
Expand Down

0 comments on commit 2188590

Please sign in to comment.