From 2c5205859f3af14f2d0de6ae5e61e6f80e96a52e Mon Sep 17 00:00:00 2001 From: Sidney Richards Date: Wed, 9 Oct 2024 13:00:21 +0200 Subject: [PATCH 1/2] Update bericht opened status upon accessing detail page --- src/open_inwoner/berichten/services.py | 25 +++++++++++++++++++ .../berichten/views/bericht_detail.py | 6 ++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/open_inwoner/berichten/services.py b/src/open_inwoner/berichten/services.py index f499147bc6..05c85c5392 100644 --- a/src/open_inwoner/berichten/services.py +++ b/src/open_inwoner/berichten/services.py @@ -1,3 +1,4 @@ +import datetime from typing import Literal from objectsapiclient.client import Client as ObjectenClient @@ -39,3 +40,27 @@ def fetch_bericht(self, uuid: str): obj = self.client.get_object(uuid) return Bericht.model_validate(obj.record["data"] | {"object_uuid": obj.uuid}) + + def update_object(self, uuid: str, updated_data: dict): + + # TODO: the PATCH method in the Objects API does not appear to work as + # expected. It validates the partial against the JSON Schema, so in this + # case you have to supply an object that is valid according to the + # schema. We thus have to do our own merging. + + # Also: we are usign the underlying API directly to avoid going back and + # forth between camel and snake case. + existing_obj = self.client.objects_api.retrieve("object", uuid=uuid) + existing_data = existing_obj["record"]["data"] + self.client.objects_api.partial_update( + "object", + { + "record": { + "startAt": datetime.date.today().isoformat(), + "data": existing_data | updated_data, + } + }, + uuid=uuid, + ) + # Refresh the object and build the Bericht model + return self.client.get_object(uuid) diff --git a/src/open_inwoner/berichten/views/bericht_detail.py b/src/open_inwoner/berichten/views/bericht_detail.py index 715ace9b31..0819349ad1 100644 --- a/src/open_inwoner/berichten/views/bericht_detail.py +++ b/src/open_inwoner/berichten/views/bericht_detail.py @@ -30,5 +30,9 @@ def page_title(self): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) service = BerichtenService() - context["bericht"] = service.fetch_bericht(self.kwargs["object_uuid"]) + bericht = service.fetch_bericht(self.kwargs["object_uuid"]) + context["bericht"] = bericht + if not bericht.geopend: + service.update_object(self.kwargs["object_uuid"], {"geopend": True}) + return context From 5b7c7da60f1b9d8fa96c434d38c83e31c0a58d61 Mon Sep 17 00:00:00 2001 From: Sidney Richards Date: Wed, 9 Oct 2024 17:10:40 +0200 Subject: [PATCH 2/2] Add a URL to mark a bericht as unread --- src/open_inwoner/berichten/urls.py | 9 ++++++--- src/open_inwoner/berichten/views/__init__.py | 4 ++-- src/open_inwoner/berichten/views/bericht_detail.py | 14 +++++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/open_inwoner/berichten/urls.py b/src/open_inwoner/berichten/urls.py index 280c696d46..03db5df0d3 100644 --- a/src/open_inwoner/berichten/urls.py +++ b/src/open_inwoner/berichten/urls.py @@ -1,12 +1,15 @@ from django.urls import path -from open_inwoner.berichten.views.bericht_detail import BerichtDetailView - -from .views import BerichtListView +from .views import BerichtDetailView, BerichtListView, mark_bericht_as_unread app_name = "berichten" urlpatterns = [ path("/", BerichtDetailView.as_view(), name="detail"), + path( + "/mark-unread", + mark_bericht_as_unread, + name="mark-bericht-unread", + ), path("", BerichtListView.as_view(), name="list"), ] diff --git a/src/open_inwoner/berichten/views/__init__.py b/src/open_inwoner/berichten/views/__init__.py index 46590ca808..e4eee06fe7 100644 --- a/src/open_inwoner/berichten/views/__init__.py +++ b/src/open_inwoner/berichten/views/__init__.py @@ -1,4 +1,4 @@ -from .bericht_detail import BerichtDetailView +from .bericht_detail import BerichtDetailView, mark_bericht_as_unread from .bericht_list import BerichtListView -__all__ = ["BerichtDetailView", "BerichtListView"] +__all__ = ["BerichtDetailView", "BerichtListView", "mark_bericht_as_unread"] diff --git a/src/open_inwoner/berichten/views/bericht_detail.py b/src/open_inwoner/berichten/views/bericht_detail.py index 0819349ad1..4586d411ee 100644 --- a/src/open_inwoner/berichten/views/bericht_detail.py +++ b/src/open_inwoner/berichten/views/bericht_detail.py @@ -1,5 +1,8 @@ import logging +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin +from django.http import HttpResponseRedirect from django.urls import reverse from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ @@ -13,7 +16,9 @@ logger = logging.getLogger(__name__) -class BerichtDetailView(CommonPageMixin, BaseBreadcrumbMixin, TemplateView): +class BerichtDetailView( + CommonPageMixin, BaseBreadcrumbMixin, TemplateView, LoginRequiredMixin +): template_name = "pages/berichten/detail.html" @@ -36,3 +41,10 @@ def get_context_data(self, **kwargs): service.update_object(self.kwargs["object_uuid"], {"geopend": True}) return context + + +@login_required +def mark_bericht_as_unread(request, object_uuid): + service = BerichtenService() + service.update_object(object_uuid, {"geopend": False}) + return HttpResponseRedirect(reverse("berichten:list"))