Skip to content

Commit 72f05e7

Browse files
authored
Merge pull request #208 from open-zaak/feature/207-kanaal-update
✨ [#207] Add experimental PUT and PATCH for Kanaal
2 parents f9f8ae6 + a4c6760 commit 72f05e7

File tree

5 files changed

+476
-19
lines changed

5 files changed

+476
-19
lines changed

src/nrc/api/serializers.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from djangorestframework_camel_case.util import camelize, underscoreize
99
from notifications_api_common.api.serializers import NotificatieSerializer
1010
from rest_framework import fields, serializers
11-
from vng_api_common.validators import URLValidator
11+
from rest_framework.validators import UniqueValidator
12+
from vng_api_common.validators import IsImmutableValidator, URLValidator
1213

1314
from nrc.api.tasks import deliver_message
1415
from nrc.datamodel.models import Abonnement, Filter, FilterGroup, Kanaal, Notificatie
@@ -39,6 +40,12 @@ class Meta:
3940
fields = ("url", "naam", "documentatie_link", "filters")
4041
extra_kwargs = {
4142
"url": {"lookup_field": "uuid"},
43+
"naam": {
44+
"validators": [
45+
UniqueValidator(queryset=Kanaal.objects.all()),
46+
IsImmutableValidator(),
47+
]
48+
},
4249
"documentatie_link": {"required": False, "validators": [URLValidator()]},
4350
"filters": {"required": False},
4451
}

src/nrc/api/tests/test_kanaal.py

+84-14
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22

33
from rest_framework import status
44
from rest_framework.test import APITestCase
5-
from vng_api_common.tests import JWTAuthMixin, get_operation_url
5+
from vng_api_common.tests import (
6+
JWTAuthMixin,
7+
get_operation_url,
8+
get_validation_errors,
9+
reverse,
10+
)
611

712
from nrc.datamodel.models import Kanaal
813
from nrc.datamodel.tests.factories import KanaalFactory
@@ -46,25 +51,90 @@ def test_kanaal_create_nonunique(self):
4651
response.status_code, status.HTTP_400_BAD_REQUEST, response.data
4752
)
4853

49-
def test_kanaal_update_delete(self):
54+
def test_kanaal_update(self):
55+
kanaal = KanaalFactory.create(
56+
naam="zaken",
57+
documentatie_link="https://example.com/doc",
58+
filters=["zaaktype"],
59+
)
60+
kanaal_url = reverse(kanaal)
61+
data = {
62+
"naam": "zaken",
63+
"documentatie_link": "https://example.com/updated",
64+
"filters": ["zaaktype", "zaaktype.catalogus"],
65+
}
66+
67+
response = self.client.put(kanaal_url, data)
68+
69+
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
70+
71+
# check parsing to model
72+
data = response.json()
73+
kanaal = Kanaal.objects.get()
74+
self.assertEqual(kanaal.naam, "zaken")
75+
self.assertEqual(kanaal.documentatie_link, "https://example.com/updated")
76+
self.assertEqual(kanaal.filters, ["zaaktype", "zaaktype.catalogus"])
77+
78+
def test_kanaal_partial_update(self):
79+
kanaal = KanaalFactory.create(
80+
naam="zaken",
81+
documentatie_link="https://example.com/doc",
82+
filters=["zaaktype"],
83+
)
84+
kanaal_url = reverse(kanaal)
85+
data = {"filters": ["zaaktype", "zaaktype.catalogus"]}
86+
87+
response = self.client.patch(kanaal_url, data)
88+
89+
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
90+
91+
# check parsing to model
92+
data = response.json()
93+
kanaal = Kanaal.objects.get()
94+
self.assertEqual(kanaal.naam, "zaken")
95+
self.assertEqual(kanaal.documentatie_link, "https://example.com/doc")
96+
self.assertEqual(kanaal.filters, ["zaaktype", "zaaktype.catalogus"])
97+
98+
def test_kanaal_cannot_update_naam(self):
99+
kanaal = KanaalFactory.create(
100+
naam="zaken",
101+
documentatie_link="https://example.com/doc",
102+
filters=["zaaktype"],
103+
)
104+
kanaal_url = reverse(kanaal)
105+
data = {
106+
"naam": "modified",
107+
"documentatie_link": "https://example.com/updated",
108+
"filters": ["zaaktype", "zaaktype.catalogus"],
109+
}
110+
111+
response = self.client.put(kanaal_url, data)
112+
113+
self.assertEqual(
114+
response.status_code, status.HTTP_400_BAD_REQUEST, response.data
115+
)
116+
117+
# check parsing to model
118+
data = response.json()
119+
120+
error = get_validation_errors(response, "naam")
121+
self.assertEqual(error["code"], "wijzigen-niet-toegelaten")
122+
123+
kanaal = Kanaal.objects.get()
124+
self.assertEqual(kanaal.naam, "zaken")
125+
self.assertEqual(kanaal.documentatie_link, "https://example.com/doc")
126+
self.assertEqual(kanaal.filters, ["zaaktype"])
127+
128+
def test_kanaal_delete(self):
50129
"""
51-
test /kanaal PUT, DELETE:
52-
attempt to update and destroy kanaal via request
130+
test /kanaal DELETE:
131+
attempt to destroy kanaal via request
53132
check if response contents status 405
54133
"""
55134
kanaal = Kanaal.objects.create(naam="zaken")
56135
kanaal_url = get_operation_url("kanaal_read", uuid=kanaal.uuid)
57-
data = {"documentatie_link": "https://example.com/doc"}
58-
59-
response_put = self.client.put(kanaal_url, data)
60-
61-
self.assertEqual(
62-
response_put.status_code,
63-
status.HTTP_405_METHOD_NOT_ALLOWED,
64-
response_put.data,
65-
)
66136

