Merge branch 'master' into python3
[wrw.git] / wrw / util.py
CommitLineData
d854802a 1from . import req, dispatch, session
b409a338
FT
2
3def wsgiwrap(callable):
4 def wrapper(env, startreq):
0a59819d 5 return dispatch.handle(req.origrequest(env), startreq, callable)
b409a338 6 return wrapper
d9979128
FT
7
8def persession(data = None):
9 def dec(callable):
10 def wrapper(req):
11 sess = session.get(req)
12 if callable not in sess:
13 if data is None:
14 sess[callable] = callable()
15 else:
16 if data not in sess:
17 sess[data] = data()
18 sess[callable] = callable(data)
19 return sess[callable].handle(req)
20 return wrapper
21 return dec
d1f70c6c
FT
22
23class sessiondata(object):
24 @classmethod
25 def get(cls, req):
26 sess = cls.sessdb().get(req)
27 with sess.lock:
28 try:
29 return sess[cls]
30 except KeyError:
31 ret = cls(req)
d1f70c6c
FT
32 sess[cls] = ret
33 return ret
34
35 @classmethod
36 def sessdb(cls):
37 return session.default
38
f13b8f5a
FT
39class autodirty(sessiondata):
40 @classmethod
41 def get(cls, req):
d13a1a57 42 ret = super().get(req)
f13b8f5a
FT
43 if "_is_dirty" not in ret.__dict__:
44 ret.__dict__["_is_dirty"] = False
45
d1f70c6c 46 def sessfrozen(self):
f13b8f5a 47 self.__dict__["_is_dirty"] = False
d1f70c6c
FT
48
49 def sessdirty(self):
f13b8f5a 50 return self._is_dirty
d1f70c6c
FT
51
52 def __setattr__(self, name, value):
a4ad119b 53 super().__setattr__(name, value)
f13b8f5a
FT
54 if "_is_dirty" in self.__dict__:
55 self.__dict__["_is_dirty"] = True
d1f70c6c
FT
56
57 def __delattr__(self, name):
d13a1a57 58 super().__delattr__(name, value)
f13b8f5a
FT
59 if "_is_dirty" in self.__dict__:
60 self.__dict__["_is_dirty"] = True
3b9bc700
FT
61
62class manudirty(object):
63 def __init__(self, *args, **kwargs):
d13a1a57 64 super().__init__(*args, **kwargs)
3b9bc700
FT
65 self.__dirty = False
66
67 def sessfrozen(self):
68 self.__dirty = False
69
70 def sessdirty(self):
71 return self.__dirty
72
73 def dirty(self):
74 self.__dirty = True