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)