67-
response_delete = self.client.delete(kanaal_url, data)
137+
response_delete = self.client.delete(kanaal_url)
68138

69139
self.assertEqual(
70140
response_delete.status_code,

src/nrc/api/viewsets.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from vng_api_common.viewsets import CheckQueryParamsMixin
88

99
from nrc.datamodel.models import Abonnement, Kanaal
10+
from nrc.utils.help_text import mark_experimental
1011

1112
from .filters import KanaalFilter
1213
from .scopes import SCOPE_NOTIFICATIES_CONSUMEREN, SCOPE_NOTIFICATIES_PUBLICEREN
@@ -54,17 +55,22 @@ def perform_create(self, serializer):
5455
@extend_schema_view(
5556
list=extend_schema(summary="Alle KANAALen opvragen."),
5657
retrieve=extend_schema(summary="Een specifiek KANAAL opvragen."),
58+
update=extend_schema(summary=mark_experimental("Een specifiek KANAAL bewerken.")),
59+
partial_update=extend_schema(
60+
summary=mark_experimental("Een specifiek KANAAL deels bewerken.")
61+
),
5762
create=extend_schema(summary="Maak een KANAAL aan."),
5863
)
5964
class KanaalViewSet(
6065
CheckQueryParamsMixin,
6166
mixins.CreateModelMixin,
6267
mixins.ListModelMixin,
68+
mixins.UpdateModelMixin,
6369
mixins.RetrieveModelMixin,
6470
viewsets.GenericViewSet,
6571
):
6672
"""
67-
Opvragen en aanmaken van KANAALen.
73+
Opvragen, aanmaken en bewerken van KANAALen.
6874
6975
Op een KANAAL publiceren componenten (bronnen) hun NOTIFICATIEs. Alleen
7076
componenten die NOTIFICATIEs willen publiceren dienen een KANAAL aan te
@@ -80,6 +86,8 @@ class KanaalViewSet(
8086
"list": SCOPE_NOTIFICATIES_PUBLICEREN | SCOPE_NOTIFICATIES_CONSUMEREN,
8187
"retrieve": SCOPE_NOTIFICATIES_PUBLICEREN | SCOPE_NOTIFICATIES_CONSUMEREN,
8288
"create": SCOPE_NOTIFICATIES_PUBLICEREN,
89+
"update": SCOPE_NOTIFICATIES_PUBLICEREN,
90+
"partial_update": SCOPE_NOTIFICATIES_PUBLICEREN,
8391
}
8492

8593

src/nrc/utils/help_text.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.utils.translation import gettext_lazy as _
2+
3+
4+
def mark_experimental(text):
5+
return _("**EXPERIMENTEEL** {}").format(text)

0 commit comments

Comments
 (0)