From 69a88039eae535ee41b8cac94c2cf4516a6954d4 Mon Sep 17 00:00:00 2001 From: silvia Date: Thu, 14 Jan 2021 17:53:23 +0100 Subject: [PATCH] :ambulance: [#820] CMIS docs considered external When the ZIOs are filtered on informatieobject, the URL should be used rather than the canonical instance. --- src/openzaak/components/zaken/api/filters.py | 35 +++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/openzaak/components/zaken/api/filters.py b/src/openzaak/components/zaken/api/filters.py index 42e583e41..6d47c3e17 100644 --- a/src/openzaak/components/zaken/api/filters.py +++ b/src/openzaak/components/zaken/api/filters.py @@ -1,7 +1,12 @@ # SPDX-License-Identifier: EUPL-1.2 # Copyright (C) 2019 - 2020 Dimpact +from urllib.parse import urlparse + +from django.conf import settings + from django_filters import filters from django_loose_fk.filters import FkOrUrlFieldFilter +from django_loose_fk.utils import get_resource_for_path from vng_api_common.filtersets import FilterSet from vng_api_common.utils import get_help_text @@ -123,8 +128,36 @@ class Meta: fields = ("zaak", "resultaattype") +class FkOrUrlOrCMISFieldFilter(FkOrUrlFieldFilter): + def filter(self, qs, value): + if not value: + return qs + + parsed = urlparse(value) + host = self.parent.request.get_host() + + local = parsed.netloc == host + if settings.CMIS_ENABLED: + local = False + + # introspect field to build filter + model_field = self.model._meta.get_field(self.field_name) + + if local: + local_object = get_resource_for_path(parsed.path) + if self.instance_path: + for bit in self.instance_path.split("."): + local_object = getattr(local_object, bit) + filters = {f"{model_field.fk_field}__{self.lookup_expr}": local_object} + else: + filters = {f"{model_field.url_field}__{self.lookup_expr}": value} + + qs = self.get_method(qs)(**filters) + return qs.distinct() if self.distinct else qs + + class ZaakInformatieObjectFilter(FilterSet): - informatieobject = FkOrUrlFieldFilter( + informatieobject = FkOrUrlOrCMISFieldFilter( queryset=ZaakInformatieObject.objects.all(), instance_path="canonical", help_text=get_help_text("zaken.ZaakInformatieObject", "informatieobject"),