Added a mod_python-style form-data application decorator.
[wrw.git] / wrw / util.py
CommitLineData
bbdebbab
FT
1import inspect
2import req, dispatch, session, form
b409a338
FT
3
4def wsgiwrap(callable):
5 def wrapper(env, startreq):
0a59819d 6 return dispatch.handle(req.origrequest(env), startreq, callable)
b409a338 7 return wrapper
d9979128 8
bbdebbab
FT
9def formparams(callable):
10 def wrapper(req):
11 data = form.formdata(req)
12 spec = inspect.getargspec(callable)
13 args = dict(data.items())
14 args["req"] = req
15 if not spec.keywords:
16 for arg in list(args):
17 if arg not in spec.args:
18 del args[arg]
19 return callable(**args)
20 return wrapper
21
d9979128
FT
22def persession(data = None):
23 def dec(callable):
24 def wrapper(req):
25 sess = session.get(req)
26 if callable not in sess:
27 if data is None:
28 sess[callable] = callable()
29 else:
30 if data not in sess:
31 sess[data] = data()
32 sess[callable] = callable(data)
33 return sess[callable].handle(req)
34 return wrapper
35 return dec
d1f70c6c
FT
36
37class sessiondata(object):
38 @classmethod
39 def get(cls, req):
40 sess = cls.sessdb().get(req)
41 with sess.lock:
42 try:
43 return sess[cls]
44 except KeyError:
45 ret = cls(req)
d1f70c6c
FT
46 sess[cls] = ret
47 return ret
48
49 @classmethod
50 def sessdb(cls):
51 return session.default
52
f13b8f5a
FT
53class autodirty(sessiondata):
54 @classmethod
55 def get(cls, req):
56 ret = super(autodirty, cls).get(req)
57 if "_is_dirty" not in ret.__dict__:
58 ret.__dict__["_is_dirty"] = False
617b21df 59 return ret
f13b8f5a 60
d1f70c6c 61 def sessfrozen(self):
f13b8f5a 62 self.__dict__["_is_dirty"] = False
d1f70c6c
FT
63
64 def sessdirty(self):
f13b8f5a 65 return self._is_dirty
d1f70c6c
FT
66
67 def __setattr__(self, name, value):
f13b8f5a
FT
68 super(autodirty, self).__setattr__(name, value)
69 if "_is_dirty" in self.__dict__:
70 self.__dict__["_is_dirty"] = True
d1f70c6c
FT
71
72 def __delattr__(self, name):
f13b8f5a
FT
73 super(autodirty, self).__delattr__(name, value)
74 if "_is_dirty" in self.__dict__:
75 self.__dict__["_is_dirty"] = True
3b9bc700
FT
76
77class manudirty(object):
78 def __init__(self, *args, **kwargs):
79 super(manudirty, self).__init__(*args, **kwargs)
80 self.__dirty = False
81
82 def sessfrozen(self):
83 self.__dirty = False
84
85 def sessdirty(self):
86 return self.__dirty
87
88 def dirty(self):
89 self.__dirty = True