Mercurial > p > roundup > code
diff templates/classic/detectors/nosyreaction.py @ 1591:21312a7564fd
moving templates around
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Thu, 17 Apr 2003 03:38:00 +0000 |
| parents | |
| children | d2801a2b0a77 c4968040459e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/classic/detectors/nosyreaction.py Thu Apr 17 03:38:00 2003 +0000 @@ -0,0 +1,142 @@ +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +#$Id: nosyreaction.py,v 1.1 2003-04-17 03:26:38 richard Exp $ + +from roundup import roundupdb, hyperdb + +def nosyreaction(db, cl, nodeid, oldvalues): + ''' A standard detector is provided that watches for additions to the + "messages" property. + + When a new message is added, the detector sends it to all the users on + the "nosy" list for the issue that are not already on the "recipients" + list of the message. + + Those users are then appended to the "recipients" property on the + message, so multiple copies of a message are never sent to the same + user. + + The journal recorded by the hyperdatabase on the "recipients" property + then provides a log of when the message was sent to whom. + ''' + # send a copy of all new messages to the nosy list + for msgid in determineNewMessages(cl, nodeid, oldvalues): + try: + cl.nosymessage(nodeid, msgid, oldvalues) + except roundupdb.MessageSendError, message: + raise roundupdb.DetectorError, message + +def determineNewMessages(cl, nodeid, oldvalues): + ''' Figure a list of the messages that are being added to the given + node in this transaction. + ''' + messages = [] + if oldvalues is None: + # the action was a create, so use all the messages in the create + messages = cl.get(nodeid, 'messages') + elif oldvalues.has_key('messages'): + # the action was a set (so adding new messages to an existing issue) + m = {} + for msgid in oldvalues['messages']: + m[msgid] = 1 + messages = [] + # figure which of the messages now on the issue weren't there before + for msgid in cl.get(nodeid, 'messages'): + if not m.has_key(msgid): + messages.append(msgid) + return messages + +def updatenosy(db, cl, nodeid, newvalues): + '''Update the nosy list for changes to the assignedto + ''' + # nodeid will be None if this is a new node + current = {} + if nodeid is None: + ok = ('new', 'yes') + else: + ok = ('yes',) + # old node, get the current values from the node if they haven't + # changed + if not newvalues.has_key('nosy'): + nosy = cl.get(nodeid, 'nosy') + for value in nosy: + if not current.has_key(value): + current[value] = 1 + + # if the nosy list changed in this transaction, init from the new value + if newvalues.has_key('nosy'): + nosy = newvalues.get('nosy', []) + for value in nosy: + if not db.hasnode('user', value): + continue + if not current.has_key(value): + current[value] = 1 + + # add assignedto(s) to the nosy list + if newvalues.has_key('assignedto') and newvalues['assignedto'] is not None: + propdef = cl.getprops() + if isinstance(propdef['assignedto'], hyperdb.Link): + assignedto_ids = [newvalues['assignedto']] + elif isinstance(propdef['assignedto'], hyperdb.Multilink): + assignedto_ids = newvalues['assignedto'] + for assignedto_id in assignedto_ids: + if not current.has_key(assignedto_id): + current[assignedto_id] = 1 + + # see if there's any new messages - if so, possibly add the author and + # recipient to the nosy + if newvalues.has_key('messages'): + if nodeid is None: + ok = ('new', 'yes') + messages = newvalues['messages'] + else: + ok = ('yes',) + # figure which of the messages now on the issue weren't + # there before - make sure we don't get a cached version! + oldmessages = cl.get(nodeid, 'messages', cache=0) + messages = [] + for msgid in newvalues['messages']: + if msgid not in oldmessages: + messages.append(msgid) + + # configs for nosy modifications + add_author = getattr(db.config, 'ADD_AUTHOR_TO_NOSY', 'new') + add_recips = getattr(db.config, 'ADD_RECIPIENTS_TO_NOSY', 'new') + + # now for each new message: + msg = db.msg + for msgid in messages: + if add_author in ok: + authid = msg.get(msgid, 'author') + current[authid] = 1 + + # add on the recipients of the message + if add_recips in ok: + for recipient in msg.get(msgid, 'recipients'): + current[recipient] = 1 + + # that's it, save off the new nosy list + newvalues['nosy'] = current.keys() + +def init(db): + db.issue.react('create', nosyreaction) + db.issue.react('set', nosyreaction) + db.issue.audit('create', updatenosy) + db.issue.audit('set', updatenosy) + +# vim: set filetype=python ts=4 sw=4 et si
