annotate roundup/roundupdb.py @ 4543:d16d9bf655d8

- fix handling of traceback mails to the roundup admin - now this mail is a multipart/alternative with the HTML part *and* the traceback in text-format.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Fri, 07 Oct 2011 19:08:54 +0000
parents 46239c21a1eb
children d9d7319afffa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3621
diff changeset
1 from __future__ import nested_scopes
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
2 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
3 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
4 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
5 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
6 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
7 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
8 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
9 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
10 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
11 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
12 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
13 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
14 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
15 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
16 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
17 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
18 #
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 393
diff changeset
19
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
20 """Extending hyperdb with types specific to issue-tracking.
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 393
diff changeset
21 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
22 __docformat__ = 'restructuredtext'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
23
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
24 import re, os, smtplib, socket, time, random
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
25 import cStringIO, base64, mimetypes
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
26 import os.path
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
27 import logging
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
28 from email import Encoders
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
29 from email.Utils import formataddr
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
30 from email.Header import Header
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
31 from email.MIMEText import MIMEText
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
32 from email.MIMEBase import MIMEBase
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
33 from email.MIMEMultipart import MIMEMultipart
4426
25085aec7d5a fix py2.4 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 4424
diff changeset
34
4447
9d37875416c3 python2.3 compatibility fixes
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4426
diff changeset
35 from anypy.email_ import FeedParser
1383
f19dde90e473 applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1379
diff changeset
36
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
37 from roundup import password, date, hyperdb
3599
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
38 from roundup.i18n import _
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
39 from roundup.hyperdb import iter_roles
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
40
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
41 from roundup.mailer import Mailer, MessageSendError, encode_quopri, \
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
42 nice_sender_header
458
fcda73536034 Added ROUNDUPDBSENDMAILDEBUG so one can test the sendmail method...
Richard Jones <richard@users.sourceforge.net>
parents: 453
diff changeset
43
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
44 try:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
45 import pyme, pyme.core
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
46 except ImportError:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
47 pyme = None
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
48
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
49
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 class Database:
2735
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
51
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
52 # remember the journal uid for the current journaltag so that:
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
53 # a. we don't have to look it up every time we need it, and
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
54 # b. if the journaltag disappears during a transaction, we don't barf
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
55 # (eg. the current user edits their username)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
56 journal_uid = None
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 def getuid(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 """Return the id of the "user" node associated with the user
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 that owns this connection to the hyperdatabase."""
1800
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
60 if self.journaltag is None:
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
61 return None
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
62 elif self.journaltag == 'admin':
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
63 # admin user may not exist, but always has ID 1
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
64 return '1'
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
65 else:
2735
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
66 if (self.journal_uid is None or self.journal_uid[0] !=
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
67 self.journaltag):
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
68 uid = self.user.lookup(self.journaltag)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
69 self.journal_uid = (self.journaltag, uid)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
70 return self.journal_uid[1]
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71
2906
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
72 def setCurrentUser(self, username):
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
73 """Set the user that is responsible for current database
2906
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
74 activities.
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
75 """
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
76 self.journaltag = username
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
77
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
78 def isCurrentUser(self, username):
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
79 """Check if a given username equals the already active user.
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
80 """
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
81 return self.journaltag == username
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
82
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
83 def getUserTimezone(self):
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
84 """Return user timezone defined in 'timezone' property of user class.
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
85 If no such property exists return 0
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
86 """
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
87 userid = self.getuid()
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
88 timezone = None
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
89 try:
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
90 tz = self.user.get(userid, 'timezone')
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
91 date.get_timezone(tz)
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
92 timezone = tz
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
93 except KeyError:
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
94 pass
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
95 # If there is no class 'user' or current user doesn't have timezone
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
96 # property or that property is not set assume he/she lives in
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
97 # the timezone set in the tracker config.
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
98 if timezone is None:
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
99 timezone = self.config['TIMEZONE']
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
100 return timezone
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
101
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
102 def confirm_registration(self, otk):
2089
93f03c6714d8 A few big changes in this commit:
Richard Jones <richard@users.sourceforge.net>
parents: 2077
diff changeset
103 props = self.getOTKManager().getall(otk)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
104 for propname, proptype in self.user.getprops().items():
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
105 value = props.get(propname, None)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
106 if value is None:
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
107 pass
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
108 elif isinstance(proptype, hyperdb.Date):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
109 props[propname] = date.Date(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
110 elif isinstance(proptype, hyperdb.Interval):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
111 props[propname] = date.Interval(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
112 elif isinstance(proptype, hyperdb.Password):
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4447
diff changeset
113 props[propname] = password.Password(encrypted=value)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
114
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
115 # tag new user creation with 'admin'
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
116 self.journaltag = 'admin'
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
117
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
118 # create the new user
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
119 cl = self.user
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
120
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
121 props['roles'] = self.config.NEW_WEB_USER_ROLES
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
122 userid = cl.create(**props)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
123 # clear the props from the otk database
2089
93f03c6714d8 A few big changes in this commit:
Richard Jones <richard@users.sourceforge.net>
parents: 2077
diff changeset
124 self.getOTKManager().destroy(otk)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
125 self.commit()
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
126
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
127 return userid
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
128
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
129
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
130 def log_debug(self, msg, *args, **kwargs):
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
131 """Log a message with level DEBUG."""
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
132
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
133 logger = self.get_logger()
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
134 logger.debug(msg, *args, **kwargs)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
135
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
136 def log_info(self, msg, *args, **kwargs):
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
137 """Log a message with level INFO."""
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
138
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
139 logger = self.get_logger()
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
140 logger.info(msg, *args, **kwargs)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
141
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
142 def get_logger(self):
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
143 """Return the logger for this database."""
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
144
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
145 # Because getting a logger requires acquiring a lock, we want
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
146 # to do it only once.
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
147 if not hasattr(self, '__logger'):
4420
9655a1b65974 - more logger fixes -- use correct hierarchical logger names...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4358
diff changeset
148 self.__logger = logging.getLogger('roundup.hyperdb')
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
149
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
150 return self.__logger
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
151
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
152
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
153 class DetectorError(RuntimeError):
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
154 """ Raised by detectors that want to indicate that something's amiss
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
155 """
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
156 pass
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
157
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
158 # deviation from spec - was called IssueClass
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
159 class IssueClass:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
160 """This class is intended to be mixed-in with a hyperdb backend
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
161 implementation. The backend should provide a mechanism that
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
162 enforces the title, messages, files, nosy and superseder
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
163 properties:
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
164
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
165 - title = hyperdb.String(indexme='yes')
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
166 - messages = hyperdb.Multilink("msg")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
167 - files = hyperdb.Multilink("file")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
168 - nosy = hyperdb.Multilink("user")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
169 - superseder = hyperdb.Multilink(classname)
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
170 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
172 # The tuple below does not affect the class definition.
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
173 # It just lists all names of all issue properties
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
174 # marked for message extraction tool.
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
175 #
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
176 # XXX is there better way to get property names into message catalog??
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
177 #
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
178 # Note that this list also includes properties
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
179 # defined in the classic template:
3904
91008ec8f9a0 retire "topic" usage
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3892
diff changeset
180 # assignedto, keyword, priority, status.
2545
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
181 (
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
182 ''"title", ''"messages", ''"files", ''"nosy", ''"superseder",
3904
91008ec8f9a0 retire "topic" usage
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3892
diff changeset
183 ''"assignedto", ''"keyword", ''"priority", ''"status",
2545
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
184 # following properties are common for all hyperdb classes
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
185 # they are listed here to keep things in one place
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
186 ''"actor", ''"activity", ''"creator", ''"creation",
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
187 )
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
188
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 # New methods:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
190 def addmessage(self, issueid, summary, text):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 """Add a message to an issue's mail spool.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 A new "msg" node is constructed using the current date, the user that
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 owns the database connection as the author, and the specified summary
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 text.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 The "files" and "recipients" fields are left empty.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 The given text is saved as the body of the message and the node is
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 appended to the "messages" field of the specified issue.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 """
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
203 def nosymessage(self, issueid, msgid, oldvalues, whichnosy='nosy',
4497
29576edb45d5 Allow to specify additional cc and bcc emails (not roundup users)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4480
diff changeset
204 from_address=None, cc=[], bcc=[], cc_emails = [], bcc_emails = []):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 """Send a message to the members of an issue's nosy list.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 The message is sent only to users on the nosy list who are not
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 already on the "recipients" list for the message.
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
209
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 These users are then added to the message's "recipients" list.
1379
98ec0c4ce7ab missed a fix to the mailing patches
Richard Jones <richard@users.sourceforge.net>
parents: 1360
diff changeset
211
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
212 If 'msgid' is None, the message gets sent only to the nosy
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
213 list, and it's called a 'System Message'.
2228
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
214
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
215 The "cc" argument indicates additional recipients to send the
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
216 message to that may not be specified in the message's recipients
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
217 list.
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
218
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
219 The "bcc" argument also indicates additional recipients to send the
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
220 message to that may not be specified in the message's recipients
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
221 list. These recipients will not be included in the To: or Cc:
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
222 address lists. Note that the list of bcc users *is* updated in
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
223 the recipient list of the message, so this field has to be
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
224 protected (using appropriate permissions), otherwise the bcc
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
225 will be decuceable for users who have web access to the tracker.
4497
29576edb45d5 Allow to specify additional cc and bcc emails (not roundup users)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4480
diff changeset
226
29576edb45d5 Allow to specify additional cc and bcc emails (not roundup users)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4480
diff changeset
227 The cc_emails and bcc_emails arguments take a list of additional
29576edb45d5 Allow to specify additional cc and bcc emails (not roundup users)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4480
diff changeset
228 recipient email addresses (just the mail address not roundup users)
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
229 this can be useful for sending to additional email addresses
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
230 which are no roundup users. These arguments are currently not
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
231 used by roundups nosyreaction but can be used by customized
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
232 (nosy-)reactors.
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
233
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
234 A note on encryption: If pgp encryption for outgoing mails is
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
235 turned on in the configuration and no specific pgp roles are
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
236 defined, we try to send encrypted mail to *all* users
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
237 *including* cc, bcc, cc_emails and bcc_emails and this might
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
238 fail if not all the keys are available in roundups keyring.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 """
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
240 encrypt = self.db.config.PGP_ENABLE and self.db.config.PGP_ENCRYPT
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
241 pgproles = self.db.config.PGP_ROLES
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
242 if msgid:
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
243 authid = self.db.msg.get(msgid, 'author')
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
244 recipients = self.db.msg.get(msgid, 'recipients', [])
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
245 else:
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
246 # "system message"
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
247 authid = None
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
248 recipients = []
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
249
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
250 sendto = dict (plain = [], crypt = [])
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
251 bcc_sendto = dict (plain = [], crypt = [])
1949
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
252 seen_message = {}
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
253 for recipient in recipients:
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
254 seen_message[recipient] = 1
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
255
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
256 def add_recipient(userid, to):
4289
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
257 """ make sure they have an address """
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
258 address = self.db.user.get(userid, 'address')
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
259 if address:
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
260 ciphered = encrypt and (not pgproles or
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
261 self.db.user.has_role(userid, *iter_roles(pgproles)))
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
262 type = ['plain', 'crypt'][ciphered]
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
263 to[type].append(address)
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
264 recipients.append(userid)
2073
261c2e6ceb1e *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
265
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
266 def good_recipient(userid):
4289
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
267 """ Make sure we don't send mail to either the anonymous
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
268 user or a user who has already seen the message.
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
269 Also check permissions on the message if not a system
4290
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4289
diff changeset
270 message: A user must have view permission on content and
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4447
diff changeset
271 files to be on the receiver list. We do *not* check the
4289
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
272 author etc. for now.
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
273 """
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
274 allowed = True
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
275 if msgid:
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
276 for prop in 'content', 'files':
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
277 if prop in self.db.msg.properties:
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
278 allowed = allowed and self.db.security.hasPermission(
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
279 'View', userid, 'msg', prop, msgid)
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
280 return (userid and
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
281 (self.db.user.get(userid, 'username') != 'anonymous') and
4289
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
282 allowed and not seen_message.has_key(userid))
2073
261c2e6ceb1e *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
283
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
284 # possibly send the message to the author, as long as they aren't
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
285 # anonymous
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
286 if (good_recipient(authid) and
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
287 (self.db.config.MESSAGES_TO_AUTHOR == 'yes' or
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
288 (self.db.config.MESSAGES_TO_AUTHOR == 'new' and not oldvalues))):
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
289 add_recipient(authid, sendto)
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
290
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
291 if authid:
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
292 seen_message[authid] = 1
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
293
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
294 # now deal with the nosy and cc people who weren't recipients.
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
295 for userid in cc + self.get(issueid, whichnosy):
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
296 if good_recipient(userid):
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
297 add_recipient(userid, sendto)
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
298 if encrypt and not pgproles:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
299 sendto['crypt'].extend (cc_emails)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
300 else:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
301 sendto['plain'].extend (cc_emails)
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
302
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
303 # now deal with bcc people.
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
304 for userid in bcc:
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
305 if good_recipient(userid):
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
306 add_recipient(userid, bcc_sendto)
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
307 if encrypt and not pgproles:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
308 bcc_sendto['crypt'].extend (bcc_emails)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
309 else:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
310 bcc_sendto['plain'].extend (bcc_emails)
337
8cd545738d8e Features:
Richard Jones <richard@users.sourceforge.net>
parents: 318
diff changeset
311
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
312 if oldvalues:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
313 note = self.generateChangeNote(issueid, oldvalues)
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
314 else:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
315 note = self.generateCreateNote(issueid)
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
316
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
317 # If we have new recipients, update the message's recipients
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
318 # and send the mail.
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
319 if sendto['plain'] or sendto['crypt']:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
320 # update msgid and recipients only if non-bcc have changed
2738
3a7039bc2f97 couple more msgid == None fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2737
diff changeset
321 if msgid is not None:
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
322 self.db.msg.set(msgid, recipients=recipients)
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
323 if sendto['plain'] or bcc_sendto['plain']:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
324 self.send_message(issueid, msgid, note, sendto['plain'],
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
325 from_address, bcc_sendto['plain'])
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
326 if sendto['crypt'] or bcc_sendto['crypt']:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
327 self.send_message(issueid, msgid, note, sendto['crypt'],
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
328 from_address, bcc_sendto['crypt'], crypt=True)
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
329
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
330 # backwards compatibility - don't remove
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
331 sendmessage = nosymessage
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
332
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
333 def encrypt_to(self, message, sendto):
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
334 """ Encrypt given message to sendto receivers.
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
335 Returns a new RFC 3156 conforming message.
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
336 """
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
337 plain = pyme.core.Data(message.as_string())
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
338 cipher = pyme.core.Data()
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
339 ctx = pyme.core.Context()
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
340 ctx.set_armor(1)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
341 keys = []
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
342 for adr in sendto:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
343 ctx.op_keylist_start(adr, 0)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
344 # only first key per email
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
345 k = ctx.op_keylist_next()
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
346 if k is not None:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
347 keys.append(k)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
348 else:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
349 msg = _('No key for "%(adr)s" in keyring')%locals()
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
350 raise MessageSendError, msg
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
351 ctx.op_keylist_end()
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
352 ctx.op_encrypt(keys, 1, plain, cipher)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
353 cipher.seek(0,0)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
354 msg = MIMEMultipart('encrypted', boundary=None, _subparts=None,
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
355 protocol="application/pgp-encrypted")
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
356 part = MIMEBase('application', 'pgp-encrypted')
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
357 part.set_payload("Version: 1\r\n")
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
358 msg.attach(part)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
359 part = MIMEBase('application', 'octet-stream')
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
360 part.set_payload(cipher.read())
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
361 msg.attach(part)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
362 return msg
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
363
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
364 def send_message(self, issueid, msgid, note, sendto, from_address=None,
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
365 bcc_sendto=[], crypt=False):
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
366 '''Actually send the nominated message from this issue to the sendto
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
367 recipients, with the note appended.
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
368 '''
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
369 users = self.db.user
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
370 messages = self.db.msg
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
371 files = self.db.file
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
372
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
373 if msgid is None:
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
374 inreplyto = None
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
375 messageid = None
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
376 else:
2765
3468f74bd7ce fix copy/paste error made in r1.114
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2738
diff changeset
377 inreplyto = messages.get(msgid, 'inreplyto')
3468f74bd7ce fix copy/paste error made in r1.114
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2738
diff changeset
378 messageid = messages.get(msgid, 'messageid')
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
379
1927
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
380 # make up a messageid if there isn't one (web edit)
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
381 if not messageid:
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
382 # this is an old message that didn't get a messageid, so
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
383 # create one
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
384 messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(),
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
385 self.classname, issueid,
1927
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
386 self.db.config.MAIL_DOMAIN)
2569
eca3383a27a6 fix messageid generated when msgid is None for send_message [SF#987933]
Richard Jones <richard@users.sourceforge.net>
parents: 2545
diff changeset
387 if msgid is not None:
eca3383a27a6 fix messageid generated when msgid is None for send_message [SF#987933]
Richard Jones <richard@users.sourceforge.net>
parents: 2545
diff changeset
388 messages.set(msgid, messageid=messageid)
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
389
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
390 # compose title
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
391 cn = self.classname
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
392 title = self.get(issueid, 'title') or '%s message copy'%cn
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
393
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
394 # figure author information
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
395 if msgid:
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
396 authid = messages.get(msgid, 'author')
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
397 else:
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
398 authid = self.db.getuid()
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
399 authname = users.get(authid, 'realname')
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
400 if not authname:
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
401 authname = users.get(authid, 'username', '')
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
402 authaddr = users.get(authid, 'address', '')
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
403
3877
83748b2de465 Make addition of line about new submission/comment at top of each message...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3790
diff changeset
404 if authaddr and self.db.config.MAIL_ADD_AUTHOREMAIL:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
405 authaddr = " <%s>" % formataddr( ('',authaddr) )
3877
83748b2de465 Make addition of line about new submission/comment at top of each message...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3790
diff changeset
406 elif authaddr:
83748b2de465 Make addition of line about new submission/comment at top of each message...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3790
diff changeset
407 authaddr = ""
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
408
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
409 # make the message body
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
410 m = ['']
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
412 # put in roundup's signature
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 509
diff changeset
413 if self.db.config.EMAIL_SIGNATURE_POSITION == 'top':
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
414 m.append(self.email_signature(issueid, msgid))
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
415
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
416 # add author information
3877
83748b2de465 Make addition of line about new submission/comment at top of each message...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3790
diff changeset
417 if authid and self.db.config.MAIL_ADD_AUTHORINFO:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
418 if msgid and len(self.get(issueid, 'messages')) == 1:
3599
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
419 m.append(_("New submission from %(authname)s%(authaddr)s:")
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
420 % locals())
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
421 elif msgid:
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3599
diff changeset
422 m.append(_("%(authname)s%(authaddr)s added the comment:")
3599
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
423 % locals())
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
424 else:
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
425 m.append(_("Change by %(authname)s%(authaddr)s:") % locals())
3877
83748b2de465 Make addition of line about new submission/comment at top of each message...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3790
diff changeset
426 m.append('')
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
427
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
428 # add the content
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
429 if msgid is not None:
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
430 m.append(messages.get(msgid, 'content', ''))
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
431
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
432 # get the files for this message
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
433 message_files = []
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
434 if msgid :
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
435 for fileid in messages.get(msgid, 'files') :
3941
9997b941dd6d remove some metakit references
Richard Jones <richard@users.sourceforge.net>
parents: 3939
diff changeset
436 # check the attachment size
4347
0e33bf5571dc make some more memorydb tests pass
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
437 filesize = self.db.filesize('file', fileid, None)
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
438 if filesize <= self.db.config.NOSY_MAX_ATTACHMENT_SIZE:
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
439 message_files.append(fileid)
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
440 else:
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
441 base = self.db.config.TRACKER_WEB
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
442 link = "".join((base, files.classname, fileid))
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
443 filename = files.get(fileid, 'name')
3886
5c4a039aa465 .send_message: fix translation for the "file not attached" message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3882
diff changeset
444 m.append(_("File '%(filename)s' not attached - "
5c4a039aa465 .send_message: fix translation for the "file not attached" message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3882
diff changeset
445 "you can download it from %(link)s.") % locals())
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
446
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
447 # add the change note
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
448 if note:
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
449 m.append(note)
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
450
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
451 # put in roundup's signature
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 509
diff changeset
452 if self.db.config.EMAIL_SIGNATURE_POSITION == 'bottom':
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
453 m.append(self.email_signature(issueid, msgid))
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
454
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
455 # figure the encoding
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
456 charset = getattr(self.db.config, 'EMAIL_CHARSET', 'utf-8')
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
457
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
458 # construct the content and convert to unicode object
4225
7baf1925c4c1 fix construction of individual messages to nosy recipents with attachments
Richard Jones <richard@users.sourceforge.net>
parents: 4214
diff changeset
459 body = unicode('\n'.join(m), 'utf-8').encode(charset)
665
9382ad731c1c All messages sent to the nosy list are now encoded as quoted-printable.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 647
diff changeset
460
718
e10c37f53efd fixed SCRIPT_NAME in ZRoundup for instances not at top level of Zope
Richard Jones <richard@users.sourceforge.net>
parents: 685
diff changeset
461 # make sure the To line is always the same (for testing mostly)
e10c37f53efd fixed SCRIPT_NAME in ZRoundup for instances not at top level of Zope
Richard Jones <richard@users.sourceforge.net>
parents: 685
diff changeset
462 sendto.sort()
e10c37f53efd fixed SCRIPT_NAME in ZRoundup for instances not at top level of Zope
Richard Jones <richard@users.sourceforge.net>
parents: 685
diff changeset
463
1360
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
464 # make sure we have a from address
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
465 if from_address is None:
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
466 from_address = self.db.config.TRACKER_EMAIL
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
467
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
468 # additional bit for after the From: "name"
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
469 from_tag = getattr(self.db.config, 'EMAIL_FROM_TAG', '')
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
470 if from_tag:
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
471 from_tag = ' ' + from_tag
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
472
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
473 subject = '[%s%s] %s'%(cn, issueid, title)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
474 author = (authname + from_tag, from_address)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
475
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
476 # send an individual message per recipient?
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
477 if self.db.config.NOSY_EMAIL_SENDING != 'single':
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
478 sendto = [[address] for address in sendto]
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
479 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
480 sendto = [sendto]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
481
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
482 # tracker sender info
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
483 tracker_name = unicode(self.db.config.TRACKER_NAME, 'utf-8')
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
484 tracker_name = nice_sender_header(tracker_name, from_address,
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
485 charset)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
486
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
487 # now send one or more messages
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
488 # TODO: I believe we have to create a new message each time as we
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
489 # can't fiddle the recipients in the message ... worth testing
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
490 # and/or fixing some day
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
491 first = True
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
492 for sendto in sendto:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
493 # create the message
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
494 mailer = Mailer(self.db.config)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
495
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4497
diff changeset
496 message = mailer.get_standard_message(multipart=message_files)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
497
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
498 # set reply-to to the tracker
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
499 message['Reply-To'] = tracker_name
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
500
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
501 # message ids
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
502 if messageid:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
503 message['Message-Id'] = messageid
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
504 if inreplyto:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
505 message['In-Reply-To'] = inreplyto
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
506
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
507 # Generate a header for each link or multilink to
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
508 # a class that has a name attribute
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
509 for propname, prop in self.getprops().items():
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
510 if not isinstance(prop, (hyperdb.Link, hyperdb.Multilink)):
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
511 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
512 cl = self.db.getclass(prop.classname)
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
513 if not 'name' in cl.getprops():
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
514 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
515 if isinstance(prop, hyperdb.Link):
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
516 value = self.get(issueid, propname)
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
517 if value is None:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
518 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
519 values = [value]
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
520 else:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
521 values = self.get(issueid, propname)
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
522 if not values:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
523 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
524 values = [cl.get(v, 'name') for v in values]
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
525 values = ', '.join(values)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
526 header = "X-Roundup-%s-%s"%(self.classname, propname)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
527 try:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
528 message[header] = values.encode('ascii')
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
529 except UnicodeError:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
530 message[header] = Header(values, charset)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
531
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
532 if not inreplyto:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
533 # Default the reply to the first message
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
534 msgs = self.get(issueid, 'messages')
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
535 # Assume messages are sorted by increasing message number here
3986
68accc7d4b69 indexerror when there are no messages to the issue
Richard Jones <richard@users.sourceforge.net>
parents: 3958
diff changeset
536 # If the issue is just being created, and the submitter didn't
68accc7d4b69 indexerror when there are no messages to the issue
Richard Jones <richard@users.sourceforge.net>
parents: 3958
diff changeset
537 # provide a message, then msgs will be empty.
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
538 if msgs and msgs[0] != msgid:
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
539 inreplyto = messages.get(msgs[0], 'messageid')
3958
642201ee1d75 paranoia from Toby Dickenson
Richard Jones <richard@users.sourceforge.net>
parents: 3957
diff changeset
540 if inreplyto:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
541 message['In-Reply-To'] = inreplyto
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
542
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
543 # attach files
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
544 if message_files:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
545 # first up the text as a part
4225
7baf1925c4c1 fix construction of individual messages to nosy recipents with attachments
Richard Jones <richard@users.sourceforge.net>
parents: 4214
diff changeset
546 part = MIMEText(body)
4423
579802067547 Fix charset of first text-part of outgoing multipart messages...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4420
diff changeset
547 part.set_charset(charset)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
548 encode_quopri(part)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
549 message.attach(part)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
550
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
551 for fileid in message_files:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
552 name = files.get(fileid, 'name')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
553 mime_type = files.get(fileid, 'type')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
554 content = files.get(fileid, 'content')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
555 if mime_type == 'text/plain':
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
556 try:
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
557 content.decode('ascii')
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
558 except UnicodeError:
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
559 # the content cannot be 7bit-encoded.
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
560 # use quoted printable
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
561 # XXX stuffed if we know the charset though :(
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
562 part = MIMEText(content)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
563 encode_quopri(part)
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
564 else:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
565 part = MIMEText(content)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
566 part['Content-Transfer-Encoding'] = '7bit'
4424
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
567 elif mime_type == 'message/rfc822':
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
568 main, sub = mime_type.split('/')
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
569 p = FeedParser()
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
570 p.feed(content)
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
571 part = MIMEBase(main, sub)
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
572 part.set_payload([p.close()])
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
573 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
574 # some other type, so encode it
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
575 if not mime_type:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
576 # this should have been done when the file was saved
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
577 mime_type = mimetypes.guess_type(name)[0]
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
578 if mime_type is None:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
579 mime_type = 'application/octet-stream'
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
580 main, sub = mime_type.split('/')
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
581 part = MIMEBase(main, sub)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
582 part.set_payload(content)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
583 Encoders.encode_base64(part)
4424
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
584 cd = 'Content-Disposition'
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
585 part[cd] = 'attachment;\n filename="%s"'%name
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
586 message.attach(part)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
587
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
588 else:
4225
7baf1925c4c1 fix construction of individual messages to nosy recipents with attachments
Richard Jones <richard@users.sourceforge.net>
parents: 4214
diff changeset
589 message.set_payload(body)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
590 encode_quopri(message)
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
591
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
592 if crypt:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
593 send_msg = self.encrypt_to (message, sendto)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
594 else:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
595 send_msg = message
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
596 mailer.set_message_attributes(send_msg, sendto, subject, author)
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
597 send_msg ['Message-Id'] = message ['Message-Id']
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
598 send_msg ['Reply-To'] = message ['Reply-To']
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
599 if message.get ('In-Reply-To'):
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
600 send_msg ['In-Reply-To'] = message ['In-Reply-To']
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
601 mailer.smtp_send(sendto, send_msg.as_string())
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
602 if first:
4542
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
603 if crypt:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
604 # send individual bcc mails, otherwise receivers can
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
605 # deduce bcc recipients from keys in message
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
606 for bcc in bcc_sendto:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
607 send_msg = self.encrypt_to (message, [bcc])
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
608 send_msg ['Message-Id'] = message ['Message-Id']
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
609 send_msg ['Reply-To'] = message ['Reply-To']
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
610 if message.get ('In-Reply-To'):
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
611 send_msg ['In-Reply-To'] = message ['In-Reply-To']
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
612 mailer.smtp_send([bcc], send_msg.as_string())
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
613 elif bcc_sendto:
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
614 mailer.smtp_send(bcc_sendto, send_msg.as_string())
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
615 first = False
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
616
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
617 def email_signature(self, issueid, msgid):
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
618 ''' Add a signature to the e-mail with some useful information
188
1536be43d2fa Roundupdb now appends "mailing list" information to its messages...
Richard Jones <richard@users.sourceforge.net>
parents: 156
diff changeset
619 '''
769
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
620 # simplistic check to see if the url is valid,
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
621 # then append a trailing slash if it is missing
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
622 base = self.db.config.TRACKER_WEB
1250
deab62016de7 https URLs from config now recognised as valid [SF#619829]
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
623 if (not isinstance(base , type('')) or
1253
fe67477e678f fixes from changes today
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
624 not (base.startswith('http://') or base.startswith('https://'))):
2183
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
625 web = "Configuration Error: TRACKER_WEB isn't a " \
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
626 "fully-qualified URL"
2183
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
627 else:
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
628 if not base.endswith('/'):
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
629 base = base + '/'
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
630 web = base + self.classname + issueid
769
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
631
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
632 # ensure the email address is properly quoted
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
633 email = formataddr((self.db.config.TRACKER_NAME,
1096
fa7df238e2d4 More cleaning up of configuration, and the "instance" -> "tracker" renaming.
Richard Jones <richard@users.sourceforge.net>
parents: 1095
diff changeset
634 self.db.config.TRACKER_EMAIL))
769
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
635
1586
d1bab419f2a2 web url got longer
Richard Jones <richard@users.sourceforge.net>
parents: 1577
diff changeset
636 line = '_' * max(len(web)+2, len(email))
2095
7d886a79ab67 make sure email signature starts on a newline [SF#919759]
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
637 return '\n%s\n%s\n<%s>\n%s'%(line, email, web, line)
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
638
769
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
639
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
640 def generateCreateNote(self, issueid):
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
641 """Generate a create note that lists initial property values
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
642 """
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
643 cn = self.classname
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
644 cl = self.db.classes[cn]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
645 props = cl.getprops(protected=0)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
646
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
647 # list the values
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
648 m = []
3132
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
649 prop_items = props.items()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
650 prop_items.sort()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
651 for propname, prop in prop_items:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
652 value = cl.get(issueid, propname, None)
559
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
653 # skip boring entries
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
654 if not value:
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
655 continue
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
656 if isinstance(prop, hyperdb.Link):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
657 link = self.db.classes[prop.classname]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
658 if value:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
659 key = link.labelprop(default_to_id=1)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
660 if key:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
661 value = link.get(value, key)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
662 else:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
663 value = ''
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
664 elif isinstance(prop, hyperdb.Multilink):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
665 if value is None: value = []
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
666 l = []
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
667 link = self.db.classes[prop.classname]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
668 key = link.labelprop(default_to_id=1)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
669 if key:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
670 value = [link.get(entry, key) for entry in value]
718
e10c37f53efd fixed SCRIPT_NAME in ZRoundup for instances not at top level of Zope
Richard Jones <richard@users.sourceforge.net>
parents: 685
diff changeset
671 value.sort()
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
672 value = ', '.join(value)
3740
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
673 else:
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
674 value = str(value)
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
675 if '\n' in value:
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
676 value = '\n'+self.indentChangeNoteValue(value)
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
677 m.append('%s: %s'%(propname, value))
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
678 m.insert(0, '----------')
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
679 m.insert(0, '')
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
680 return '\n'.join(m)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
681
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
682 def generateChangeNote(self, issueid, oldvalues):
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
683 """Generate a change note that lists property changes
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
684 """
2514
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
685 if not isinstance(oldvalues, type({})):
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
686 raise TypeError("'oldvalues' must be dict-like, not %s."%
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
687 type(oldvalues))
772
db5daf396518 Removed temporary workaround.
Derrick Hudson <dman13@users.sourceforge.net>
parents: 770
diff changeset
688
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
689 cn = self.classname
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
690 cl = self.db.classes[cn]
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
691 changed = {}
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
692 props = cl.getprops(protected=0)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
693
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
694 # determine what changed
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
695 for key in oldvalues.keys():
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1112
diff changeset
696 if key in ['files','messages']:
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1112
diff changeset
697 continue
2077
3e0961d6d44d Added the "actor" property.
Richard Jones <richard@users.sourceforge.net>
parents: 2073
diff changeset
698 if key in ('actor', 'activity', 'creator', 'creation'):
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1112
diff changeset
699 continue
1812
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
700 # not all keys from oldvalues might be available in database
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
701 # this happens when property was deleted
2514
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
702 try:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
703 new_value = cl.get(issueid, key)
1812
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
704 except KeyError:
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
705 continue
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
706 # the old value might be non existent
1812
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
707 # this happens when property was added
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
708 try:
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
709 old_value = oldvalues[key]
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
710 if type(new_value) is type([]):
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
711 new_value.sort()
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
712 old_value.sort()
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
713 if new_value != old_value:
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
714 changed[key] = old_value
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
715 except:
434
2441743e335b Removed generation of change note from "sendmessage" in roundupdb.py.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 428
diff changeset
716 changed[key] = new_value
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
717
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
718 # list the changes
440
de5bf4191f11 Enabled transaction support in the bsddb backend.
Richard Jones <richard@users.sourceforge.net>
parents: 439
diff changeset
719 m = []
3132
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
720 changed_items = changed.items()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
721 changed_items.sort()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
722 for propname, oldvalue in changed_items:
647
b3b483e0fd5e Fixed a couple of dodgy bits found by pychekcer.
Richard Jones <richard@users.sourceforge.net>
parents: 644
diff changeset
723 prop = props[propname]
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
724 value = cl.get(issueid, propname, None)
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
725 if isinstance(prop, hyperdb.Link):
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
726 link = self.db.classes[prop.classname]
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
727 key = link.labelprop(default_to_id=1)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
728 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
729 if value:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
730 value = link.get(value, key)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
731 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
732 value = ''
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
733 if oldvalue:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
734 oldvalue = link.get(oldvalue, key)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
735 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
736 oldvalue = ''
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
737 change = '%s -> %s'%(oldvalue, value)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
738 elif isinstance(prop, hyperdb.Multilink):
428
7956563d49ae Property changes are now completely traceable, whether changes are
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 425
diff changeset
739 change = ''
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
740 if value is None: value = []
434
2441743e335b Removed generation of change note from "sendmessage" in roundupdb.py.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 428
diff changeset
741 if oldvalue is None: oldvalue = []
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
742 l = []
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
743 link = self.db.classes[prop.classname]
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
744 key = link.labelprop(default_to_id=1)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
745 # check for additions
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
746 for entry in value:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
747 if entry in oldvalue: continue
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
748 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
749 l.append(link.get(entry, key))
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
750 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
751 l.append(entry)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
752 if l:
1095
711f2ecee20f unit tests pass again
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
753 l.sort()
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
754 change = '+%s'%(', '.join(l))
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
755 l = []
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
756 # check for removals
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
757 for entry in oldvalue:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
758 if entry in value: continue
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
759 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
760 l.append(link.get(entry, key))
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
761 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
762 l.append(entry)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
763 if l:
1095
711f2ecee20f unit tests pass again
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
764 l.sort()
428
7956563d49ae Property changes are now completely traceable, whether changes are
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 425
diff changeset
765 change += ' -%s'%(', '.join(l))
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
766 else:
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
767 change = '%s -> %s'%(oldvalue, value)
3740
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
768 if '\n' in change:
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
769 value = self.indentChangeNoteValue(str(value))
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
770 oldvalue = self.indentChangeNoteValue(str(oldvalue))
3790
9171e01ac932 use named variable slots in translation string
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3750
diff changeset
771 change = _('\nNow:\n%(new)s\nWas:\n%(old)s') % {
9171e01ac932 use named variable slots in translation string
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3750
diff changeset
772 "new": value, "old": oldvalue}
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
773 m.append('%s: %s'%(propname, change))
439
6e27cb83aacb only insert the -------- change note marker if there is a change note
Richard Jones <richard@users.sourceforge.net>
parents: 434
diff changeset
774 if m:
442
52b5f53d12f3 fixed the order of the blank line and '-------' line
Richard Jones <richard@users.sourceforge.net>
parents: 440
diff changeset
775 m.insert(0, '----------')
439
6e27cb83aacb only insert the -------- change note marker if there is a change note
Richard Jones <richard@users.sourceforge.net>
parents: 434
diff changeset
776 m.insert(0, '')
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
777 return '\n'.join(m)
188
1536be43d2fa Roundupdb now appends "mailing list" information to its messages...
Richard Jones <richard@users.sourceforge.net>
parents: 156
diff changeset
778
3740
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
779 def indentChangeNoteValue(self, text):
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
780 lines = text.rstrip('\n').split('\n')
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
781 lines = [ ' '+line for line in lines ]
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
782 return '\n'.join(lines)
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
783
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
784 # vim: set filetype=python sts=4 sw=4 et si :

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