diff --git a/src/open_inwoner/accounts/signals.py b/src/open_inwoner/accounts/signals.py index 00bcf571d6..8fdd577dca 100644 --- a/src/open_inwoner/accounts/signals.py +++ b/src/open_inwoner/accounts/signals.py @@ -1,14 +1,13 @@ import logging -from django.conf import settings from django.contrib.auth.signals import user_logged_in, user_logged_out +from django.core.exceptions import ImproperlyConfigured from django.dispatch import receiver from django.urls import reverse from django.utils.translation import gettext as _ from open_inwoner.haalcentraal.models import HaalCentraalConfig from open_inwoner.haalcentraal.utils import update_brp_data_in_db -from open_inwoner.openklant.models import OpenKlant2Config from open_inwoner.openklant.services import OpenKlant2Service, eSuiteKlantenService from open_inwoner.utils.logentry import user_action @@ -37,27 +36,26 @@ def update_user_from_klant_on_login(sender, user, request, *args, **kwargs): return # OpenKlant2 - # TODO: replace with proper config and refactor branching - use_ok2 = getattr(settings, "OPENKLANT2_ACTIVE", None) - if use_ok2 and (openklant2_config := OpenKlant2Config.from_django_settings()): - try: - service = OpenKlant2Service(config=openklant2_config) - except RuntimeError: - logger.error("OpenKlant2 service failed to build") - return - - if not (fetch_params := service.get_fetch_parameters(request=request)): - return - - partij, created = service.get_or_create_partij_for_user( - fetch_params=fetch_params, user=user - ) - if partij and not created: - service.update_user_from_partij(partij_uuid=partij["uuid"], user=user) + try: + service = OpenKlant2Service() + except ImproperlyConfigured: + logger.error("OpenKlant2 configuration missing") + except RuntimeError: + logger.error("Failed to build OpenKlant2Service") + else: + if fetch_params := service.get_fetch_parameters(request=request): + partij, created = service.get_or_create_partij_for_user( + fetch_params=fetch_params, user=user + ) + if partij and not created: + service.update_user_from_partij(partij_uuid=partij.uuid, user=user) # eSuite try: service = eSuiteKlantenService() + except ImproperlyConfigured: + logger.error("eSuiteKlantenService missing configuration") + return except RuntimeError: logger.error("eSuiteKlantenService failed to build") return diff --git a/src/open_inwoner/accounts/views/contactmoments.py b/src/open_inwoner/accounts/views/contactmoments.py index 2371f18a61..108f70421b 100644 --- a/src/open_inwoner/accounts/views/contactmoments.py +++ b/src/open_inwoner/accounts/views/contactmoments.py @@ -2,6 +2,7 @@ from typing import Iterable, Protocol from django.contrib.auth.mixins import AccessMixin +from django.core.exceptions import ImproperlyConfigured from django.http import Http404, HttpResponseRedirect from django.shortcuts import redirect from django.urls import reverse @@ -89,11 +90,21 @@ def get_fetch_parameters( class KlantContactMomentBaseView( CommonPageMixin, BaseBreadcrumbMixin, KlantContactMomentAccessMixin, TemplateView ): - def get_service(self, service_type: KlantenServiceType) -> VragenService: + def get_service(self, service_type: KlantenServiceType) -> VragenService | None: if service_type == KlantenServiceType.ESUITE: - return eSuiteVragenService() + try: + return eSuiteVragenService() + except ImproperlyConfigured: + logger.error("eSuiteVragenService configuration missing") + except RuntimeError: + logger.error("Failed to build eSuiteVragenService") elif service_type == KlantenServiceType.OPENKLANT2: - return OpenKlant2Service() + try: + return OpenKlant2Service() + except ImproperlyConfigured: + logger.error("OpenKlant2 configuration missing") + except RuntimeError: + logger.error("Failed to build OpenKlant2Service") def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) @@ -135,20 +146,24 @@ def get_anchors(self) -> list: def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - esuite_service = self.get_service(service_type=KlantenServiceType.ESUITE) - ok2_service = self.get_service(service_type=KlantenServiceType.OPENKLANT2) - questions_esuite = esuite_service.list_questions( - fetch_params=self.get_fetch_params(esuite_service), - user=self.request.user, - ) - questions_ok2 = ok2_service.list_questions( - self.get_fetch_params(ok2_service), - user=self.request.user, - ) - all_questions = questions_esuite + questions_ok2 - all_questions.sort(key=lambda q: q["registered_date"], reverse=True) - ctx["contactmomenten"] = all_questions + questions = [] + if esuite_service := self.get_service(service_type=KlantenServiceType.ESUITE): + questions.extend( + esuite_service.list_questions( + fetch_params=self.get_fetch_params(esuite_service), + user=self.request.user, + ) + ) + if ok2_service := self.get_service(service_type=KlantenServiceType.OPENKLANT2): + questions.extend( + ok2_service.list_questions( + self.get_fetch_params(ok2_service), + user=self.request.user, + ) + ) + questions.sort(key=lambda q: q["registered_date"], reverse=True) + ctx["contactmomenten"] = questions paginator_dict = self.paginate_with_context(ctx["contactmomenten"]) ctx.update(paginator_dict) diff --git a/src/open_inwoner/openklant/models.py b/src/open_inwoner/openklant/models.py index c1d0029910..af4d9694a0 100644 --- a/src/open_inwoner/openklant/models.py +++ b/src/open_inwoner/openklant/models.py @@ -3,7 +3,6 @@ from typing import Self from urllib.parse import urljoin, urlparse, urlunparse -from django.core.exceptions import ImproperlyConfigured from django.db import models from django.utils.translation import gettext_lazy as _ @@ -213,13 +212,11 @@ def api_url(self): return urlunparse((scheme, netloc, path, params, query, fragment)) @classmethod - def from_django_settings(cls) -> Self: + def from_django_settings(cls) -> Self | None: from django.conf import settings if not (config := getattr(settings, "OPENKLANT2_CONFIG", None)): - raise ImproperlyConfigured( - "Please set OPENKLANT2_CONFIG in your settings to configure OpenKlant2" - ) + return None return cls(**config) diff --git a/src/open_inwoner/openklant/services.py b/src/open_inwoner/openklant/services.py index 9c52ac9fd3..447c993b47 100644 --- a/src/open_inwoner/openklant/services.py +++ b/src/open_inwoner/openklant/services.py @@ -5,6 +5,7 @@ from typing import Iterable, Literal, NotRequired, Protocol, Self from django.conf import settings +from django.core.exceptions import ImproperlyConfigured from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -142,7 +143,9 @@ class eSuiteKlantenService(KlantenService): def __init__(self, config: OpenKlantConfig | None = None): self.config = config or OpenKlantConfig.get_solo() if not self.config: - raise RuntimeError("eSuiteKlantenService instance needs a configuration") + raise ImproperlyConfigured( + "eSuiteKlantenService instance needs a configuration" + ) self.service_config = self.config.klanten_service if not self.service_config: @@ -770,7 +773,9 @@ class OpenKlant2Service(KlantenService): def __init__(self, config: OpenKlant2Config | None = None): self.config = config or OpenKlant2Config.from_django_settings() if not self.config: - raise RuntimeError("OpenKlant2Service instance needs a configuration") + raise ImproperlyConfigured( + "Please set OPENKLANT2_CONFIG in your settings to configure OpenKlant2" + ) self.client = OpenKlant2Client( base_url=self.config.api_url, diff --git a/src/open_inwoner/openklant/tests/test_views.py b/src/open_inwoner/openklant/tests/test_views.py index 5725fa2add..7eaf4a02fe 100644 --- a/src/open_inwoner/openklant/tests/test_views.py +++ b/src/open_inwoner/openklant/tests/test_views.py @@ -2,6 +2,9 @@ from unittest.mock import patch from uuid import uuid4 +from django.contrib.auth import signals + +# from django.db.models import signals from django.test import modify_settings, override_settings from django.urls import reverse from django.utils.translation import gettext as _ @@ -12,6 +15,7 @@ from pyquery import PyQuery from zgw_consumers.api_models.base import factory +from open_inwoner.accounts.signals import update_user_from_klant_on_login from open_inwoner.accounts.tests.factories import UserFactory from open_inwoner.configurations.models import SiteConfiguration from open_inwoner.openklant.api_models import ContactMoment, Klant, KlantContactMoment @@ -91,6 +95,8 @@ class ContactMomentViewsTestCase( def setUp(self): super().setUp() + signals.user_logged_in.disconnect(receiver=update_user_from_klant_on_login) + MockAPIReadData.setUpServices() self.api_group = ZGWApiGroupConfig.objects.get()