def setUp(self):
        super().setUp()

        vandaag = self.genereerdatum()
        self.context = {
            'gemeentecode': '1234',
            'datumVandaag': vandaag,
            'datumGisteren': self.genereerdatum(-1),
            'datumEergisteren': self.genereerdatum(-2),
            'tijdstipRegistratie': self.genereerdatumtijd(),

            'zds_zaaktype_code': '12345678',
            'zds_zaaktype_omschrijving': 'Aanvraag burgerservicenummer behandelen',
            'referentienummer': self.genereerID(10),
            'creerzaak_identificatie_9': self.genereerID(10),
            'voegzaakdocumenttoe_identificatie_5': self.genereerID(10),
            'voegzaakdocumenttoe_identificatie_7': self.genereerID(10),
            'maakzaakdocument_identificatie_5': self.genereerID(10),
        }

        self._dms_client.geef_inhoud.return_value = 'dummy.txt', BytesIO()

        self.zaak = ZaakFactory.create(
            zaakidentificatie=self.context['gemeentecode'] + self.context['creerzaak_identificatie_9'],
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            omschrijving='omschrijving'
        )
        self.edc_type2 = InformatieObjectTypeFactory.create(informatieobjecttypeomschrijving='omschrijving1')
        self.zaakdocument = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype__informatieobjecttypeomschrijving='omschrijving',
            informatieobjectidentificatie=self.context['voegzaakdocumenttoe_identificatie_5'],
            formaat='formaat',
            creatiedatum=vandaag,
            titel='titel',
            taal='taal',
            vertrouwelijkaanduiding='VERTROUWELIJK',
            auteur='auteur',
            link=None
        )
        ZaakInformatieObjectFactory.create(zaak=self.zaak, informatieobject=self.zaakdocument)

        self.zaakdocument2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjectidentificatie=self.context['voegzaakdocumenttoe_identificatie_7'],
            vertrouwelijkaanduiding='VERTROUWELIJK',
            auteur='auteur',
        )
        ZaakInformatieObjectFactory.create(zaak=self.zaak, informatieobject=self.zaakdocument2)

        self.zaakdocument3 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjectidentificatie=self.context['maakzaakdocument_identificatie_5'],
            vertrouwelijkaanduiding='VERTROUWELIJK',
            auteur='auteur',
        )
        ZaakInformatieObjectFactory.create(zaak=self.zaak, informatieobject=self.zaakdocument3)
    def test_voeg_zaakdocument_toe(self):
        """
        4.3.4.3 Interactie tussen ZS en DMS

        Het ZS zorgt ervoor dat het document dat is aangeboden door de DSC wordt vastgelegd in het DMS.
        Hiervoor maakt het ZS gebruik van de CMIS-services die aangeboden worden door het DMS. Hierbij
        gelden de volgende eisen:
        - Het document wordt gerelateerd aan de juiste Zaakfolder (Zie 5.1)
        - Het document wordt opgeslagen als objecttype EDC (Zie 5.2)
        - Minimaal de vereiste metadata voor een EDC wordt vastgelegd in de daarvoor gedefinieerde
        objectproperties. In Tabel 3 is een mapping aangegeven tussen de StUF-ZKN-elementen en
        CMIS-objectproperties.
        """
        zaak = ZaakFactory.create(status_set__indicatie_laatst_gezette_status=JaNee.ja)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document)
        document.refresh_from_db()

        result = self.client.zet_inhoud(document, BytesIO(b'some content'), content_type='text/plain')

        self.assertIsNone(result)
        filename, file_obj = self.client.geef_inhoud(document)
        self.assertEqual(file_obj.read(), b'some content')
    def test_update_zaakdocument_only_props(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        # Update the document
        document.titel = 'nieuwe naam'
        document.beschrijving = 'Andere beschrijving'
        document.save()

        result = self.client.update_zaakdocument(document)

        self.assertIsNone(result)
        cmis_doc = cmis_doc.getLatestVersion()
        self.assertExpectedProps(
            cmis_doc, {
                'cmis:contentStreamLength': 0,
                'zsdms:documentIdentificatie': '31415926535',
                'cmis:versionSeriesCheckedOutId': None,
                'cmis:name': 'nieuwe naam',
                'zsdms:documentbeschrijving': 'Andere beschrijving',
            }
        )
    def test_update_zaakdocument_content(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='andere bestandsnaam.txt')

        result = self.client.update_zaakdocument(document, inhoud=inhoud)

        self.assertIsNone(result)
        filename, content = self.client.geef_inhoud(document)
        self.assertEqual(filename, 'andere bestandsnaam.txt')
        self.assertEqual(content.read(), b'leaky abstraction...')

        cmis_doc = cmis_doc.getLatestVersion()
        self.assertExpectedProps(
            cmis_doc, {
                'cmis:contentStreamLength': 20,
                'zsdms:documentIdentificatie': '31415926535',
                'cmis:versionSeriesCheckedOutId': None,
                'cmis:name': 'andere bestandsnaam.txt',
            }
        )
    def test_cancel_checkout(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)
        checkout_id, checkout_by = self.client.checkout(document)

        result = self.client.cancel_checkout(document, checkout_id)

        self.assertIsNone(result)
        # if the doc cannot be checked out, it was not unlocked
        cmis_doc = self.client._get_cmis_doc(document)
        try:
            cmis_doc.checkout()
        except UpdateConflictException:
            self.fail("Could not lock document after checkout cancel, it is still locked")
    def test_checkout(self):
        """
        Assert that checking out a document locks it and returns the PWC ID
        """
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)

        checkout_id, checkout_by = self.client.checkout(document)

        pwc = cmis_doc.getPrivateWorkingCopy()
        self.assertEqual(
            checkout_id,
            pwc.properties['cmis:versionSeriesCheckedOutId']
        )
        self.assertEqual(checkout_by, 'admin')
    def test_update_checked_out_zaakdocument_with_checkout_id(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        pwc = cmis_doc.checkout()
        pwc.reload()
        checkout_id = pwc.properties['cmis:versionSeriesCheckedOutId']
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='andere bestandsnaam.txt')

        result = self.client.update_zaakdocument(document, checkout_id=checkout_id, inhoud=inhoud)

        self.assertIsNone(result)
        filename, content = self.client.geef_inhoud(document)
        self.assertEqual(filename, 'andere bestandsnaam.txt')
        self.assertEqual(content.read(), b'leaky abstraction...')

        # check that it's checked in again
        new_pwc = cmis_doc.getPrivateWorkingCopy()
        self.assertIsNone(new_pwc)
    def test_update_checked_out_zaakdocument_with_checkout_id(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        pwc = cmis_doc.checkout()
        pwc.reload()
        checkout_id = pwc.properties['cmis:versionSeriesCheckedOutId']
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='andere bestandsnaam.txt')

        result = self.client.update_zaakdocument(document, checkout_id=checkout_id, inhoud=inhoud)

        self.assertIsNone(result)
        filename, content = self.client.geef_inhoud(document)
        self.assertEqual(filename, 'andere bestandsnaam.txt')
        self.assertEqual(content.read(), b'leaky abstraction...')

        # check that it's checked in again
        new_pwc = cmis_doc.getPrivateWorkingCopy()
        self.assertIsNone(new_pwc)
    def test_update_zaakdocument_content(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='andere bestandsnaam.txt')

        result = self.client.update_zaakdocument(document, inhoud=inhoud)

        self.assertIsNone(result)
        filename, content = self.client.geef_inhoud(document)
        self.assertEqual(filename, 'andere bestandsnaam.txt')
        self.assertEqual(content.read(), b'leaky abstraction...')

        cmis_doc = cmis_doc.getLatestVersion()
        self.assertExpectedProps(
            cmis_doc, {
                'cmis:contentStreamLength': 20,
                'zsdms:documentIdentificatie': '31415926535',
                'cmis:versionSeriesCheckedOutId': None,
                'cmis:name': 'andere bestandsnaam.txt',
            }
        )
    def test_update_zaakdocument_only_props(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        # Update the document
        document.titel = 'nieuwe naam'
        document.beschrijving = 'Andere beschrijving'
        document.save()

        result = self.client.update_zaakdocument(document)

        self.assertIsNone(result)
        cmis_doc = cmis_doc.getLatestVersion()
        self.assertExpectedProps(
            cmis_doc, {
                'cmis:contentStreamLength': 0,
                'zsdms:documentIdentificatie': '31415926535',
                'cmis:versionSeriesCheckedOutId': None,
                'cmis:name': 'nieuwe naam',
                'zsdms:documentbeschrijving': 'Andere beschrijving',
            }
        )
    def test_checkout(self):
        """
        Assert that checking out a document locks it and returns the PWC ID
        """
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)

        checkout_id, checkout_by = self.client.checkout(document)

        pwc = cmis_doc.getPrivateWorkingCopy()
        self.assertEqual(
            checkout_id,
            pwc.properties['cmis:versionSeriesCheckedOutId']
        )
        self.assertEqual(checkout_by, 'admin')
    def test_voeg_zaakdocument_toe(self):
        """
        4.3.4.3 Interactie tussen ZS en DMS

        Het ZS zorgt ervoor dat het document dat is aangeboden door de DSC wordt vastgelegd in het DMS.
        Hiervoor maakt het ZS gebruik van de CMIS-services die aangeboden worden door het DMS. Hierbij
        gelden de volgende eisen:
        - Het document wordt gerelateerd aan de juiste Zaakfolder (Zie 5.1)
        - Het document wordt opgeslagen als objecttype EDC (Zie 5.2)
        - Minimaal de vereiste metadata voor een EDC wordt vastgelegd in de daarvoor gedefinieerde
        objectproperties. In Tabel 3 is een mapping aangegeven tussen de StUF-ZKN-elementen en
        CMIS-objectproperties.
        """
        zaak = ZaakFactory.create(status_set__indicatie_laatst_gezette_status=JaNee.ja)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document)
        document.refresh_from_db()

        result = self.client.zet_inhoud(document, BytesIO(b'some content'), content_type='text/plain')

        self.assertIsNone(result)
        filename, file_obj = self.client.geef_inhoud(document)
        self.assertEqual(file_obj.read(), b'some content')
    def test_cancel_checkout(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)
        checkout_id, checkout_by = self.client.checkout(document)

        result = self.client.cancel_checkout(document, checkout_id)

        self.assertIsNone(result)
        # if the doc cannot be checked out, it was not unlocked
        cmis_doc = self.client._get_cmis_doc(document)
        try:
            cmis_doc.checkout()
        except UpdateConflictException:
            self.fail("Could not lock document after checkout cancel, it is still locked")
