diff roundup/mailgw.py @ 699:676d4cfde9a5

Nosy list improvements. . added option to automatically add the authors and recipients of messages to the nosy lists with the options ADD_AUTHOR_TO_NOSY (default 'new') and ADD_RECIPIENTS_TO_NOSY (default 'new'). These settings emulate the current behaviour. Setting them to 'yes' will add the author/recipients to the nosy on messages that create issues and followup messages. . added missing documentation for a few of the config option values
author Richard Jones <richard@users.sourceforge.net>
date Thu, 02 May 2002 07:56:34 +0000
parents 34dbcdfb2fe1
children 7ba403bffed5
line wrap: on
line diff
--- a/roundup/mailgw.py	Sat Apr 27 10:07:23 2002 +0000
+++ b/roundup/mailgw.py	Thu May 02 07:56:34 2002 +0000
@@ -73,7 +73,7 @@
 an exception, the original message is bounced back to the sender with the
 explanatory message given in the exception. 
 
-$Id: mailgw.py,v 1.67 2002-04-23 15:46:49 rochecompaan Exp $
+$Id: mailgw.py,v 1.68 2002-05-02 07:56:34 richard Exp $
 '''
 
 
@@ -131,7 +131,7 @@
     def main(self, fp):
         ''' fp - the file from which to read the Message.
         '''
-        self.handle_Message(Message(fp))
+        return self.handle_Message(Message(fp))
 
     def handle_Message(self, message):
         '''Handle an RFC822 Message
@@ -493,7 +493,14 @@
             r = recipient[1].strip().lower()
             if r == tracker_email or not r:
                 continue
-            recipients.append(self.db.uidFromAddress(recipient))
+
+            # look up the recipient - create if necessary (and we're
+            # allowed to)
+            recipient = self.db.uidFromAddress(recipient, create)
+
+            # if all's well, add the recipient to the list
+            if recipient:
+                recipients.append(recipient)
 
         #
         # handle message-id and in-reply-to
@@ -638,25 +645,13 @@
                             current_status == resolved_id):
                         props['status'] = chatting_id
 
-            # add nosy in arguments to issue's nosy list
-            if not props.has_key('nosy'): props['nosy'] = []
-            n = {}
+            # update the nosy list
+            current = {}
             for nid in cl.get(nodeid, 'nosy'):
-                n[nid] = 1
-            for value in props['nosy']:
-                if self.db.hasnode('user', value):
-                    nid = value
-                else: 
-                    continue
-                if n.has_key(nid): continue
-                n[nid] = 1
-            props['nosy'] = n.keys()
-            # add assignedto to the nosy list
-            if props.has_key('assignedto'):
-                assignedto = props['assignedto']
-                if assignedto not in props['nosy']:
-                    props['nosy'].append(assignedto)
+                current[nid] = 1
+            self.updateNosy(props, author, recipients, current)
 
+            # create the message
             message_id = self.db.msg.create(author=author,
                 recipients=recipients, date=date.Date('.'), summary=summary,
                 content=content, files=files, messageid=messageid,
@@ -711,30 +706,7 @@
             props['messages'] = [message_id]
 
             # set up (clean) the nosy list
-            nosy = props.get('nosy', [])
-            n = {}
-            for value in nosy:
-                nid = value
-                if n.has_key(nid): continue
-                n[nid] = 1
-            props['nosy'] = n.keys()
-            # add on the recipients of the message
-            for recipient in recipients:
-                if not n.has_key(recipient):
-                    props['nosy'].append(recipient)
-                    n[recipient] = 1
-
-            # add the author to the nosy list
-            if not n.has_key(author):
-                props['nosy'].append(author)
-                n[author] = 1
-
-            # add assignedto to the nosy list
-            if properties.has_key('assignedto') and props.has_key('assignedto'):
-                assignedto = props['assignedto']
-                if not n.has_key(assignedto):
-                    props['nosy'].append(assignedto)
-                    n[assignedto] = 1
+            self.updateNosy(props, author, recipients)
 
             # and attempt to create the new node
             try:
@@ -748,6 +720,50 @@
             # commit the new node(s) to the DB
             self.db.commit()
 
+        return nodeid
+
+    def updateNosy(self, props, author, recipients, current=None):
+        '''Determine what the nosy list should be given:
+
+            props:      properties specified on the subject line of the message
+            author:     the sender of the message
+            recipients: the recipients (to, cc) of the message
+            current:    if the issue already exists, this is the current nosy
+                        list, as a dictionary.
+        '''
+        if current is None:
+            current = {}
+            ok = ('new', 'yes')
+        else:
+            ok = ('yes',)
+
+        # add nosy in arguments to issue's nosy list
+        nosy = props.get('nosy', [])
+        for value in nosy:
+            if not self.db.hasnode('user', value):
+                continue
+            if not current.has_key(value):
+                current[value] = 1
+
+        # add the author to the nosy list
+        if getattr(self.instance, 'ADD_AUTHOR_TO_NOSY', 'new') in ok:
+            if not current.has_key(author):
+                current[author] = 1
+
+        # add on the recipients of the message
+        if getattr(self.instance, 'ADD_RECIPIENTS_TO_NOSY', 'new') in ok:
+            for recipient in recipients:
+                if not current.has_key(recipient):
+                    current[recipient] = 1
+
+        # add assignedto to the nosy list
+        if props.has_key('assignedto'):
+            assignedto = props['assignedto']
+            if not current.has_key(assignedto):
+                current[assignedto] = 1
+
+        props['nosy'] = current.keys()
+
 def parseContent(content, keep_citations, keep_body,
         blank_line=re.compile(r'[\r\n]+\s*[\r\n]+'),
         eol=re.compile(r'[\r\n]+'), 
@@ -812,6 +828,11 @@
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.67  2002/04/23 15:46:49  rochecompaan
+#  . stripping of the email message body can now be controlled through
+#    the config variables EMAIL_KEEP_QUOTED_TEST and
+#    EMAIL_LEAVE_BODY_UNCHANGED.
+#
 # Revision 1.66  2002/03/14 23:59:24  richard
 #  . #517734 ] web header customisation is obscure
 #

Roundup Issue Tracker: http://roundup-tracker.org/