Skip to content

Commit

Permalink
Merge pull request #209 from open-zaak/bug/admin-fixes
Browse files Browse the repository at this point in the history
Admin fixes/improvements
  • Loading branch information
sergei-maertens committed Nov 11, 2019
2 parents c73febe + 32ac26d commit fd9debe
Show file tree
Hide file tree
Showing 28 changed files with 5,357 additions and 88 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ docs/_build
# Coverage reports
/reports/
/htmlcov/
.coverage

# Environment
src/openzaak/conf/includes/local.py
Expand Down
6 changes: 6 additions & 0 deletions requirements/ci.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#
# pip-compile --no-index --output-file=requirements/ci.txt requirements/base.txt requirements/test-tools.in
#
beautifulsoup4==4.8.1 # via webtest
certifi==2018.4.16
chardet==3.0.4
coreapi==2.3.3
Expand All @@ -26,6 +27,7 @@ django-redis==4.10.0
django-relativedelta==1.0.5
django-sendfile2==0.4.2
django-solo==1.1.3
django-webtest==1.9.7
django==2.2.4
djangorestframework-camel-case==0.2.0
djangorestframework-gis==0.14
Expand Down Expand Up @@ -61,6 +63,7 @@ requests-mock==1.6.0
requests==2.21.0
ruamel.yaml==0.15.37
six==1.11.0
soupsieve==1.9.5 # via beautifulsoup4
sqlparse==0.3.0
tblib==1.4.0
text-unidecode==1.2 # via faker
Expand All @@ -69,3 +72,6 @@ uritemplate==3.0.0
urllib3==1.24.3
uwsgi==2.0.18
vng-api-common==1.0.31
waitress==1.3.1 # via webtest
webob==1.8.5 # via webtest
webtest==2.0.33 # via django-webtest
6 changes: 6 additions & 0 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ alabaster==0.7.12 # via sphinx
appdirs==1.4.3 # via black
attrs==19.1.0 # via black
babel==2.7.0 # via sphinx
beautifulsoup4==4.8.1
black==19.10b0
certifi==2018.4.16
chardet==3.0.4
Expand Down Expand Up @@ -35,6 +36,7 @@ django-redis==4.10.0
django-relativedelta==1.0.5
django-sendfile2==0.4.2
django-solo==1.1.3
django-webtest==1.9.7
django==2.2.4
djangorestframework-camel-case==0.2.0
djangorestframework-gis==0.14
Expand Down Expand Up @@ -81,6 +83,7 @@ requests==2.21.0
ruamel.yaml==0.15.37
six==1.11.0
snowballstemmer==2.0.0 # via sphinx
soupsieve==1.9.5
sphinx-rtd-theme==0.4.3
sphinx==2.2.0
sphinxcontrib-applehelp==1.0.1 # via sphinx
Expand All @@ -99,6 +102,9 @@ uritemplate==3.0.0
urllib3==1.24.3
uwsgi==2.0.18
vng-api-common==1.0.31
waitress==1.3.1
webob==1.8.5
webtest==2.0.33

# The following packages are considered to be unsafe in a requirements file:
# setuptools==41.6.0 # via sphinx
1 change: 1 addition & 0 deletions requirements/test-tools.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Dependencies only relevant for (unit) testing
coverage
django-webtest
factory_boy
freezegun
requests-mock
Expand Down
13 changes: 13 additions & 0 deletions src/openzaak/accounts/tests/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import factory


class UserFactory(factory.django.DjangoModelFactory):
username = factory.Sequence(lambda n: f"user-{n}")

class Meta:
model = "accounts.User"


class SuperUserFactory(UserFactory):
is_staff = True
is_superuser = True
40 changes: 34 additions & 6 deletions src/openzaak/components/catalogi/admin/forms.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django import forms
from django.conf import settings
from django.urls import reverse
from django.utils.html import format_html
from django.utils.translation import ugettext_lazy as _

import requests
Expand All @@ -10,6 +12,7 @@
from vng_api_common.validators import ResourceValidator

from openzaak.forms.widgets import BooleanRadio
from openzaak.selectielijst.admin import get_selectielijst_resultaat_choices

