Menu

pycaravel: This module is designed to simplify continuous integration (CI) of data from multiple projects.

Source code for caravel.nextcloud.requester

import logging
from functools import wraps

import requests

from .response import OCSResponse, WebDAVResponse

logger = logging.getLogger("rlink")


[docs] class NextCloudConnectionError(Exception): """ A connection error occurred. """
[docs] def catch_connection_error(func): @wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except requests.RequestException as e: raise NextCloudConnectionError( "Failed to establish connection to NextCloud", getattr(e.request, 'url', None), e) return wrapper
[docs] class Requester: def __init__(self, endpoint, user, passwd, json_output=False, verify=True): self.query_components = [] self.json_output = json_output self.verify = verify self.base_url = endpoint self.h_get = {"OCS-APIRequest": "true"} self.h_post = {"OCS-APIRequest": "true", "Content-Type": "application/x-www-form-urlencoded"} self.auth_pk = (user, passwd) self.API_URL = None self.SUCCESS_CODE = None def rtn(self, resp): if self.json_output: return resp.json() else: return resp.content.decode("UTF-8") @catch_connection_error def get(self, url="", params=None): url = self.get_full_url(url) logger.debug(url) logger.debug(params) res = requests.get( url, auth=self.auth_pk, headers=self.h_get, params=params, verify=self.verify) return self.rtn(res) @catch_connection_error def post(self, url="", data=None): url = self.get_full_url(url) logger.debug(url) logger.debug(data) res = requests.post( url, auth=self.auth_pk, data=data, headers=self.h_post, verify=self.verify) return self.rtn(res) @catch_connection_error def put(self, url="", data=None): url = self.get_full_url(url) logger.debug(url) res = requests.put( url, auth=self.auth_pk, data=data, headers=self.h_post, verify=self.verify) return self.rtn(res) @catch_connection_error def delete(self, url="", data=None): url = self.get_full_url(url) logger.debug(url) logger.debug(data) res = requests.delete( url, auth=self.auth_pk, data=data, headers=self.h_post, verify=self.verify) return self.rtn(res)
[docs] def get_full_url(self, additional_url=""): """ Build full url for request to NextCloud api Construct url from self.base_url, self.API_URL, additional_url (if given), add format=json param if self.json :param additional_url: str add to url after api_url :return: str """ if additional_url and not str(additional_url).startswith("/"): additional_url = f"/{additional_url}" if self.json_output: self.query_components.append("format=json") ret = f"{self.base_url}{self.API_URL}{additional_url}" if self.json_output: ret += "?format=json" return ret
[docs] class OCSRequester(Requester): """ Requester for OCS API. """ def rtn(self, resp): return OCSResponse(response=resp, json_output=self.json_output, success_code=self.SUCCESS_CODE)
[docs] class WebDAVRequester(Requester): """ Requester for WebDAV API. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def rtn(self, resp, data=None): return WebDAVResponse(response=resp, data=data) @catch_connection_error def propfind(self, additional_url="", headers=None, data=None): url = self.get_full_url(additional_url=additional_url) res = requests.request( 'PROPFIND', url, auth=self.auth_pk, headers=headers, data=data, verify=self.verify) return self.rtn(res) @catch_connection_error def proppatch(self, additional_url="", data=None): url = self.get_full_url(additional_url=additional_url) res = requests.request('PROPPATCH', url, auth=self.auth_pk, data=data) return self.rtn(resp=res) @catch_connection_error def report(self, additional_url="", data=None): url = self.get_full_url(additional_url=additional_url) res = requests.request( 'REPORT', url, auth=self.auth_pk, data=data, verify=self.verify) return self.rtn(resp=res) @catch_connection_error def download(self, url="", params=None): url = self.get_full_url(url) logger.debug(url) logger.debug(params) res = requests.get( url, auth=self.auth_pk, headers=self.h_get, params=params, verify=self.verify) return self.rtn(resp=res, data=res.content) @catch_connection_error def make_collection(self, additional_url=""): url = self.get_full_url(additional_url=additional_url) res = requests.request( "MKCOL", url=url, auth=self.auth_pk, verify=self.verify) return self.rtn(resp=res) @catch_connection_error def move(self, url, destination, overwrite=False): url = self.get_full_url(additional_url=url) destination_url = self.get_full_url(additional_url=destination) logger.debug(f"{url} -> {destination_url}") headers = { "Destination": destination_url.encode('utf-8'), "Overwrite": "T" if overwrite else "F" } res = requests.request( "MOVE", url=url, auth=self.auth_pk, headers=headers, verify=self.verify) return self.rtn(resp=res) @catch_connection_error def copy(self, url, destination, overwrite=False): url = self.get_full_url(additional_url=url) destination_url = self.get_full_url(additional_url=destination) logger.debug(f"{url} -> {destination_url}") headers = { "Destination": destination_url, "Overwrite": "T" if overwrite else "F" } res = requests.request( "COPY", url=url, auth=self.auth_pk, headers=headers, verify=self.verify) return self.rtn(resp=res)

Follow us

© 2025, Antoine Grigis