def test_mapper_get_gebruiksrechten(self): self.assertEqual( reverse_mapper("drc:gebruiksrechten__informatieobject"), None) self.assertEqual( reverse_mapper("drc:gebruiksrechten__informatieobject", "gebruiksrechten"), "informatieobject", )
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)
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)
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]
def test_mapper_get_unknown(self): self.assertIsNone( reverse_mapper("drc:document__identificatie", "unknown"))
def test_mapper_get_oio(self): self.assertEqual(reverse_mapper("drc:oio__informatieobject"), None) self.assertEqual(reverse_mapper("drc:oio__informatieobject", "oio"), "informatieobject")
def test_mapper_get_document(self): self.assertEqual(reverse_mapper("drc:document__identificatie"), "identificatie") self.assertEqual( reverse_mapper("drc:document__identificatie", "document"), "identificatie")