| Index: modules/roundup/templates/nosyreaction.py.erb |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/modules/roundup/templates/nosyreaction.py.erb |
| @@ -0,0 +1,149 @@ |
| +# |
| +# 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.4 2005-04-04 08:47:14 richard Exp $ |
| + |
| +# Python 2.3 ... 2.6 compatibility: |
| +from roundup.anypy.sets_ import set |
| + |
| +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_nosy = set() |
| + 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: |
| + current_nosy.add(value) |
| + |
| + # 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 |
| + current_nosy.add(value) |
| + |
| + new_nosy = set(current_nosy) |
| + |
| + # 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: |
| + new_nosy.add(assignedto_id) |
| + |
| + # 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 |
| + oldmessages = cl.get(nodeid, 'messages') |
| + 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') |
| + new_nosy.add(authid) |
| + |
| + # add on the recipients of the message |
| + if add_recips in ok: |
| + for recipient in msg.get(msgid, 'recipients'): |
| + new_nosy.add(recipient) |
| + |
| + if current_nosy != new_nosy: |
| + # that's it, save off the new nosy list |
| + newvalues['nosy'] = list(new_nosy) |
| + |
| +def init(db): |
| + db.issue.react('create', nosyreaction) |
| + db.issue.react('set', nosyreaction) |
| + db.issue.audit('create', updatenosy) |
| + db.issue.audit('set', updatenosy) |
| + db.confidential.react('create', nosyreaction) |
| + db.confidential.react('set', nosyreaction) |
| + db.confidential.audit('create', updatenosy) |
| + db.confidential.audit('set', updatenosy) |
| + |
| +# vim: set filetype=python ts=4 sw=4 et si |
| +#SHA: dc34be7cc4a4956a8b49b779a7462904a2edd00d |