Esempio n. 1
0
 def test_mapper_get_gebruiksrechten(self):
     self.assertEqual(
         reverse_mapper("drc:gebruiksrechten__informatieobject"), None)
     self.assertEqual(
         reverse_mapper("drc:gebruiksrechten__informatieobject",
                        "gebruiksrechten"),
         "informatieobject",
     )
Esempio n. 2
0
    def copy_gebruiksrechten(self, source_object: Gebruiksrechten,
                             destination_folder: Folder) -> Gebruiksrechten:
        """Copy a gebruiksrechten to a folder

        :param source_object: Gebruiksrechten, the gebruiksrechten to copy
        :param destination_folder: Folder, the folder in which to place the copied gebruiksrechten
        :return: the copied object
        """

        # copy the properties from the source document
        drc_properties = {}
        drc_url_properties = {}
        for property_name, property_details in source_object.properties.items(
        ):
            if ("cmis:" not in property_name and property_details["value"]
                    is not None) or property_name == "cmis:objectTypeId":
                drc_property_name = reverse_mapper(property_name,
                                                   type="gebruiksrechten")

                # Urls are handled separately, because they are already in the 'short' form
                if get_type(GebruiksRechtDoc,
                            drc_property_name) == QueriableUrl:
                    drc_url_properties[property_name] = {
                        "value": property_details["value"],
                        "type": "propertyString",
                    }
                else:
                    drc_properties[drc_property_name] = property_details[
                        "value"]

        cmis_properties = Gebruiksrechten.build_properties(drc_properties)

        cmis_properties.update(
            **{
                "cmis:objectTypeId": {
                    "value": source_object.objectTypeId,
                    "type": "propertyId",
                },
                mapper("kopie_van", type="gebruiksrechten"): {
                    "value": source_object.objectId,
                    "type":
                    "propertyString",  # Keep tack of where this is copied from.
                },
                "cmis:name": {
                    "value": get_random_string(),
                    "type": "propertyString"
                },
                "drc:gebruiksrechten__uuid": {
                    "value": str(uuid.uuid4()),
                    "type": "propertyString",
                },
                **drc_url_properties,
            })

        # Create copy gebruiksrechten
        soap_envelope = make_soap_envelope(
            auth=(self.user, self.password),
            repository_id=self.main_repo_id,
            folder_id=destination_folder.objectId,
            properties=cmis_properties,
            cmis_action="createDocument",
        )
        logger.debug(soap_envelope.toprettyxml())

        soap_response = self.request(
            "ObjectService",
            soap_envelope=soap_envelope.toxml(),
        )

        # Creating the document only returns its ID
        xml_response = extract_xml_from_soap(soap_response)

        logger.debug(pretty_xml(xml_response))

        extracted_data = extract_object_properties_from_xml(
            xml_response, "createDocument")[0]
        copy_gebruiksrechten_id = extracted_data["properties"]["objectId"][
            "value"]

        # Request all the properties of the newly created object
        soap_envelope = make_soap_envelope(
            auth=(self.user, self.password),
            repository_id=self.main_repo_id,
            object_id=copy_gebruiksrechten_id,
            cmis_action="getObject",
        )

        logger.debug(soap_envelope.toprettyxml())

        soap_response = self.request("ObjectService",
                                     soap_envelope=soap_envelope.toxml())

        xml_response = extract_xml_from_soap(soap_response)
        logger.debug(pretty_xml(xml_response))

        extracted_data = extract_object_properties_from_xml(
            xml_response, "getObject")[0]

        return Gebruiksrechten(extracted_data)
