Pyocclient: Apuntes

Abro éste post para ampliar un poco como se usa pyoocclient, una librería de python para gestionar un nextcloud. En éste post voy a mostrar como he solucionado el tema de crear directorios, subir ficheros, compartir ficheros, descargar un fichero (binario) y eliminar ficheros, pero la librería permite incluso hacer gestión de usuarios y algunas cosas mas, realmente da para seguir jugando :) En página podéis ver el código de la librería.

Primero de todo su instalación se hace mediante pip y requiere de las librerías request y django-storage-webdav

(venv) laura@melatonina:~/dev/colibri$ pip install request
(venv) laura@melatonina:~/dev/colibri$ pip install django-storage-webdav
(venv) laura@melatonina:~/dev/colibri$ pip install pyocclient

Luego he creado las funciones siguientes:

def webdav_login():
    # get configuration from database
    _dav_host = str(Config.objects.get(config_type='colibri', name='dav.host'))
    _dav_username = str(Config.objects.get(config_type='colibri', name='dav.username'))
    _dav_password = str(Config.objects.get(config_type='colibri', name='dav.password'))

    oc = owncloud.Client(_dav_host)
    oc.login(_dav_username, _dav_password)

    return oc


def webdav_upload_file(file, path, share):
    # save file to temporary directory and write file to disk
    _working_directory = str(Config.objects.get(name='core.working_directory'))
    _file = _working_directory + '/web/tmp/' + str(file.name)
    with open(_file, 'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)

    _dav_path = str(Config.objects.get(config_type='colibri', name='dav.path'))
    _remote_path = _dav_path + '/' + str(path) + '/' + str(file.name)

    # generate random password
    from django.utils.crypto import get_random_string
    _password = get_random_string(16, allowed_chars='abcdefghijklmnopqrstuvwxyz0123456789')

    oc = webdav_login()
    webdav_create_directory(path)
    oc.put_file(_remote_path, _file)
    oc.logout()

    if share == 1:
        link_info = oc.share_file_with_link(_dav_path + '/' + str(path) + '/' + str(file.name), password=_password)
        _out = {'url': link_info.get_link(), 'password': _password, 'remote': _remote_path, 'name': file.name}
    else:
        _out = {'remote': _remote_path, 'name': file.name}
    # delete temporary file
    fs = FileSystemStorage()
    fs.delete(_file)
    return _out


def webdav_create_directory(directory):
    oc = webdav_login()

    _dav_path = str(Config.objects.get(config_type='colibri', name='dav.path'))
    _path = _dav_path + '/' + str(directory)

    # check directory exists
    _dir = directory.split('/')

    if len(_dir) >= 2:
        # test root
        try:
            oc.list(_dav_path + '/' + _dir[0])
            _out = "Folder already exists"
        except Exception as e:
            oc.mkdir(_dav_path + '/' + _dir[0])
            _out = "Folder created"

        # test first level
        try:
            oc.list(_dav_path + '/' + _dir[0] + '/' + _dir[1])
            _out = "Folder already exists"
        except Exception as e:
            oc.mkdir(_dav_path + '/' + _dir[0] + '/' + _dir[1])
            _out = "Folder created"
    else:
        try:
            oc.list(_path)
            _out = "Folder already exists"
        except Exception as e:
            oc.mkdir(_path)
            _out = "Folder created"
    oc.logout()
    return _out


def webdav_get_file(path):
    oc = webdav_login()
    file = oc.get_file_contents(str(path))
    file_data = oc.file_info(str(path))
    oc.logout()

    # get filename
    _f = path.split('/')
    _last = len(_f)
    _last -= 1
    _name = _f[_last]

    from django.http import HttpResponse

    response = HttpResponse(file, content_type=str(file_data.attributes['{DAV:}getcontenttype']))
    response['Content-Disposition'] = 'attachment; filename=' + str(_name)
    return response


def webdav_delete_file(path):
    oc = webdav_login()
    _out = oc.delete(str(path))
    oc.logout()
    return _out

Y listos, deseo que éste pedacito de código ayude a despejar vuestras dudas :)

Doy las gracias a rama por ayudarme a entender un poco mas como funciona todo ésto :D

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir el correu brossa. Aprendre com la informació del vostre comentari és processada