from ..constants import SelectielijstKlasseProcestermijn as Procestermijn
from ..models import ResultaatType, ZaakType
Expand Down Expand Up @@ -44,6 +47,15 @@ class Meta:
model = ResultaatType
fields = "__all__"

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

if self.instance.pk:
proces_type = self.instance.zaaktype.selectielijst_procestype
self.fields[
"selectielijstklasse"
].choices = get_selectielijst_resultaat_choices(proces_type)

def clean(self):
super().clean()

Expand Down Expand Up @@ -86,12 +98,28 @@ def _clean_selectielijstklasse(self):

procestype = response.json()["procesType"]
if procestype != zaaktype.selectielijst_procestype:
msg = _(
"De selectielijstklasse hoort niet bij het selectielijst procestype van het zaaktype"
)
self.add_error(
"selectielijstklasse", forms.ValidationError(msg, code="invalid")
)
if not zaaktype.selectielijst_procestype:
edit_zaaktype = reverse(
"admin:catalogi_zaaktype_change", args=(zaaktype.pk,)
)
err = format_html(
'{msg} <a href="{url}#id_selectielijst_procestype">{url_text}</a>',
msg=_(
"Er is geen Selectielijst-procestype gedefinieerd op het zaaktype!"
),
url=edit_zaaktype,
url_text=_("Zaaktype bewerken"),
)

self.add_error("selectielijstklasse", err)
else:
msg = _(
"De selectielijstklasse hoort niet bij het selectielijst "
"procestype van het zaaktype"
)
self.add_error(
"selectielijstklasse", forms.ValidationError(msg, code="invalid")
)