Esempio n. 3
0
    def copy_document(self, document: Document,
                      destination_folder: Folder) -> Document:
        """Copy document to a folder

        :param document: Document, the document to copy
        :param destination_folder: Folder, the folder in which to place the copied document
        :return: the copied document
        """

        # copy the properties from the source document
        drc_properties = {}
        drc_url_properties = {}
        for property_name, property_details in document.properties.items():
            if ("cmis:" not in property_name and property_details["value"]
                    is not None) or property_name == "cmis:objectTypeId":
                drc_property_name = reverse_mapper(property_name,
                                                   type="document")

                # Urls are handled separately, because they are already in the 'short' form
                if (get_type(EnkelvoudigInformatieObject,
                             drc_property_name) == QueriableUrl):
                    drc_url_properties[property_name] = {
                        "value": property_details["value"],
                        "type": "propertyString",
                    }
                else:
                    drc_properties[drc_property_name] = property_details[
                        "value"]

        cmis_properties = Document.build_properties(drc_properties, new=False)

        cmis_properties.update(
            **{
                "cmis:objectTypeId": {
                    "value": document.objectTypeId,
                    "type": "propertyId",
                },
                mapper("titel", type="document"): {
                    "value": f"{document.titel} - copy",
                    "type": "propertyString",
                },
                "drc:kopie_van": {
                    "value": document.uuid,
                    "type": "propertyString",
                },  # Keep tack of where this is copied from.
                "drc:document__uuid": {
                    "value": str(uuid.uuid4()),
                    "type": "propertyString",
                },
                **drc_url_properties,
            })

        # Update the cmis:name to make it more unique
        file_name = f"{document.titel}-{get_random_string()}"
        cmis_properties["cmis:name"] = {
            "value": file_name,
            "type": "propertyString"
        }

        # Create copy document
        content_id = str(uuid.uuid4())
        soap_envelope = make_soap_envelope(
            auth=(self.user, self.password),
            repository_id=self.main_repo_id,
            folder_id=destination_folder.objectId,
            properties=cmis_properties,
            cmis_action="createDocument",
            content_id=content_id,
            content_filename=drc_properties.get("bestandsnaam"),
        )

        logger.debug(soap_envelope.toprettyxml())

        soap_response = self.request(
            "ObjectService",
            soap_envelope=soap_envelope.toxml(),
            attachments=[(content_id, document.get_content_stream())],
        )

        # Creating the document only returns its ID
        xml_response = extract_xml_from_soap(soap_response)
        logger.debug(pretty_xml(xml_response))

        extracted_data = extract_object_properties_from_xml(
            xml_response, "createDocument")[0]
        copy_document_id = extracted_data["properties"]["objectId"]["value"]

        return document.get_document(copy_document_id)
Esempio n. 4
0
    def query(self,
              return_type_name: str,
              lhs: List[str] = None,
              rhs: List[str] = None) -> List[CMISBaseObject]:
        """Perform an SQL query in the DMS

        :param return_type_name: string, either Folder, Document, Oio or Gebruiksrechten
        :param lhs: list of strings, with the LHS of the SQL query
        :param rhs: list of strings, with the RHS of the SQL query
        :return: type, either Folder, Document, Oio or Gebruiksrechten
        """

        return_type = self.get_return_type(return_type_name)

        processed_rhs = rhs
        # Any query that filters based on URL fields needs to be converted to use the short URL version
        if settings.CMIS_URL_MAPPING_ENABLED and lhs is not None and rhs is not None:
            processed_rhs = []

            # Join all the queries and find which fields are used to filter
            joined_lhs = " ".join(lhs)
            column_names = re.findall(r"([a-z]+?:.+?__[a-z]+)", joined_lhs)

            for index, item_rhs in enumerate(rhs):
                column_name = column_names[index]
                property_name = reverse_mapper(column_name,
                                               type=return_type_name.lower())
                if (property_name is not None and get_type(
                        return_type.type_class, property_name) == QueriableUrl
                        and item_rhs != ""):
                    processed_rhs.append(shrink_url(item_rhs))
                else:
                    processed_rhs.append(item_rhs)

        table = return_type.table
        where = (" WHERE " + " AND ".join(lhs)) if lhs else ""
        query = CMISQuery("SELECT * FROM %s%s" % (table, where))
        statement = query(*processed_rhs) if processed_rhs else query()

        soap_envelope = make_soap_envelope(
            auth=(self.user, self.password),
            repository_id=self.main_repo_id,
            statement=statement,
            cmis_action="query",
        )

        logger.debug(soap_envelope.toprettyxml())

        try:
            soap_response = self.request("DiscoveryService",
                                         soap_envelope=soap_envelope.toxml())
        # Corsa raises an error if the query retrieves 0 results
        except CmisRuntimeException as exc:
            if "objectNotFound" in exc.message:
                return []
            else:
                raise exc

        xml_response = extract_xml_from_soap(soap_response)

        logger.debug(pretty_xml(xml_response))

        extracted_data = extract_object_properties_from_xml(
            xml_response, "query")

        return [return_type(cmis_object) for cmis_object in extracted_data]
Esempio n. 5
0
 def test_mapper_get_unknown(self):
     self.assertIsNone(
         reverse_mapper("drc:document__identificatie", "unknown"))
Esempio n. 6
0
 def test_mapper_get_oio(self):
     self.assertEqual(reverse_mapper("drc:oio__informatieobject"), None)
     self.assertEqual(reverse_mapper("drc:oio__informatieobject", "oio"),
                      "informatieobject")
Esempio n. 7
0
 def test_mapper_get_document(self):
     self.assertEqual(reverse_mapper("drc:document__identificatie"),
                      "identificatie")
     self.assertEqual(
         reverse_mapper("drc:document__identificatie", "document"),
         "identificatie")