summaryrefslogtreecommitdiff
path: root/caldav/lib/error.py
blob: 739ab95ef1c60575dafb5121f0a94ec97df2495a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from collections import defaultdict
import logging

try:
    import os
    ## one of DEBUG_PDB, DEBUG, DEVELOPMENT, PRODUCTION
    debugmode = os.environ['PYTHON_CALDAV_DEBUGMODE']
except:
    ## The default debugmode should be PRODUCTION in official releases,
    ## and DEVELOPMENT when doing beta testing.
    ## TODO: find some way to automate this.
    debugmode = 'PRODUCTION'

log = logging.getLogger('caldav')
if debugmode.startswith('DEBUG'):
    log.setLevel(logging.DEBUG)
else:
    log.setLevel(logging.WARNING)

def assert_(condition):
    try:
        assert(condition)
    except AssertionError:
        if debugmode == 'PRODUCTION':
            log.error("Deviation from expectations found.  %s" % ERR_FRAGMENT, exc_info=True)
        elif debugmode == 'DEBUG_PDB':
            log.error("Deviation from expectations found.  Dropping into debugger")
            import pdb; pdb.set_trace()
        else:
            raise

ERR_FRAGMENT="Please raise an issue at https://github.com/python-caldav/caldav/issues or reach out to t-caldav@tobixen.no, include this error and the traceback and tell what server you are using"

class DAVError(Exception):
    url = None
    reason = "no reason"

    def __init__(self, url=None, reason=None):
        if url:
            self.url = url
        if reason:
            self.reason = reason

    def __str__(self):
        return f"{self.__class__.__name__} at '{self.url}', reason '{self.reason}'"

class AuthorizationError(DAVError):
    """
    The client encountered an HTTP 403 error and is passing it on
    to the user. The url property will contain the url in question,
    the reason property will contain the excuse the server sent.
    """
    pass

class PropsetError(DAVError):
    pass

class ProppatchError(DAVError):
    pass


class PropfindError(DAVError):
    pass


class ReportError(DAVError):
    pass


class MkcolError(DAVError):
    pass


class MkcalendarError(DAVError):
    pass


class PutError(DAVError):
    pass


class DeleteError(DAVError):
    pass


class NotFoundError(DAVError):
    pass

class ConsistencyError(DAVError):
    pass

class ResponseError(DAVError):
    pass

exception_by_method = defaultdict(lambda: DAVError)
for method in ('delete', 'put', 'mkcalendar', 'mkcol', 'report', 'propset',
               'propfind', 'proppatch'):
    exception_by_method[method] = \
        locals()[method[0].upper() + method[1:] + 'Error']