0001import event
0002
0003__all__ = ['Notify']
0004
0005class Notify(object):
0006
0007 """
0008 This allows you to queue messages to be displayed to the user on
0009 the next page the user reads.
0010
0011 This allows you to give messages in response to POST requests,
0012 then redirect to a another page and display that message (e.g,
0013 'event added').
0014
0015 Usage::
0016
0017 class SitePage(Servlet):
0018 message = Notify()
0019
0020 class MyPage(SitePage):
0021 def setup(self):
0022 if something_done:
0023 self.message.write('All good!')
0024 self.redirect(...)
0025 def respond(self):
0026 write header...
0027 if self.message:
0028 self.write('<div class="message">%s</div>\n'
0029 % self.message.html)
0030
0031 """
0032
0033 def __addtoclass__(self, attr, cls):
0034 cls.listeners.append(self.servlet_event)
0035 self.name = attr
0036
0037 def servlet_event(self, name, servlet, *args, **kw):
0038 if name == 'start_awake':
0039 setattr(servlet, self.name, Message(servlet))
0040 elif name == 'end_sleep':
0041 if getattr(servlet, '_notify_written', False):
0042 if 'notify.messages' in servlet.session:
0043 del servlet.session['notify.messages']
0044 return event.Continue
0045
0046class Message(object):
0047
0048 def __init__(self, servlet):
0049 self.servlet = servlet
0050
0051 def write(self, message):
0052 session = self.servlet.session
0053 messages = session.get('notify.messages') or []
0054 messages.append(message)
0055 session['notify.messages'] = messages
0056
0057 def __nonzero__(self):
0058 return bool(self.servlet.session.get('notify.messages'))
0059
0060 def html__get(self):
0061 messages = self.servlet.session.get('notify.messages') or []
0062 self.servlet._notify_written = True
0063 return self.peek
0064 html = property(html__get)
0065
0066 def peek__get(self):
0067 messages = self.servlet.session.get('notify.messages') or []
0068 return '<br>'.join(messages)
0069 peek = property(peek__get)