Passed
Pull Request — master (#69)
by
unknown
01:04
created

nextcloud.response.NextCloudResponse.__init__()   A

Complexity

Conditions 3

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 3
nop 4
1
# -*- coding: utf-8 -*-
2
"""
3
Define requests responses (automatically check if the request is OK)
4
"""
5
try:
6
    from json import JSONDecodeError
7
except ImportError:
8
    JSONDecodeError = ValueError
9
10
11
class BaseResponse(object):
12
    """
13
    Base Response that take HTTP reponse and take the following attrs
14
    - raw         : the raw response
15
    - status_code : the HTTP code
16
    - data        : the asked data (json or xml value)
17
    - is_ok       : True if the request is succesfully achieved
18
    """
19
20
    def __init__(self, response, data=None, json_output=True,
21
                 status_code=None, success_code=None, **kwargs):
22
        self.raw = response
23
        print(self.raw.content)
24
        self.data = data or (
25
            response.json() if json_output else response.content.decode('UTF-8')
26
        )
27
        self.status_code = status_code or response.status_code
28
        for k in kwargs:
29
            setattr(self, k, kwargs[k])
30
        self._compute_is_ok(success_code)
31
32
    def _compute_is_ok(self, success_code):
33
        if isinstance(success_code, dict):
34
            method = self.raw.request.method
35
            success_codes = success_code.get(method, [])
36
        else:
37
            success_codes = (
38
                success_code if isinstance(success_code, list) else
39
                [success_code]
40
            )
41
42
        self.is_ok = self.status_code in success_codes
43
44
    def __repr__(self):
45
        is_ok_str = 'OK' if self.is_ok else 'Failed'
46
        return '<{}: Status: {}>'.format(self.__class__.__name__, is_ok_str)
47
48
49
class OCSResponse(BaseResponse):
50
    """
51
    Response class for OCS api methods
52
    Add some attributes:
53
    - meta      : ocs json metadata
54
    - full_data : json data of the ocs response
55
    """
56
57
    def __init__(self, response, json_output=True, success_code=None):
58
        data = None
59
        full_data = None
60
        meta = None
61
        status_code = None
62
63
        if (success_code or json_output):
64
            try:
65
                full_data = response.json()
66
                meta = full_data['ocs']['meta']
67
                status_code = meta['statuscode']
68
                if json_output:
69
                    data = full_data['ocs']['data']
70
            except JSONDecodeError:
71
                data = {'message': 'Unable to parse JSON response'}
72
                status_code = -1
73
74
        super(OCSResponse, self).__init__(response, data=data,
75
                                          json_output=json_output,
76
                                          full_data=full_data,
77
                                          status_code=status_code,
78
                                          meta=meta,
79
                                          success_code=success_code)
80
81
82
class WebDAVResponse(BaseResponse):
83
    """ Response class for WebDAV api methods """
84
85
    def __init__(self, response, data=None, success_code=None, json_output=False):
86
        super(WebDAVResponse, self).__init__(response, data=data,
87
                                             json_output=json_output,
88
                                             success_code=success_code)
89