def test_page_returns_on_get(self): # set up some initial data iot = InformatieObjectTypeFactory.create() Autorisatie.objects.create( applicatie=self.applicatie, component=ComponentTypes.drc, scopes=["documenten.lezen"], max_vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. openbaar, informatieobjecttype=build_absolute_url( iot.get_absolute_api_url()), ) AutorisatieSpecFactory.create( applicatie=self.applicatie, component=ComponentTypes.brc, scopes=["besluiten.lezen"], ) Autorisatie.objects.create( applicatie=self.applicatie, component=ComponentTypes.nrc, scopes=["notificaties.consumeren"], ) response = self.client.get(self.url) self.assertEqual(response.status_code, 200)
def test_autorisaties_are_deleted(self): applicatie = ApplicatieFactory.create() zaaktype = ZaakTypeFactory.create() AutorisatieFactory.create( applicatie=applicatie, component=ComponentTypes.zrc, zaaktype=build_absolute_url(zaaktype.get_absolute_api_url()), max_vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. openbaar, ) # Different max_vertrouwelijkheidaanduiding compared to the Autorisatie autorisatie_spec = AutorisatieSpecFactory.create( applicatie=applicatie, component=ComponentTypes.zrc, max_vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding. geheim, ) self.assertEqual(Autorisatie.objects.all().count(), 1) autorisatie = Autorisatie.objects.get() self.assertEqual( autorisatie.max_vertrouwelijkheidaanduiding, VertrouwelijkheidsAanduiding.openbaar, ) autorisatie_spec.sync() # Check that the autorisatie that doesn't match the AutorisatieSpec is deleted and replaced with a correct one self.assertEqual(Autorisatie.objects.all().count(), 1) autorisatie = Autorisatie.objects.get() self.assertEqual( autorisatie.max_vertrouwelijkheidaanduiding, VertrouwelijkheidsAanduiding.geheim, )
def sync_autorisaties(sender: ModelBase, signal: ModelSignal, instance: Union[ZaakType, InformatieObjectType, BesluitType], **kwargs) -> None: logger.debug("Received signal %r, from sender %r", signal, sender) instance_path = instance.get_absolute_api_url() instance_url = build_absolute_url(instance_path) Autorisatie.objects.filter(zaaktype=instance_url).delete()
def get_absolute_url(url_name: str, uuid: str) -> str: path = reverse( url_name, kwargs={ "version": settings.REST_FRAMEWORK["DEFAULT_VERSION"], "uuid": uuid }, ) return build_absolute_url(path)
def _add_autorisatie(self, obj, **kwargs): url = build_absolute_url(obj.get_absolute_api_url()) field = obj._meta.model_name Autorisatie.objects.create( applicatie=self.applicatie, **{ field: url, **kwargs }, )
def sync(cls): """ Synchronize the Autorisaties for all Applicaties. Invoke this method whenever a ZaakType/InformatieObjectType/BesluitType is created to set up the appropriate Autorisatie objects. This is best called as part of `transaction.on_commit`. """ from .utils import send_applicatie_changed_notification qs = cls.objects.select_related("applicatie").prefetch_related( "applicatie__autorisaties") to_delete = [] to_keep = [] to_add = [] for spec in qs: existing_autorisaties = [ autorisatie for autorisatie in spec.applicatie.autorisaties.all() if autorisatie.component == spec.component ] for autorisatie in existing_autorisaties: # schedule for deletion if existing objects differ from the spec if (autorisatie.max_vertrouwelijkheidaanduiding != spec.max_vertrouwelijkheidaanduiding): to_delete.append(autorisatie) continue if set(autorisatie.scopes) != set(spec.scopes): to_delete.append(autorisatie) continue to_keep.append(autorisatie) TypeModel = apps.get_model(COMPONENT_TO_MODEL[spec.component]) field = COMPONENT_TO_FIELD[spec.component] for obj in TypeModel.objects.all(): url = build_absolute_url(obj.get_absolute_api_url()) autorisatie = Autorisatie(applicatie=spec.applicatie, component=spec.component, scopes=spec.scopes, max_vertrouwelijkheidaanduiding=spec. max_vertrouwelijkheidaanduiding, **{field: url}) to_add.append(autorisatie) Autorisatie.objects.filter( pk__in=[autorisatie.pk for autorisatie in to_delete]) # de-duplicate - whatever is in to_keep should not be added again existing_urls = defaultdict(list) for autorisatie in to_keep: if autorisatie.component not in COMPONENT_TO_FIELD: continue url = getattr(autorisatie, COMPONENT_TO_FIELD[autorisatie.component]) existing_urls[autorisatie.component].append(url) _to_add = [] for autorisatie in to_add: if autorisatie.component not in COMPONENT_TO_FIELD: continue url = getattr(autorisatie, COMPONENT_TO_FIELD[autorisatie.component]) if url in existing_urls[autorisatie.component]: continue _to_add.append(autorisatie) # created the de-duplicated, missing autorisaties Autorisatie.objects.bulk_create(_to_add) # determine which notifications to send changed = { autorisatie.applicatie for autorisatie in (to_delete + _to_add) } for applicatie in changed: send_applicatie_changed_notification(applicatie)