1
2
3
4
5
6
7
8
9
10
11
12
13 import time
14
15 from zope.interface import implements
16 from Products.CMFCore.utils import getToolByName
17 from Products.ZenRelations.utils import ZenRelationshipNameChooser
18 from Products.ZenWidgets.interfaces import *
19
20
21
22
23 INFO = 0
24 WARNING = 1
25 CRITICAL = 2
26
28 """
29 A single message. Messages are stored on UserSettings and in the session
30 object.
31 """
32 implements(IMessage)
33
34 __parent__ = None
35 title = None
36 body = None
37 timestamp = None
38 priority = None
39 _read = False
40
41 - def __init__(self, title, body, priority=INFO, image=None, sticky=None):
42 """
43 Initialization method.
44
45 @param title: The message title
46 @type title: str
47 @param body: The body of the message
48 @type body: str
49 @param priority: Message priority; one of INFO, WARNING, CRITICAL
50 @type priority: int
51 @param image: Optional URL of an image to be displayed in the message
52 @type image: str
53 """
54 self.title = title
55 self.body = body
56 self.priority = priority
57 self.image = image
58 self.timestamp = time.time()
59 self.sticky = sticky
60
62 """
63 Delete this message from the system.
64 """
65 self._read = True
66 try: self.__parent__.remove(self)
67 except (ValueError): pass
68 del self
69
73
74
76 """
77 Adapter for all persistent objects. Provides a method, L{get_messages},
78 that retrieves L{Message} objects.
79 """
80 implements(IMessageBox)
81
82 messagebox = None
83
85 """
86 Retrieve unread messages.
87
88 @param min_priority: Optional minimum priority of messages to be
89 returned; one of INFO, WARNING, CRITICAL
90 @type min_priority: int
91 @return: A list of objects implementing L{IMessage}.
92 @rtype: list
93 """
94 msgs = self.get_messages(min_priority)
95 msgs = filter(lambda x:not x._read, msgs)
96 return msgs
97
99 """
100 Retrieve messages from the current users's session object.
101
102 @param min_priority: Optional minimum priority of messages to be
103 returned; one of INFO, WARNING, CRITICAL
104 @type min_priority: int
105 @return: A list of L{Message} objects.
106 @rtype: list
107 """
108 msgs = sorted(self.messagebox, key=lambda x:x.timestamp)
109 msgs = filter(lambda x:x.priority>=min_priority, msgs)
110 return msgs
111
112
114 """
115 Adapter for all persistent objects. Provides a method, L{get_messages},
116 that retrieves L{Message} objects from the current user's session.
117 """
118 implements(IBrowserMessages)
120 """
121 Initialization method.
122
123 @param context: The object being adapted. Must have access to the
124 current request object via acquisition.
125 @type context: Persistent
126 """
127 self.context = context
128 self.messagebox = self.context.REQUEST.SESSION.get('messages', [])
129
130
132 """
133 Adapter for all persistent objects. Provides a method, L{get_messages},
134 that retrieves L{Message} objects from the current user's L{MessageQueue}.
135 """
136 implements(IUserMessages)
137 - def __init__(self, context, user=None):
138 """
139 Initialization method.
140
141 @param context: The object being adapted. Must have access to the dmd
142 via acquisition.
143 @type context: Persistent
144 @param user: Optional username corresponding to the queue from which
145 messages will be retrieved. If left as C{None}, the
146 current user's queue will be used.
147 @type user: str
148 """
149 self.context = context
150 self.user = user
151 users = getToolByName(self.context, 'ZenUsers')
152 us = users.getUserSettings(self.user)
153 self.messagebox = us.messages()
154
155
157 """
158 Adapts persistent objects in order to provide message sending capability.
159 """
160 implements(IMessageSender)
161
163 """
164 Initialization method.
165
166 @param context: The object being adapted. Must have access to the
167 dmd and the current request object via acquisition.
168 @type context: Persistent
169 """
170 self.context = context
171
173 """
174 Create a message and store it on the session object.
175
176 @param title: The message title
177 @type title: str
178 @param body: The body of the message
179 @type body: str
180 @param priority: Message priority; one of INFO, WARNING, CRITICAL
181 @type priority: int
182 @param image: Optional URL of an image to be displayed in the message
183 @type image: str
184 """
185 context = self.context.REQUEST.SESSION.get('messages')
186 if context is None:
187 self.context.REQUEST.SESSION['messages'] = context = []
188 m = BrowserMessage(title, body, priority, image, sticky)
189 m.__parent__ = context
190 context.append(m)
191
192 - def sendToUser(self, title, body, priority=INFO, image=None, user=None):
193 """
194 Create a message and store it in the L{IMessageQueue} of the user
195 specified. If no user is specified, use the queue of the current user.
196
197 @param title: The message title
198 @type title: str
199 @param body: The body of the message
200 @type body: str
201 @param priority: Message priority; one of INFO, WARNING, CRITICAL
202 @type priority: int
203 @param image: Optional URL of an image to be displayed in the message
204 @type image: str
205 @param user: Optional username corresponding to the queue to which
206 messages should be sent. If left as C{None}, the current
207 user's queue will be used.
208 @type user: str
209 """
210 users = getToolByName(self.context, 'ZenUsers')
211 us = users.getUserSettings(user)
212 id = ZenRelationshipNameChooser(us.messages).chooseName('msg')
213
214 from PersistentMessage import PersistentMessage
215 m = PersistentMessage(id, title, body, priority, image)
216 us.messages._setObject(m.id, m)
217
219 """
220 For eash user in the system, create an identical message and store it
221 in the user's L{IMessageQueue}.
222
223 @param title: The message title
224 @type title: str
225 @param body: The body of the message
226 @type body: str
227 @param priority: Message priority; one of INFO, WARNING, CRITICAL
228 @type priority: int
229 @param image: Optional URL of an image to be displayed in the message
230 @type image: str
231 """
232 users = getToolByName(self.context, 'ZenUsers')
233 for name in users.getAllUserSettingsNames():
234 self.sendToUser(title, body, priority, user=name, image=image)
235
236
238 """
239 Special message sender for use in scripts. Short-circuits sendToBrowser and
240 sendToUser, since they don't really apply. sendToAll should still work fine
241 though.
242 """
245 - def sendToUser(self, title, body, priority=INFO, image=None, user=None):
247