summaryrefslogtreecommitdiff
path: root/paste/wareweb/notify.py
blob: c4ced66443bf6de30a57782c6a6617b3f931e37b (plain)
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)