Code

. incorporated patch from Roch'e Compaan implementing attachments in nosy
authorrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Thu, 15 Nov 2001 10:36:17 +0000 (10:36 +0000)
committerrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Thu, 15 Nov 2001 10:36:17 +0000 (10:36 +0000)
    e-mail

git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@404 57a73879-2fb5-44c3-a270-3262357dd7e2

CHANGES.txt
roundup/roundupdb.py

index ca8f0fc8029318e49860bd7e797ffea67536a996..11b5ada4af784384216099581021f2815c97c5e9 100644 (file)
@@ -13,6 +13,8 @@ Feature:
  . roundup-mailgw now supports unix mailbox and POP as sources of mail.
  . roundup-admin now handles all hyperdb exceptions
  . users may attach files to issues (and support in ext) through the web now
+ . incorporated patch from Roch'e Compaan implementing attachments in nosy
+   e-mail
 
 Fixed:
  . Fixed a bug in HTMLTemplate changes.
index d0ef649bf6152e11e8c6e01d857ea9fc9e4c9c91..f6228d9744f63d7bb559b9fc44a8e676d7f93ae7 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: roundupdb.py,v 1.17 2001-11-12 22:01:06 richard Exp $
+# $Id: roundupdb.py,v 1.18 2001-11-15 10:36:17 richard Exp $
 
 import re, os, smtplib, socket
+import mimetools, MimeWriter, cStringIO
+import binascii, mimetypes
 
 import hyperdb, date
 
@@ -316,12 +318,8 @@ class IssueClass(Class):
             authaddr = '<%s> '%authaddr
         else:
             authaddr = ''
-        # TODO attachments
-        m = ['Subject: [%s%s] %s'%(cn, nodeid, title)]
-        m.append('To: %s'%', '.join(sendto))
-        m.append('From: %s'%self.ISSUE_TRACKER_EMAIL)
-        m.append('Reply-To: %s'%self.ISSUE_TRACKER_EMAIL)
-        m.append('')
+        # make the message body
+        m = []
         # add author information
         m.append("%s %sadded the comment:"%(authname, authaddr))
         m.append('')
@@ -329,20 +327,60 @@ class IssueClass(Class):
         m.append(self.db.msg.get(msgid, 'content'))
         # "list information" footer
         m.append(self.email_footer(nodeid, msgid))
+
+        # get the files for this message
+        files = self.db.msg.get(msgid, 'files')
+
+        # create the message
+        message = cStringIO.StringIO()
+        writer = MimeWriter.MimeWriter(message)
+        writer.addheader('Subject', '[%s%s] %s'%(cn, nodeid, title))
+        writer.addheader('To', ', '.join(sendto))
+        writer.addheader('Form', self.ISSUE_TRACKER_EMAIL)
+        writer.addheader('Reply-To:', self.ISSUE_TRACKER_EMAIL)
+        if files:
+            part = writer.startmultipartbody('mixed')
+            part = writer.nextpart()
+            body = part.startbody('text/plain')
+            body.write('\n'.join(m))
+            for fileid in files:
+                name = self.db.file.get(fileid, 'name')
+                type = self.db.file.get(fileid, 'type')
+                content = self.db.file.get(fileid, 'content')
+                part = writer.nextpart()
+                if type == 'text/plain':
+                    part.addheader('Content-Disposition',
+                        'attachment;\n filename="%s"'%name)
+                    part.addheader('Content-Transfer-Encoding', '7bit')
+                    body = part.startbody('text/plain')
+                    body.write(content)
+                else:
+                    type = mimetypes.guess_type(name)[0]
+                    part.addheader('Content-Disposition',
+                        'attachment;\n filename="%s"'%name)
+                    part.addheader('Content-Transfer-Encoding', 'base64')
+                    body = part.startbody(type)
+                body.write(binascii.b2a_base64(content))
+            writer.lastpart()
+        else:
+            body = writer.startbody('text/plain')
+            body.write('\n'.join(m))
+
+        # now try to send the message
         try:
             smtp = smtplib.SMTP(self.MAILHOST)
-            smtp.sendmail(self.ISSUE_TRACKER_EMAIL, sendto, '\n'.join(m))
+            smtp.sendmail(self.ISSUE_TRACKER_EMAIL, sendto, message.getvalue())
         except socket.error, value:
             raise MessageSendError, \
                 "Couldn't send confirmation email: mailhost %s"%value
         except smtplib.SMTPException, value:
             raise MessageSendError, \
-                 "Couldn't send confirmation email: %s"%value
+                "Couldn't send confirmation email: %s"%value
 
     def email_footer(self, nodeid, msgid):
         ''' Add a footer to the e-mail with some useful information
         '''
-        web = self.ISSUE_TRACKER_WEB
+        web = self.ISSUE_TRACKER_WEB + 'issue'+ nodeid
         return '''%s
 Roundup issue tracker
 %s
@@ -351,6 +389,9 @@ Roundup issue tracker
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.17  2001/11/12 22:01:06  richard
+# Fixed issues with nosy reaction and author copies.
+#
 # Revision 1.16  2001/10/30 00:54:45  richard
 # Features:
 #  . #467129 ] Lossage when username=e-mail-address