diff options
Diffstat (limited to 'paste/wareweb/notify.py')
| -rw-r--r-- | paste/wareweb/notify.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/paste/wareweb/notify.py b/paste/wareweb/notify.py new file mode 100644 index 0000000..c4ced66 --- /dev/null +++ b/paste/wareweb/notify.py @@ -0,0 +1,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) + |
