def testCmisClientBadUrl(self):
     """Try to instantiate a CmisClient object with a known bad URL"""
     cmisClient = CmisClient(self.url + 'foobar',
                             self.user,
                             self.pwd,
                             binding=self.binding,
                             **self.ext_args)
     with pytest.raises(CmisException):
         cmisClient.getRepositories()
Beispiel #2
0
class DmsAdapter(CRUDAdapter):
    def auth(self):
        backend_record = self.backend_record
        self.client = CmisClient(backend_record.location,
                                 backend_record.username,
                                 backend_record.password)

    def get_repositories(self):
        return {
            r['repositoryId']: r['repositoryName']
            for r in self.client.getRepositories()
        }

    def get_repository(self, repository_id):
        return self.client.getRepository(repository_id)

    def read_document_from_path(self, repository_id, path):
        repo = self.client.getRepository(repository_id)
        if isinstance(path, unicode):
            path = path.encode('utf-8')
        doc = repo.getObjectByPath(path)
        output = StringIO()
        output.write(doc.getContentStream().read())
        data = output.getvalue()
        version = doc.getProperties()['cmis:versionLabel']
        return data, version
 def _repository(self):
     client = CmisClient(
         self._repository_url,
         self.repository_user,
         self.repository_password)
     repositories = client.getRepositories()
     assert len(repositories) == 1
     identifier = repositories[0]['repositoryId']
     return client.getRepository(identifier)
 def testGetRepositories(self):
     """Call getRepositories and make sure at least one comes back with
     an ID and a name
     """
     cmisClient = CmisClient(self.url,
                             self.user,
                             self.pwd,
                             binding=self.binding,
                             **self.ext_args)
     repoInfo = cmisClient.getRepositories()
     assert len(repoInfo) >= 1
     assert 'repositoryId' in repoInfo[0]
     assert 'repositoryName' in repoInfo[0]
    def start(self):
        if self._repository is not None:
            return self._root

        options = {}
        if self._settings.proxy:
            options['proxy'] = {
                'http': self._settings.proxy,
                'https': self._settings.proxy}

        client = CmisClient(
            self._settings.repository_url,
            self._settings.repository_user,
            self._settings.repository_password,
            **options)

        repositories = client.getRepositories()
        if self._settings.repository_name:
            for repository in repositories:
                if self._settings.repository_name == repository['repositoryName']:
                    break
            else:
                raise RESTConnectorError(
                    u'Unknown repository: %s' % (
                        self._settings.repository_name))
        elif len(repositories) == 1:
            repository = repositories[0]
        else:
            raise RESTConnectorError(
                u'Multiple repository available. Please select one.')
        self._repository_id = repository['repositoryId']
        self._repository = client.getRepository(self._repository_id)

        # Find root
        if self._settings.repository_path:
            self._root = self.get_object_by_path(
                self._settings.repository_path,
                root=True)
        else:
            self._root = cmis_object_to_dict(
                self._repository.getRootFolder(),
                root=True)
        return self._root
