Skip to content

Commit

Permalink
Merge pull request #150 from open-zaak/feature/scope-force-delete-pub…
Browse files Browse the repository at this point in the history
…lished-types

Feature/scope force delete published types
  • Loading branch information
joeribekker committed Nov 1, 2019
2 parents d4b2185 + 1c9f664 commit 786d7b6
Show file tree
Hide file tree
Showing 21 changed files with 348 additions and 53 deletions.
9 changes: 9 additions & 0 deletions src/openzaak/components/catalogi/api/scopes.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,12 @@
* schrijfoperaties uit te voeren in de API. Alle resources zijn beschikbaar.
""",
)

SCOPE_ZAAKTYPES_FORCED_DELETE = Scope(
"zaaktypes.geforceerd_verwijderen",
description="""
**Laat toe om**:
* Gepubliceerde types geforceerd te verwijderen. Alle resources zijn beschikbaar.
""",
)
8 changes: 6 additions & 2 deletions src/openzaak/components/catalogi/api/viewsets/besluittype.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

from ...models import BesluitType
from ..filters import BesluitTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import BesluitTypeSerializer
from .mixins import ConceptMixin, M2MConceptDestroyMixin

Expand Down Expand Up @@ -65,7 +69,7 @@ class BesluitTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
"publish": SCOPE_ZAAKTYPES_WRITE,
}
concept_related_fields = ["informatieobjecttypen", "zaaktypes"]
8 changes: 6 additions & 2 deletions src/openzaak/components/catalogi/api/viewsets/eigenschap.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
from openzaak.utils.permissions import AuthRequired

from ..filters import EigenschapFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import EigenschapSerializer
from .mixins import ZaakTypeConceptMixin

Expand Down Expand Up @@ -67,5 +71,5 @@ class EigenschapViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

from ...models import InformatieObjectType
from ..filters import InformatieObjectTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import InformatieObjectTypeSerializer
from .mixins import ConceptMixin, M2MConceptDestroyMixin

Expand Down Expand Up @@ -67,7 +71,7 @@ class InformatieObjectTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
"publish": SCOPE_ZAAKTYPES_WRITE,
}
concept_related_fields = ["besluittypen", "zaaktypes"]
38 changes: 26 additions & 12 deletions src/openzaak/components/catalogi/api/viewsets/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from rest_framework.response import Response
from rest_framework.serializers import ValidationError

from ..scopes import SCOPE_ZAAKTYPES_FORCED_DELETE


class ConceptPublishMixin:
@swagger_auto_schema(request_body=no_body)
Expand All @@ -27,8 +29,14 @@ def get_concept(self, instance):
return instance.concept

def perform_destroy(self, instance):
if not self.get_concept(instance):
raise ValidationError({"nonFieldErrors": self.message}, code=self.code)
forced_delete = self.request.jwt_auth.has_auth(
scopes=SCOPE_ZAAKTYPES_FORCED_DELETE,
init_component=self.queryset.model._meta.app_label,
)

if not forced_delete:
if not self.get_concept(instance):
raise ValidationError({"nonFieldErrors": self.message}, code=self.code)

super().perform_destroy(instance)

Expand Down Expand Up @@ -83,15 +91,21 @@ class ZaakTypeConceptMixin(ZaakTypeConceptDestroyMixin, ZaakTypeConceptFilterMix

class M2MConceptDestroyMixin:
def perform_destroy(self, instance):
for field_name in self.concept_related_fields:
field = getattr(instance, field_name)
related_non_concepts = field.filter(concept=False)
if related_non_concepts.exists():
msg = _(
f"Objects related to non-concept {field_name} can't be destroyed"
)
raise ValidationError(
{"nonFieldErrors": msg}, code="non-concept-relation"
)
forced_delete = self.request.jwt_auth.has_auth(
scopes=SCOPE_ZAAKTYPES_FORCED_DELETE,
init_component=self.queryset.model._meta.app_label,
)

if not forced_delete:
for field_name in self.concept_related_fields:
field = getattr(instance, field_name)
related_non_concepts = field.filter(concept=False)
if related_non_concepts.exists():
msg = _(
f"Objects related to non-concept {field_name} can't be destroyed"
)
raise ValidationError(
{"nonFieldErrors": msg}, code="non-concept-relation"
)

super().perform_destroy(instance)
22 changes: 17 additions & 5 deletions src/openzaak/components/catalogi/api/viewsets/relatieklassen.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@

from ...models import ZaakInformatieobjectType
from ..filters import ZaakInformatieobjectTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import ZaakTypeInformatieObjectTypeSerializer
from .mixins import ConceptDestroyMixin, ConceptFilterMixin

Expand Down Expand Up @@ -73,7 +77,7 @@ class ZaakTypeInformatieObjectTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
}

def get_concept(self, instance):
Expand All @@ -88,8 +92,16 @@ def get_concept_filter(self):
return {"zaaktype__concept": False, "informatieobjecttype__concept": False}

def perform_destroy(self, instance):
if not self.get_concept(instance):
msg = _("Objects related to non-concept objects can't be destroyed")
raise ValidationError({"nonFieldErrors": msg}, code="non-concept-relation")
forced_delete = self.request.jwt_auth.has_auth(
scopes=SCOPE_ZAAKTYPES_FORCED_DELETE,
init_component=self.queryset.model._meta.app_label,
)

if not forced_delete:
if not self.get_concept(instance):
msg = _("Objects related to non-concept objects can't be destroyed")
raise ValidationError(
{"nonFieldErrors": msg}, code="non-concept-relation"
)

super().perform_destroy(instance)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

from ...models import ResultaatType
from ..filters import ResultaatTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import ResultaatTypeSerializer
from .mixins import ZaakTypeConceptMixin

Expand Down Expand Up @@ -67,5 +71,5 @@ class ResultaatTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
}
8 changes: 6 additions & 2 deletions src/openzaak/components/catalogi/api/viewsets/roltype.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

from ...models import RolType
from ..filters import RolTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import RolTypeSerializer
from .mixins import ZaakTypeConceptMixin

Expand Down Expand Up @@ -67,5 +71,5 @@ class RolTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
}
8 changes: 6 additions & 2 deletions src/openzaak/components/catalogi/api/viewsets/statustype.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

from ...models import StatusType
from ..filters import StatusTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import StatusTypeSerializer
from .mixins import ZaakTypeConceptMixin

Expand Down Expand Up @@ -66,5 +70,5 @@ class StatusTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
}
8 changes: 6 additions & 2 deletions src/openzaak/components/catalogi/api/viewsets/zaaktype.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@

from ...models import ZaakType
from ..filters import ZaakTypeFilter
from ..scopes import SCOPE_ZAAKTYPES_READ, SCOPE_ZAAKTYPES_WRITE
from ..scopes import (
SCOPE_ZAAKTYPES_FORCED_DELETE,
SCOPE_ZAAKTYPES_READ,
SCOPE_ZAAKTYPES_WRITE,
)
from ..serializers import ZaakTypeSerializer
from .mixins import ConceptDestroyMixin, ConceptFilterMixin, M2MConceptDestroyMixin

Expand Down Expand Up @@ -90,7 +94,7 @@ class ZaakTypeViewSet(
"create": SCOPE_ZAAKTYPES_WRITE,
"update": SCOPE_ZAAKTYPES_WRITE,
"partial_update": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE,
"destroy": SCOPE_ZAAKTYPES_WRITE | SCOPE_ZAAKTYPES_FORCED_DELETE,
"publish": SCOPE_ZAAKTYPES_WRITE,
}
concept_related_fields = ["besluittypen", "informatieobjecttypen"]
Expand Down
16 changes: 8 additions & 8 deletions src/openzaak/components/catalogi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -929,7 +929,7 @@ paths:
- besluittypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -2312,7 +2312,7 @@ paths:
- eigenschappen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -3190,7 +3190,7 @@ paths:
- informatieobjecttypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -4111,7 +4111,7 @@ paths:
- resultaattypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -5005,7 +5005,7 @@ paths:
- roltypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -5883,7 +5883,7 @@ paths:
- statustypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -6781,7 +6781,7 @@ paths:
- zaaktype-informatieobjecttypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down Expand Up @@ -7669,7 +7669,7 @@ paths:
- zaaktypen
security:
- JWT-Claims:
- zaaktypes.schrijven
- (zaaktypes.schrijven | zaaktypes.geforceerd_verwijderen)
parameters:
- name: uuid
in: path
Expand Down

0 comments on commit 786d7b6

Please sign in to comment.