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