Package Products :: Package ZenWidgets :: Module messaging
[hide private]
[frames] | no frames]

Source Code for Module Products.ZenWidgets.messaging

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, Zenoss Inc. 
  5  # 
  6  # This program is free software; you can redistribute it and/or modify it 
  7  # under the terms of the GNU General Public License version 2 as published by 
  8  # the Free Software Foundation. 
  9  # 
 10  # For complete information please visit: http://www.zenoss.com/oss/ 
 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  # Constants representing priorities. 
 22  # Parallel definitions exist in zenoss.js. 
 23  INFO     = 0 
 24  WARNING  = 1 
 25  CRITICAL = 2 
 26   
27 -class BrowserMessage(object):
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):
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
60 - def delete(self):
61 """ 62 Delete this message from the system. 63 """ 64 self._read = True 65 try: self.__parent__.remove(self) 66 except (ValueError): pass 67 del self
68
69 - def mark_as_read(self):
70 self._read = True 71 self.delete()
72 73
74 -class MessageBox(object):
75 """ 76 Adapter for all persistent objects. Provides a method, L{get_messages}, 77 that retrieves L{Message} objects. 78 """ 79 implements(IMessageBox) 80 81 messagebox = None 82
83 - def get_unread(self, min_priority=INFO):
84 """ 85 Retrieve unread messages. 86 87 @param min_priority: Optional minimum priority of messages to be 88 returned; one of INFO, WARNING, CRITICAL 89 @type min_priority: int 90 @return: A list of objects implementing L{IMessage}. 91 @rtype: list 92 """ 93 msgs = self.get_messages(min_priority) 94 msgs = filter(lambda x:not x._read, msgs) 95 return msgs
96
97 - def get_messages(self, min_priority=INFO):
98 """ 99 Retrieve messages from the current users's session object. 100 101 @param min_priority: Optional minimum priority of messages to be 102 returned; one of INFO, WARNING, CRITICAL 103 @type min_priority: int 104 @return: A list of L{Message} objects. 105 @rtype: list 106 """ 107 msgs = sorted(self.messagebox, key=lambda x:x.timestamp) 108 msgs = filter(lambda x:x.priority>=min_priority, msgs) 109 return msgs
110 111
112 -class BrowserMessageBox(MessageBox):
113 """ 114 Adapter for all persistent objects. Provides a method, L{get_messages}, 115 that retrieves L{Message} objects from the current user's session. 116 """ 117 implements(IBrowserMessages)
118 - def __init__(self, context):
119 """ 120 Initialization method. 121 122 @param context: The object being adapted. Must have access to the 123 current request object via acquisition. 124 @type context: Persistent 125 """ 126 self.context = context 127 self.messagebox = self.context.REQUEST.SESSION.get('messages', [])
128 129
130 -class UserMessageBox(MessageBox):
131 """ 132 Adapter for all persistent objects. Provides a method, L{get_messages}, 133 that retrieves L{Message} objects from the current user's L{MessageQueue}. 134 """ 135 implements(IUserMessages)
136 - def __init__(self, context, user=None):
137 """ 138 Initialization method. 139 140 @param context: The object being adapted. Must have access to the dmd 141 via acquisition. 142 @type context: Persistent 143 @param user: Optional username corresponding to the queue from which 144 messages will be retrieved. If left as C{None}, the 145 current user's queue will be used. 146 @type user: str 147 """ 148 self.context = context 149 self.user = user 150 users = getToolByName(self.context, 'ZenUsers') 151 us = users.getUserSettings(self.user) 152 self.messagebox = us.messages()
153 154
155 -class MessageSender(object):
156 """ 157 Adapts persistent objects in order to provide message sending capability. 158 """ 159 implements(IMessageSender) 160
161 - def __init__(self, context):
162 """ 163 Initialization method. 164 165 @param context: The object being adapted. Must have access to the 166 dmd and the current request object via acquisition. 167 @type context: Persistent 168 """ 169 self.context = context
170
171 - def sendToBrowser(self, title, body, priority=INFO, image=None):
172 """ 173 Create a message and store it on the session object. 174 175 @param title: The message title 176 @type title: str 177 @param body: The body of the message 178 @type body: str 179 @param priority: Message priority; one of INFO, WARNING, CRITICAL 180 @type priority: int 181 @param image: Optional URL of an image to be displayed in the message 182 @type image: str 183 """ 184 context = self.context.REQUEST.SESSION.get('messages') 185 if context is None: 186 self.context.REQUEST.SESSION['messages'] = context = [] 187 m = BrowserMessage(title, body, priority, image) 188 m.__parent__ = context 189 context.append(m)
190
191 - def sendToUser(self, title, body, priority=INFO, image=None, user=None):
192 """ 193 Create a message and store it in the L{IMessageQueue} of the user 194 specified. If no user is specified, use the queue of the current user. 195 196 @param title: The message title 197 @type title: str 198 @param body: The body of the message 199 @type body: str 200 @param priority: Message priority; one of INFO, WARNING, CRITICAL 201 @type priority: int 202 @param image: Optional URL of an image to be displayed in the message 203 @type image: str 204 @param user: Optional username corresponding to the queue to which 205 messages should be sent. If left as C{None}, the current 206 user's queue will be used. 207 @type user: str 208 """ 209 users = getToolByName(self.context, 'ZenUsers') 210 us = users.getUserSettings(user) 211 id = ZenRelationshipNameChooser(us.messages).chooseName('msg') 212 # done in here to prevent recursive imports from ZenModelRM 213 from PersistentMessage import PersistentMessage 214 m = PersistentMessage(id, title, body, priority, image) 215 us.messages._setObject(m.id, m)
216
217 - def sendToAll(self, title, body, priority=INFO, image=None):
218 """ 219 For eash user in the system, create an identical message and store it 220 in the user's L{IMessageQueue}. 221 222 @param title: The message title 223 @type title: str 224 @param body: The body of the message 225 @type body: str 226 @param priority: Message priority; one of INFO, WARNING, CRITICAL 227 @type priority: int 228 @param image: Optional URL of an image to be displayed in the message 229 @type image: str 230 """ 231 users = getToolByName(self.context, 'ZenUsers') 232 for name in users.getAllUserSettingsNames(): 233 self.sendToUser(title, body, priority, user=name, image=image)
234 235
236 -class ScriptMessageSender(MessageSender):
237 """ 238 Special message sender for use in scripts. Short-circuits sendToBrowser and 239 sendToUser, since they don't really apply. sendToAll should still work fine 240 though. 241 """
242 - def sendToBrowser(self, title, body, priority=INFO, image=None):
243 pass
244 - def sendToUser(self, title, body, priority=INFO, image=None, user=None):
245 pass
246