def load_cmis(cmis_foldername, cmis_objtype, cmis_choices):
    es_host = ES_HOSTS[0]
    headers = {'Content-Type': 'application/json'}
    if 'http_auth' in es_host:
        headers['http_auth'] = es_host['http_auth']
    host = es_host['host']
    doc_type = "cmis"
    url = "http://" + host + ":9200/" + "cmis"

    cmis_dirname = os.path.join(BASE_DIR, 'data', 'cmis')

    client = CmisClient('http://cmis.alfresco.com/cmisatom', 'admin', 'admin')
    repositories = client.getRepositories()
    repo = client.defaultRepository
    info = repo.info
    #for k,v in info.items():
    #    print("key {0}, value: {1}".format(k, v))
    caps = repo.capabilities
    if 'recreate' in cmis_choices:
        map_cmis(url, headers, client, repo, cmis_objtype, cmis_choices)
    objtype = repo.getTypeDefinition(cmis_objtype)
    root = repo.getRootFolder()
    count = 1
    objects = root.getDescendants(depth=3)
    len(objects.getResults())
    for object in objects:
        doc = {}
        #repo_obj = repo.getObject(object.id)
        #for key,val in repo_obj.properties.items():
        #    print(key, val)
        doc_props = object.properties
        #print(object.name)
        #for prop_name, prop_value in doc_props.items():
        #    print(prop_name ,prop_value)
        doc_objtype = doc_props['cmis:objectTypeId']
        doc_objtype_str = str(doc_objtype)
        if doc_objtype_str == cmis_objtype:
            paths = object.getPaths()
            doc['paths'] = paths
            parents = object.getObjectParents()
            for prop_name, prop in objtype.properties.items():
                #field = prop.displayName
                field = prop.id
                field_type = prop.getPropertyType()
                prop_value = doc_props[prop_name]
                sub_doc = doc  # in case of nesting
                sub_fields = field.split('.')
                last_sub_field = sub_fields[len(sub_fields) - 1]
                if len(sub_fields) > 1:
                    for sub_field in sub_fields[:-1]:
                        if sub_field not in sub_doc:
                            if sub_field in nested_fields:
                                sub_doc[sub_field] = [{}]
                            else:
                                sub_doc[sub_field] = {}
                        else:
                            if sub_field in nested_fields:
                                sub_doc[sub_field].append({})
                        sub_field_value = sub_doc[sub_field]
                        if type(sub_field_value) is dict:
                            sub_doc = sub_doc[sub_field]
                        if type(sub_field_value) is list:
                            sub_doc = sub_doc[sub_field][
                                len(sub_doc[sub_field]) - 1]
                    if last_sub_field not in properties and last_sub_field in nested_fields:
                        pass
                    field = last_sub_field
                if field_type == 'list':
                    if field not in doc:
                        sub_doc[field] = []
                    if prop_value != "":
                        if len(format) > 0:
                            delimiter = format
                            prop_value = str(prop_value)
                            if delimiter == '\\n':
                                items = prop_value.splitlines()
                            else:
                                items = prop_value.split(delimiter)
                            for item in items:
                                item = prop_value(item, decoder)
                                sub_doc[field].append(item)
                        else:
                            sub_doc[field].append(cell)
                elif field_type == 'nested':
                    if field not in sub_doc:
                        sub_doc[field] = []
                    if prop_value != '':
                        if answer == '':
                            nested_value = prop_value.split(',')
                            sub_doc[field].append({
                                'val': nested_value[0],
                                'prc': float(nested_value[1])
                            })
                        else:
                            sub_doc[field].append({
                                'val': answer,
                                'prc': float(cell)
                            })
                elif field_type == 'datetime':
                    sub_doc[field] = prop_value.strftime('%Y-%m-%d')
                elif field_type == 'text' or field_type == 'string':
                    prop_value = str(prop_value)
                    if field not in doc:
                        sub_doc[field] = prop_value
                    else:
                        sub_doc[field] = sub_doc[field] + format + prop_value
                else:
                    sub_doc[field] = prop_value
            # write metadata to ES
            id = object.properties['cmis:objectId']
            id = slugify(str(id))
            data = json.dumps(doc)
            print("load_cmis: write cmis line with id", id)
            r = requests.put(url + "/" + doc_type + "/" + id,
                             headers=headers,
                             data=data)
            print("load_cmis: writen cmis line with id", id)
            # download document
            doc_basename = doc_props.get('cmis:name', None)
            doc_mime_type = doc_props.get('cmis:contentStreamMimeType', None)
            doc_length = doc_props.get('cmis:contentStreamLength', 0)
            cmis_fullname = os.path.join(cmis_dirname, doc_basename)
            cmis_file_handler = object.getContentStream()
            buffer = cmis_file_handler.read()
            try:
                with open(cmis_fullname, 'w') as output_file:
                    output_file.write(buffer)
            except IOError as e:
                pass
            cmis_file_handler.close()
            count = count + 1