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']
|