Пример #14
0
    def test_lees_document(self):
        """
        Ref #83: geefZaakdocumentLezen vraagt een kopie van het bestand op.

        Van het bestand uit het DMS wordt opgevraagd: inhoud, bestandsnaam.
        """
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja)
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            informatieobjectidentificatie='123456', zaak=zaak)
        cmis_doc = self.client.maak_zaakdocument(document, zaak)

        # empty by default
        filename, file_obj = self.client.geef_inhoud(document)

        self.assertEqual(filename, document.titel)
        self.assertEqual(file_obj.read(), b'')

        cmis_doc.setContentStream(BytesIO(b'some content'), 'text/plain')

        filename, file_obj = self.client.geef_inhoud(document)

        self.assertEqual(filename, document.titel)
        self.assertEqual(file_obj.read(), b'some content')
 def setUp(self):
     super().setUp()
     self.status = StatusFactory.create(indicatie_laatst_gezette_status=JaNee.ja)
     self.zaak = ZaakFactory.create()
     self.zaak.status_set.add(self.status)
     self.edc1 = EnkelvoudigInformatieObjectFactory.create()
     self.zio = ZaakInformatieObjectFactory.create(zaak=self.zaak,
                                                   informatieobject=self.edc1)
    def test_create_lock_update_flow(self):
        """
        Assert that it's possible to create an empty document, lock it for
        update and then effectively set the content thereby unlocking it.
        """
        # data setup
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)

        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='bestand.txt')

        # flow
        self.client.maak_zaakdocument(document, zaak)  # create empty doc
        checkout_id, checkout_by = self.client.checkout(document)  # lock for update
        self.client.update_zaakdocument(document, checkout_id, inhoud=inhoud)
        filename, file_obj = self.client.geef_inhoud(document)

        # make assertions about the results
        self.assertEqual(filename, 'bestand.txt')
        self.assertEqual(file_obj.read(), b'leaky abstraction...')

        # verify expected props
        cmis_doc = self.client._get_cmis_doc(document)
        self.assertExpectedProps(cmis_doc, {
            'cmis:contentStreamFileName': 'bestand.txt',
            'cmis:contentStreamLength': 20,
            'cmis:contentStreamMimeType': 'application/binary',  # the default if it couldn't be determined
            # 'zsdms:dct.categorie': document.informatieobjecttype.informatieobjectcategorie,
            'zsdms:dct.omschrijving': document.informatieobjecttype.informatieobjecttypeomschrijving,
            'zsdms:documentIdentificatie': '31415926535',
            'zsdms:documentauteur': None,
            'zsdms:documentbeschrijving': 'Een beschrijving',
            'zsdms:documentcreatiedatum': _stuffdate_to_datetime(document.creatiedatum),
            # 'zsdms:documentformaat': None,
            'zsdms:documentLink': document.link,
            'zsdms:documentontvangstdatum': None,
            'zsdms:documentstatus': None,
            'zsdms:documenttaal': document.taal,
            'zsdms:documentversie': None,
            'zsdms:documentverzenddatum': None,
            'zsdms:vertrouwelijkaanduiding': None
        })

        # the doc must be unlocked after update, easy check -> lock it
        try:
            cmis_doc.checkout()
        except UpdateConflictException:
            self.fail("Could not lock document after update, it was already/still locked")
    def test_create_lock_update_flow(self):
        """
        Assert that it's possible to create an empty document, lock it for
        update and then effectively set the content thereby unlocking it.
        """
        # data setup
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)

        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='bestand.txt')

        # flow
        self.client.maak_zaakdocument(document, zaak)  # create empty doc
        checkout_id, checkout_by = self.client.checkout(document)  # lock for update
        self.client.update_zaakdocument(document, checkout_id, inhoud=inhoud)
        filename, file_obj = self.client.geef_inhoud(document)

        # make assertions about the results
        self.assertEqual(filename, 'bestand.txt')
        self.assertEqual(file_obj.read(), b'leaky abstraction...')

        # verify expected props
        cmis_doc = self.client._get_cmis_doc(document)
        self.assertExpectedProps(cmis_doc, {
            'cmis:contentStreamFileName': 'bestand.txt',
            'cmis:contentStreamLength': 20,
            'cmis:contentStreamMimeType': 'application/binary',  # the default if it couldn't be determined
            # 'zsdms:dct.categorie': document.informatieobjecttype.informatieobjectcategorie,
            'zsdms:dct.omschrijving': document.informatieobjecttype.informatieobjecttypeomschrijving,
            'zsdms:documentIdentificatie': '31415926535',
            'zsdms:documentauteur': None,
            'zsdms:documentbeschrijving': 'Een beschrijving',
            'zsdms:documentcreatiedatum': _stuffdate_to_datetime(document.creatiedatum),
            # 'zsdms:documentformaat': None,
            'zsdms:documentLink': document.link,
            'zsdms:documentontvangstdatum': None,
            'zsdms:documentstatus': None,
            'zsdms:documenttaal': document.taal,
            'zsdms:documentversie': None,
            'zsdms:documentverzenddatum': None,
            'zsdms:vertrouwelijkaanduiding': None
        })

        # the doc must be unlocked after update, easy check -> lock it
        try:
            cmis_doc.checkout()
        except UpdateConflictException:
            self.fail("Could not lock document after update, it was already/still locked")
    def test_maak_zaakdocument(self):
        """
        4.3.5.3 - test dat het aanmaken van een zaakdocument mogelijk is.
        """
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)

        document = EnkelvoudigInformatieObjectFactory.create(
            zaak=zaak,
            titel='testnaam',
            informatieobjectidentificatie='31415926535',
            ontvangstdatum='20170101',
            beschrijving='Een beschrijving',

        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        # no actual binary data is added
        # we have to set an (empty) stream, otherwise cmislib blocks us from setting/reading the stream
        # self.assertIsNone(cmis_doc.properties['cmis:contentStreamFileName'])

        # verify that it identifications are unique
        with self.assertRaises(DocumentExistsError):
            self.client.maak_zaakdocument(document, zaak)

        # verify expected props
        self.assertExpectedProps(cmis_doc, {
            # when no contentstreamfilename is provided, it is apparently set to the document name
            'cmis:contentStreamFileName': 'testnaam',
            # 'cmis:contentStreamId': None,
            'cmis:contentStreamLength': 0,  # because we created an empty object
            'cmis:contentStreamMimeType': 'application/binary',  # the default if it couldn't be determined
            # 'zsdms:dct.categorie': document.informatieobjecttype.informatieobjectcategorie,
            'zsdms:dct.omschrijving': document.informatieobjecttype.informatieobjecttypeomschrijving,
            'zsdms:documentIdentificatie': '31415926535',
            'zsdms:documentauteur': None,
            'zsdms:documentbeschrijving': 'Een beschrijving',
            'zsdms:documentcreatiedatum': _stuffdate_to_datetime(document.creatiedatum),
            # 'zsdms:documentformaat': None,
            'zsdms:documentLink': document.link,
            'zsdms:documentontvangstdatum': _stuffdate_to_datetime(document.ontvangstdatum),
            'zsdms:documentstatus': None,
            'zsdms:documenttaal': document.taal,
            'zsdms:documentversie': None,
            'zsdms:documentverzenddatum': None,
            'zsdms:vertrouwelijkaanduiding': None
        })

        document.refresh_from_db()
        self.assertEqual(
            document._object_id,
            cmis_doc.properties['cmis:objectId'].rsplit(';')[0]
        )
    def test_maak_zaakdocument(self):
        """
        4.3.5.3 - test dat het aanmaken van een zaakdocument mogelijk is.
        """
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)

        document = EnkelvoudigInformatieObjectFactory.create(
            zaak=zaak,
            titel='testnaam',
            informatieobjectidentificatie='31415926535',
            ontvangstdatum='20170101',
            beschrijving='Een beschrijving',

        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        # no actual binary data is added
        # we have to set an (empty) stream, otherwise cmislib blocks us from setting/reading the stream
        # self.assertIsNone(cmis_doc.properties['cmis:contentStreamFileName'])

        # verify that it identifications are unique
        with self.assertRaises(DocumentExistsError):
            self.client.maak_zaakdocument(document, zaak)

        # verify expected props
        self.assertExpectedProps(cmis_doc, {
            # when no contentstreamfilename is provided, it is apparently set to the document name
            'cmis:contentStreamFileName': 'testnaam',
            # 'cmis:contentStreamId': None,
            'cmis:contentStreamLength': 0,  # because we created an empty object
            'cmis:contentStreamMimeType': 'application/binary',  # the default if it couldn't be determined
            # 'zsdms:dct.categorie': document.informatieobjecttype.informatieobjectcategorie,
            'zsdms:dct.omschrijving': document.informatieobjecttype.informatieobjecttypeomschrijving,
            'zsdms:documentIdentificatie': '31415926535',
            'zsdms:documentauteur': None,
            'zsdms:documentbeschrijving': 'Een beschrijving',
            'zsdms:documentcreatiedatum': _stuffdate_to_datetime(document.creatiedatum),
            # 'zsdms:documentformaat': None,
            'zsdms:documentLink': document.link,
            'zsdms:documentontvangstdatum': _stuffdate_to_datetime(document.ontvangstdatum),
            'zsdms:documentstatus': None,
            'zsdms:documenttaal': document.taal,
            'zsdms:documentversie': None,
            'zsdms:documentverzenddatum': None,
            'zsdms:vertrouwelijkaanduiding': None
        })

        document.refresh_from_db()
        self.assertEqual(
            document._object_id,
            cmis_doc.properties['cmis:objectId'].rsplit(';')[0]
        )
    def test_relateer_aan_zaak(self):
        zaak = ZaakFactory.create(status_set__indicatie_laatst_gezette_status=JaNee.ja)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        zaak_folder = self.client.creeer_zaakfolder(zaak)
        self.client.maak_zaakdocument(document)
        document.refresh_from_db()

        result = self.client.relateer_aan_zaak(document, zaak)

        self.assertIsNone(result)
        cmis_doc = self.client._get_cmis_doc(document)
        parents = [parent.id for parent in cmis_doc.getObjectParents()]
        self.assertEqual(parents, [zaak_folder.id])
    def test_relateer_aan_zaak(self):
        zaak = ZaakFactory.create(status_set__indicatie_laatst_gezette_status=JaNee.ja)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        zaak_folder = self.client.creeer_zaakfolder(zaak)
        self.client.maak_zaakdocument(document)
        document.refresh_from_db()

        result = self.client.relateer_aan_zaak(document, zaak)

        self.assertIsNone(result)
        cmis_doc = self.client._get_cmis_doc(document)
        parents = [parent.id for parent in cmis_doc.getObjectParents()]
        self.assertEqual(parents, [zaak_folder.id])
    def test_check_lock_status_unlocked(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)

        result = self.client.is_locked(document)

        self.assertFalse(result)
    def test_cancel_checkout_invalid_checkout_id(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)
        checkout_id, checkout_by = self.client.checkout(document)

        with self.assertRaises(DocumentConflictException):
            self.client.cancel_checkout(document, '')
    def test_cancel_checkout_invalid_checkout_id(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)
        checkout_id, checkout_by = self.client.checkout(document)

        with self.assertRaises(DocumentConflictException):
            self.client.cancel_checkout(document, '')
    def test_check_lock_status_unlocked(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)

        result = self.client.is_locked(document)

        self.assertFalse(result)
    def test_update_checked_out_zaakdocument_with_incorrect_checkout_id(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        cmis_doc.checkout()
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='andere bestandsnaam.txt')

        with self.assertRaises(DocumentConflictException):
            self.client.update_zaakdocument(document, checkout_id='definitely not right', inhoud=inhoud)
    def test_update_checked_out_zaakdocument_with_incorrect_checkout_id(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        cmis_doc = self.client.maak_zaakdocument(document, zaak)
        cmis_doc.checkout()
        inhoud = _create_binaire_inhoud(b'leaky abstraction...', filename='andere bestandsnaam.txt')

        with self.assertRaises(DocumentConflictException):
            self.client.update_zaakdocument(document, checkout_id='definitely not right', inhoud=inhoud)
    def test_ontkoppel_zaakdocument(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        cmis_folder = self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)

        result = self.client.ontkoppel_zaakdocument(document, zaak)

        self.assertIsNone(result)
        # check that the zaakfolder is empty
        self.assertFalse(cmis_folder.getChildren())
    def test_ontkoppel_zaakdocument(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        cmis_folder = self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)

        result = self.client.ontkoppel_zaakdocument(document, zaak)

        self.assertIsNone(result)
        # check that the zaakfolder is empty
        self.assertFalse(cmis_folder.getChildren())
    def test_verwijder_document(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        zaak_folder = self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)

        result = self.client.verwijder_document(document)

        self.assertIsNone(result)
        # check that it's gone
        trash_folder, _ = self.client._get_or_create_folder(self.client.TRASH_FOLDER)
        self.assertEqual(len(trash_folder.getChildren()), 0)
        self.assertEqual(len(zaak_folder.getChildren()), 0)
    def test_verwijder_document(self):
        zaak = ZaakFactory.create(
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            zaakidentificatie='123456789',
            einddatum=None,
            zaaktype__zaaktypeidentificatie='998877',
            zaaktype__zaaktypeomschrijving='SOAP is leuk',
        )
        zaak_folder = self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(
            titel='testnaam', informatieobjectidentificatie='31415926535',
            beschrijving='Een beschrijving', zaak=zaak
        )
        self.client.maak_zaakdocument(document, zaak)

        result = self.client.verwijder_document(document)

        self.assertIsNone(result)
        # check that it's gone
        trash_folder, _ = self.client._get_or_create_folder(self.client.TRASH_FOLDER)
        self.assertEqual(len(trash_folder.getChildren()), 0)
        self.assertEqual(len(zaak_folder.getChildren()), 0)
    def test_lees_document(self):
        """
        Ref #83: geefZaakdocumentLezen vraagt een kopie van het bestand op.

        Van het bestand uit het DMS wordt opgevraagd: inhoud, bestandsnaam.
        """
        zaak = ZaakFactory.create(status_set__indicatie_laatst_gezette_status=JaNee.ja)
        self.client.creeer_zaakfolder(zaak)
        document = EnkelvoudigInformatieObjectFactory.create(informatieobjectidentificatie='123456', zaak=zaak)
        cmis_doc = self.client.maak_zaakdocument(document, zaak)

        # empty by default
        filename, file_obj = self.client.geef_inhoud(document)

        self.assertEqual(filename, document.titel)
        self.assertEqual(file_obj.read(), b'')

        cmis_doc.setContentStream(BytesIO(b'some content'), 'text/plain')

        filename, file_obj = self.client.geef_inhoud(document)

        self.assertEqual(filename, document.titel)
        self.assertEqual(file_obj.read(), b'some content')
    def setUp(self):
        super().setUp()

        vandaag = self.genereerdatum()
        self.context = {
            'gemeentecode': '1234',
            'datumVandaag': vandaag,
            'datumGisteren': self.genereerdatum(-1),
            'datumEergisteren': self.genereerdatum(-2),
            'tijdstipRegistratie': self.genereerdatumtijd(),
            'zds_zaaktype_code': '12345678',
            'zds_zaaktype_omschrijving':
            'Aanvraag burgerservicenummer behandelen',
            'referentienummer': self.genereerID(10),
            'creerzaak_identificatie_9': self.genereerID(10),
            'voegzaakdocumenttoe_identificatie_5': self.genereerID(10),
            'voegzaakdocumenttoe_identificatie_7': self.genereerID(10),
            'maakzaakdocument_identificatie_5': self.genereerID(10),
        }

        self._dms_client.geef_inhoud.return_value = 'dummy.txt', BytesIO()

        self.zaak = ZaakFactory.create(
            zaakidentificatie=self.context['gemeentecode'] +
            self.context['creerzaak_identificatie_9'],
            status_set__indicatie_laatst_gezette_status=JaNee.ja,
            omschrijving='omschrijving')
        self.edc_type2 = InformatieObjectTypeFactory.create(
            informatieobjecttypeomschrijving='omschrijving1')
        self.zaakdocument = EnkelvoudigInformatieObjectFactory.create(
            informatieobjecttype__informatieobjecttypeomschrijving=
            'omschrijving',
            informatieobjectidentificatie=self.
            context['voegzaakdocumenttoe_identificatie_5'],
            formaat='formaat',
            creatiedatum=vandaag,
            titel='titel',
            taal='taal',
            vertrouwlijkaanduiding='VERTROUWELIJK',
            auteur='auteur',
            link=None)
        ZaakInformatieObjectFactory.create(zaak=self.zaak,
                                           informatieobject=self.zaakdocument)

        self.zaakdocument2 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjectidentificatie=self.
            context['voegzaakdocumenttoe_identificatie_7'],
            vertrouwlijkaanduiding='VERTROUWELIJK',
            auteur='auteur',
        )
        ZaakInformatieObjectFactory.create(zaak=self.zaak,
                                           informatieobject=self.zaakdocument2)

        self.zaakdocument3 = EnkelvoudigInformatieObjectFactory.create(
            informatieobjectidentificatie=self.
            context['maakzaakdocument_identificatie_5'],
            vertrouwlijkaanduiding='VERTROUWELIJK',
            auteur='auteur',
        )
        ZaakInformatieObjectFactory.create(zaak=self.zaak,
                                           informatieobject=self.zaakdocument3)