def _clean_brondatum_archiefprocedure_afleidingswijze(self):
"""
Expand Down
12 changes: 12 additions & 0 deletions src/openzaak/components/catalogi/admin/resultaattype.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
from relativedeltafield import RelativeDeltaField

from openzaak.forms.fields import RelativeDeltaField as RelativeDeltaFormField
from openzaak.selectielijst.admin import (
get_resultaattype_omschrijving_field,
get_selectielijstklasse_field,
)

from ..models import ResultaatType
from .forms import ResultaatTypeForm
Expand All @@ -21,6 +25,7 @@ class ResultaatTypeAdmin(admin.ModelAdmin):
"selectielijstklasse",
"uuid",
)
list_filter = ("zaaktype",)
ordering = ("zaaktype", "omschrijving")
search_fields = (
"omschrijving",
Expand Down Expand Up @@ -56,4 +61,11 @@ class ResultaatTypeAdmin(admin.ModelAdmin):
def formfield_for_dbfield(self, db_field, request, **kwargs):
if isinstance(db_field, RelativeDeltaField):
kwargs["form_class"] = RelativeDeltaFormField

if db_field.name == "selectielijstklasse":
return get_selectielijstklasse_field(db_field, request, **kwargs)

if db_field.name == "resultaattypeomschrijving":
return get_resultaattype_omschrijving_field(db_field, request, **kwargs)

return super().formfield_for_dbfield(db_field, request, **kwargs)
31 changes: 13 additions & 18 deletions src/openzaak/components/catalogi/admin/zaaktypen.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
from django.contrib import admin
from django.db.models import Field
from django.http import HttpRequest
from django.utils.translation import ugettext_lazy as _

from openzaak.selectielijst.admin import get_procestype_field
from openzaak.utils.admin import (
DynamicArrayMixin,
EditInlineAdminMixin,
ListObjectActionsAdminMixin,
link_to_related_objects,
)

from ..models import (
Expand Down Expand Up @@ -138,22 +142,13 @@ class ZaakTypeAdmin(

def get_object_actions(self, obj):
return (
(
_("Toon {}").format(StatusType._meta.verbose_name_plural),
self._build_changelist_url(StatusType, query={"is_van": obj.pk}),
),
(
_("Toon {}").format(RolType._meta.verbose_name_plural),
self._build_changelist_url(RolType, query={"is_van": obj.pk}),
),
(
_("Toon {}").format(Eigenschap._meta.verbose_name_plural),
self._build_changelist_url(Eigenschap, query={"is_van": obj.pk}),
),
(
_("Toon {}").format(ResultaatType._meta.verbose_name_plural),
self._build_changelist_url(
ResultaatType, query={"is_relevant_voor": obj.pk}
),
),
link_to_related_objects(StatusType, obj),
link_to_related_objects(RolType, obj),
link_to_related_objects(Eigenschap, obj),
link_to_related_objects(ResultaatType, obj),
)

def formfield_for_dbfield(self, db_field: Field, request: HttpRequest, **kwargs):
if db_field.name == "selectielijst_procestype":
return get_procestype_field(db_field, request, **kwargs)
return super().formfield_for_dbfield(db_field, request, **kwargs)
30 changes: 17 additions & 13 deletions src/openzaak/components/catalogi/models/eigenschap.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,7 @@
from django.utils.translation import ugettext_lazy as _

from ..constants import FormaatChoices
from .validators import (
validate_kardinaliteit,
validate_letters_numbers_underscores,
validate_letters_numbers_underscores_spaces,
)
from .validators import validate_kardinaliteit, validate_letters_numbers_underscores


class EigenschapSpecificatie(models.Model):
Expand Down Expand Up @@ -98,15 +94,23 @@ def clean(self):
)
)

elif self.formaat == FormaatChoices.datum:
if self.lengte != 8:
raise ValidationError(_("Als formaat datum is, moet de lengte 8 zijn."))
else:
try:
length = int(self.lengte)
except ValueError:
raise ValidationError(_("Voer een getal in als lengte"), code="invalid")

if self.formaat == FormaatChoices.datum:
if length != 8:
raise ValidationError(
_("Als formaat datum is, moet de lengte 8 zijn.")
)

elif self.formaat == FormaatChoices.datum_tijd:
if self.lengte != 14:
raise ValidationError(
_("Als formaat datum/tijd is, moet de lengte 14 zijn.")
)
elif self.formaat == FormaatChoices.datum_tijd:
if length != 14:
raise ValidationError(
_("Als formaat datum/tijd is, moet de lengte 14 zijn.")
)


class Eigenschap(models.Model):
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
from django.urls import reverse

import requests_mock
from django_webtest import WebTest

from openzaak.accounts.tests.factories import SuperUserFactory
from openzaak.selectielijst.tests import mock_oas_get, mock_resource_list
from openzaak.utils.tests import ClearCachesMixin

from ..factories import ResultaatTypeFactory


@requests_mock.Mocker()
class ZaaktypeAdminTests(ClearCachesMixin, WebTest):
@classmethod
def setUpTestData(cls):
cls.user = SuperUserFactory.create()

def setUp(self):
super().setUp()

self.app.set_user(self.user)

def test_zaaktypen_list(self, m):
ResultaatTypeFactory.create()
url = reverse("admin:catalogi_resultaattype_changelist")

response = self.app.get(url)

self.assertEqual(response.status_code, 200)

def test_zaaktype_detail(self, m):
mock_oas_get(m)
mock_resource_list(m, "resultaattypeomschrijvingen")
mock_resource_list(m, "resultaten")
zaaktype = ResultaatTypeFactory.create()
url = reverse("admin:catalogi_resultaattype_change", args=(zaaktype.pk,))

response = self.app.get(url)

self.assertEqual(response.status_code, 200)

def test_selectielijst_selectielijstklasse(self, m):
"""
Test that the selectielijst procestype field is a dropdown.
"""
mock_oas_get(m)
mock_resource_list(m, "resultaattypeomschrijvingen")
mock_resource_list(m, "resultaten")
zaaktype = ResultaatTypeFactory.create(
zaaktype__selectielijst_procestype=(
"https://referentielijsten-api.vng.cloud/api/v1/"
"procestypen/e1b73b12-b2f6-4c4e-8929-94f84dd2a57d"
)
)
url = reverse("admin:catalogi_resultaattype_change", args=(zaaktype.pk,))

response = self.app.get(url)

self.assertEqual(response.status_code, 200)

form = response.forms["resultaattype_form"]
field = form.fields["selectielijstklasse"][0]
self.assertEqual(field.tag, "select")
# first element of JSON response
self.assertEqual(
field.value,
"https://referentielijsten-api.vng.cloud/api/v1/resultaten/cc5ae4e3-a9e6-4386-bcee-46be4986a829",
)

0 comments on commit fd9debe

Please sign in to comment.