Added a utility class for session data storage.
[wrw.git] / wrw / util.py
CommitLineData
241bc38a 1import 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)
32 ret._is_dirty = [False]
33 sess[cls] = ret
34 return ret
35
36 @classmethod
37 def sessdb(cls):
38 return session.default
39
40 def sessfrozen(self):
41 self._is_dirty[:] = [False]
42
43 def sessdirty(self):
44 return self._is_dirty[0]
45
46 def __setattr__(self, name, value):
47 if hasattr(self, "_is_dirty"):
48 self._is_dirty[:] = [True]
49 super(sessiondata, self).__setattr__(name, value)
50
51 def __delattr__(self, name):
52 super(sessiondata, self).__delattr__(name)
53 self._is_dirty[:] = [True]