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
|
import event
__all__ = ['Notify']
class Notify(object):
"""
This allows you to queue messages to be displayed to the user on
the next page the user reads. This allows you to give messages in
response to POST requests, then redirect to a another page and
display that message (e.g, 'event added').
Usage::
class SitePage(Servlet):
message = Notify()
class MyPage(SitePage):
def setup(self):
if something_done:
self.message.write('All good!')
self.redirect(...)
def respond(self):
write header...
if self.message:
self.write('<div class="message">%s</div>\n'
% self.message.html)
"""
def __addtoclass__(self, attr, cls):
cls.listeners.append(self.servlet_event)
self.name = attr
def servlet_event(self, name, servlet, *args, **kw):
if name == 'start_awake':
setattr(servlet, self.name, Message(servlet))
elif name == 'end_sleep':
if getattr(servlet, '_notify_written', False):
if 'notify.messages' in servlet.session:
del servlet.session['notify.messages']
return event.Continue
class Message(object):
def __init__(self, servlet):
self.servlet = servlet
def write(self, message):
session = self.servlet.session
messages = session.get('notify.messages') or []
messages.append(message)
session['notify.messages'] = messages
def __nonzero__(self):
return bool(self.servlet.session.get('notify.messages'))
def html__get(self):
messages = self.servlet.session.get('notify.messages') or []
self.servlet._notify_written = True
return self.peek
html = property(html__get)
def peek__get(self):
messages = self.servlet.session.get('notify.messages') or []
return '<br>'.join(messages)
peek = property(peek__get)
|