Completed
Push — master ( a9b8b6...971575 )
by Matěj
12s
created

nextcloud.requester   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 131
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 24
eloc 88
dl 0
loc 131
rs 10
c 0
b 0
f 0

17 Methods

Rating   Name   Duplication   Size   Complexity  
A Requester.get() 0 4 1
A WebDAVRequester.report() 0 4 1
A Requester.post() 0 4 1
A WebDAVRequester.download() 0 4 1
A WebDAVRequester.propfind() 0 4 1
A OCSRequester.rtn() 0 2 1
A Requester.put() 0 4 1
A WebDAVRequester.move() 0 9 2
A Requester.get_full_url() 0 22 5
A Requester.__init__() 0 13 1
A WebDAVRequester.proppatch() 0 4 1
A WebDAVRequester.copy() 0 9 2
A WebDAVRequester.rtn() 0 2 1
A Requester.delete() 0 4 1
A Requester.rtn() 0 5 2
A WebDAVRequester.make_collection() 0 4 1
A WebDAVRequester.__init__() 0 2 1
1
import requests
2
3
from .response import WebDAVResponse, OCSResponse
4
5
6
class Requester(object):
7
    def __init__(self, endpoint, user, passwd, json_output=False):
8
        self.query_components = []
9
10
        self.json_output = json_output
11
12
        self.base_url = endpoint
13
14
        self.h_get = {"OCS-APIRequest": "true"}
15
        self.h_post = {"OCS-APIRequest": "true",
16
                       "Content-Type": "application/x-www-form-urlencoded"}
17
        self.auth_pk = (user, passwd)
18
        self.API_URL = None
19
        self.SUCCESS_CODE = None
20
21
    def rtn(self, resp):
22
        if self.json_output:
23
            return resp.json()
24
        else:
25
            return resp.content.decode("UTF-8")
26
27
    def get(self, url="", params=None):
28
        url = self.get_full_url(url)
29
        res = requests.get(url, auth=self.auth_pk, headers=self.h_get, params=params)
30
        return self.rtn(res)
31
32
    def post(self, url="", data=None):
33
        url = self.get_full_url(url)
34
        res = requests.post(url, auth=self.auth_pk, data=data, headers=self.h_post)
35
        return self.rtn(res)
36
37
    def put(self, url="", data=None):
38
        url = self.get_full_url(url)
39
        res = requests.put(url, auth=self.auth_pk, data=data, headers=self.h_post)
40
        return self.rtn(res)
41
42
    def delete(self, url="", data=None):
43
        url = self.get_full_url(url)
44
        res = requests.delete(url, auth=self.auth_pk, data=data, headers=self.h_post)
45
        return self.rtn(res)
46
47
    def get_full_url(self, additional_url=""):
48
        """
49
        Build full url for request to NextCloud api
50
51
        Construct url from self.base_url, self.API_URL, additional_url (if given), add format=json param if self.json
52
53
        :param additional_url: str
54
            add to url after api_url
55
        :return: str
56
        """
57
        if additional_url and not str(additional_url).startswith("/"):
58
            additional_url = "/{}".format(additional_url)
59
60
        if self.json_output:
61
            self.query_components.append("format=json")
62
63
        ret = "{base_url}{api_url}{additional_url}".format(
64
            base_url=self.base_url, api_url=self.API_URL, additional_url=additional_url)
65
66
        if self.json_output:
67
            ret += "?format=json"
68
        return ret
69
70
71
class OCSRequester(Requester):
72
    """ Requester for OCS API """
73
74
    def rtn(self, resp):
75
        return OCSResponse(response=resp, json_output=self.json_output, success_code=self.SUCCESS_CODE)
76
77
78
class WebDAVRequester(Requester):
79
    """ Requester for WebDAV API """
80
81
    def __init__(self, *args, **kwargs):
82
        super(WebDAVRequester, self).__init__(*args, **kwargs)
83
84
    def rtn(self, resp, data=None):
85
        return WebDAVResponse(response=resp, data=data)
86
87
    def propfind(self, additional_url="", headers=None, data=None):
88
        url = self.get_full_url(additional_url=additional_url)
89
        res = requests.request('PROPFIND', url, auth=self.auth_pk, headers=headers, data=data)
90
        return self.rtn(res)
91
92
    def proppatch(self, additional_url="", data=None):
93
        url = self.get_full_url(additional_url=additional_url)
94
        res = requests.request('PROPPATCH', url, auth=self.auth_pk, data=data)
95
        return self.rtn(resp=res)
96
97
    def report(self, additional_url="", data=None):
98
        url = self.get_full_url(additional_url=additional_url)
99
        res = requests.request('REPORT', url, auth=self.auth_pk, data=data)
100
        return self.rtn(resp=res)
101
102
    def download(self, url="", params=None):
103
        url = self.get_full_url(url)
104
        res = requests.get(url, auth=self.auth_pk, headers=self.h_get, params=params)
105
        return self.rtn(resp=res, data=res.content)
106
107
    def make_collection(self, additional_url=""):
108
        url = self.get_full_url(additional_url=additional_url)
109
        res = requests.request("MKCOL", url=url, auth=self.auth_pk)
110
        return self.rtn(resp=res)
111
112
    def move(self, url, destination, overwrite=False):
113
        url = self.get_full_url(additional_url=url)
114
        destionation_url = self.get_full_url(additional_url=destination)
115
        headers = {
116
            "Destination": destionation_url,
117
            "Overwrite": "T" if overwrite else "F"
118
        }
119
        res = requests.request("MOVE", url=url, auth=self.auth_pk, headers=headers)
120
        return self.rtn(resp=res)
121
122
    def copy(self, url, destination, overwrite=False):
123
        url = self.get_full_url(additional_url=url)
124
        destionation_url = self.get_full_url(additional_url=destination)
125
        headers = {
126
            "Destination": destionation_url,
127
            "Overwrite": "T" if overwrite else "F"
128
        }
129
        res = requests.request("COPY", url=url, auth=self.auth_pk, headers=headers)
130
        return self.rtn(resp=res)
131