annotate roundup/roundupdb.py @ 8543:1ffa1f42e1da

refactor: rework mime type comparison and clean code rest.py: accept application/* as match for application/json in non /binary_context rest path. allow defining default mime type to return when file/message is missing mime type. Make it a class variable to it can be changed from text/plain to text/markdown or whatever. extract code from determine_output_format() to create create_valid_content_types() method which returns a list of matching mime types for a given type/subtype. Eliminate mostly duplicate return statements by introducing a variable to specify valid mime types in error message. rest_common.py: Fix error messages that now return application/* as valid mime type. CHANGES.txt upgrading.txt rest.txt: top level notes and corrections. Also correct rst syntax on earlier change.
author John Rouillard <rouilj@ieee.org>
date Tue, 24 Mar 2026 21:30:47 -0400
parents 24549122f9b1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
2 # 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
3 # 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
4 # 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
5 # 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
6 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
7 # 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
8 # 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
9 # 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
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
12 # 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
13 # 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
14 # 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
15 # 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
16 # 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
17 #
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 393
diff changeset
18
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
19 """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
20 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
21 __docformat__ = 'restructuredtext'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
22
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
23 import base64
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
24 import logging
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
25 import mimetypes
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
26 import time
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
27
5422
a0ed8d5d744f Python 3 preparation: update email module names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5418
diff changeset
28 from email import encoders
a0ed8d5d744f Python 3 preparation: update email module names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5418
diff changeset
29 from email.header import Header
a0ed8d5d744f Python 3 preparation: update email module names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5418
diff changeset
30 from email.mime.base import MIMEBase
a0ed8d5d744f Python 3 preparation: update email module names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5418
diff changeset
31 from email.mime.multipart import MIMEMultipart
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
32 from email.mime.text import MIMEText
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
33 from email.parser import FeedParser
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
34 from email.utils import formataddr
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
35
5488
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5473
diff changeset
36 import roundup.anypy.random_ as random_
5416
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
37
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
38 from roundup import date, hyperdb, password
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
39 from roundup.anypy.strings import b2s, s2u
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
40 from roundup.hyperdb import iter_roles
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
41 from roundup.i18n import _, RoundupNullTranslations
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
42 from roundup.mailer import Mailer, MessageSendError, nice_sender_header
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
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:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
45 import gpg, gpg.core # noqa: E401
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
46 except ImportError:
5494
b7fa56ced601 use gpg module instead of pyme module for PGP encryption
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5493
diff changeset
47 gpg = 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
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
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6008
diff changeset
50 class Database(object):
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
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
57
6658
408fd477761f Add i18n object to roundupdb.Database
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6426
diff changeset
58 def __init__(self):
408fd477761f Add i18n object to roundupdb.Database
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6426
diff changeset
59 self.i18n = RoundupNullTranslations()
408fd477761f Add i18n object to roundupdb.Database
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6426
diff changeset
60
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 def getuid(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 """Return the id of the "user" node associated with the user
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 that owns this connection to the hyperdatabase."""
1800
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
64 if self.journaltag is None:
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
65 return None
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
66 elif self.journaltag == 'admin':
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
67 # 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
68 return '1'
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
69 else:
2735
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
70 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
71 self.journaltag):
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
72 uid = self.user.lookup(self.journaltag)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
73 self.journal_uid = (self.journaltag, uid)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
74 return self.journal_uid[1]
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75
2906
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
76 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
77 """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
78 activities.
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
79 """
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
80 self.journaltag = username
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
81
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
82 def isCurrentUser(self, username):
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
83 """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
84 """
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
85 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
86
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
87 def getUserTimezone(self):
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
88 """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
89 If no such property exists return 0
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
90 """
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
91 userid = self.getuid()
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
92 timezone = None
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
93 try:
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
94 tz = self.user.get(userid, 'timezone')
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
95 date.get_timezone(tz)
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
96 timezone = tz
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
97 except KeyError:
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
98 pass
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
99 # 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
100 # 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
101 # the timezone set in the tracker config.
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
102 if timezone is None:
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
103 timezone = self.config['TIMEZONE']
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
104 return timezone
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
105
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
106 def confirm_registration(self, otk):
2089
93f03c6714d8 A few big changes in this commit:
Richard Jones <richard@users.sourceforge.net>
parents: 2077
diff changeset
107 props = self.getOTKManager().getall(otk)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
108 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
109 value = props.get(propname, None)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
110 if value is None:
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
111 pass
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
112 elif isinstance(proptype, hyperdb.Date):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
113 props[propname] = date.Date(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
114 elif isinstance(proptype, hyperdb.Interval):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
115 props[propname] = date.Interval(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
116 elif isinstance(proptype, hyperdb.Password):
7211
506c86823abb Add config argument to more password.Password invocations.
John Rouillard <rouilj@ieee.org>
parents: 6962
diff changeset
117 props[propname] = password.Password(encrypted=value,
506c86823abb Add config argument to more password.Password invocations.
John Rouillard <rouilj@ieee.org>
parents: 6962
diff changeset
118 config=self.config)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
119
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
120 # tag new user creation with 'admin'
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
121 self.journaltag = 'admin'
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
122
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
123 # create the new user
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
124 cl = self.user
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
125
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
126 props['roles'] = self.config.NEW_WEB_USER_ROLES
5976
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
127 try:
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
128 # ASSUME:: ValueError raised during create due to key value
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
129 # conflict. I an use message in exception to determine
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
130 # when I should intercept the exception with a more
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
131 # friendly error message. If i18n is used to translate
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
132 # original exception message this will fail and translated
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
133 # text (probably unfriendly) will be used.
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
134 userid = cl.create(**props)
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
135 except ValueError as e:
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
136 username = props['username']
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
137 # Try to make error message less cryptic to the user.
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
138 if str(e) == 'node with key "%s" exists' % username:
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
139 raise ValueError(
7750
216662fbaaee fix(i18n): fix incorrect lookup of some translations
John Rouillard <rouilj@ieee.org>
parents: 7575
diff changeset
140 _("Username '%s' already exists.") % username)
5976
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
141 else:
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
142 raise
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
143
71c68961d9f4 - issue2550920 - Optionally detect duplicate username at registration.
John Rouillard <rouilj@ieee.org>
parents: 5970
diff changeset
144 # 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
145 self.getOTKManager().destroy(otk)
5319
62de601bdf6f Fix commits although a Reject exception is raised
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5312
diff changeset
146 # commit cl.create (and otk changes)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
147 self.commit()
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
148
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
149 return userid
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
150
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
151 def log_debug(self, msg, *args, **kwargs):
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
152 """Log a message with level DEBUG."""
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
153
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
154 logger = self.get_logger()
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
155 logger.debug(msg, *args, **kwargs)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
156
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
157 def log_info(self, msg, *args, **kwargs):
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
158 """Log a message with level INFO."""
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
159
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
160 logger = self.get_logger()
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
161 logger.info(msg, *args, **kwargs)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
162
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
163 def get_logger(self):
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
164 """Return the logger for this database."""
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
165
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
166 # Because getting a logger requires acquiring a lock, we want
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
167 # to do it only once.
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
168 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
169 self.__logger = logging.getLogger('roundup.hyperdb')
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
170
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
171 return self.__logger
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
172
4652
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
173 def clearCache(self):
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
174 """ Backends may keep a cache.
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
175 It must be cleared at end of commit and rollback methods.
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
176 We allow to register user-defined cache-clearing routines
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
177 that are called by this routine.
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
178 """
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
179 if getattr(self, 'cache_callbacks', None):
4652
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
180 for method, param in self.cache_callbacks:
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
181 method(param)
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
182
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
183 def registerClearCacheCallback(self, method, param=None):
4652
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
184 """ Register a callback method for clearing the cache.
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
185 It is called with the given param as the only parameter.
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
186 Even if the parameter is not specified, the method has to
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
187 accept a single parameter.
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
188 """
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
189 if not getattr(self, 'cache_callbacks', None):
4652
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
190 self.cache_callbacks = []
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
191 self.cache_callbacks.append((method, param))
4652
dfbc0cfa9811 Add an interface to register clearCache callbacks in roundupdb.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4547
diff changeset
192
4059
ef0b4396888a Enhance and simplify logging.
Stefan Seefeld <stefan@seefeld.name>
parents: 3986
diff changeset
193
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
194 class DetectorError(RuntimeError):
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
195 """ 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
196 """
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
197 pass
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
198
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
199
8304
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
200 # deviation from spec - was called ItemClass
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
201 class IssueClass:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
202 """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
203 implementation. The backend should provide a mechanism that
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
204 enforces the title, messages, files, nosy and superseder
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
205 properties:
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
206
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
207 - title = hyperdb.String(indexme='yes')
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
208 - messages = hyperdb.Multilink("msg")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
209 - files = hyperdb.Multilink("file")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
210 - nosy = hyperdb.Multilink("user")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
211 - 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
212 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
214 # 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
215 # 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
216 # marked for message extraction tool.
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
217 #
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
218 # 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
219 #
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
220 # 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
221 # defined in the classic template:
3904
91008ec8f9a0 retire "topic" usage
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3892
diff changeset
222 # assignedto, keyword, priority, status.
2545
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
223 (
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
224 ''"title", ''"messages", ''"files", ''"nosy", ''"superseder",
3904
91008ec8f9a0 retire "topic" usage
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3892
diff changeset
225 ''"assignedto", ''"keyword", ''"priority", ''"status",
2545
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
226 # following properties are common for all hyperdb classes
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
227 # 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
228 ''"actor", ''"activity", ''"creator", ''"creation",
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
229 )
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
230
8304
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
231 def _update_properties(self, classname, properties):
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
232 """The newly-created class automatically includes the "messages",
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
233 "files", "nosy", and "superseder" properties. If the 'properties'
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
234 dictionary attempts to specify any of these properties or a
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
235 "creation", "creator", "activity" or "actor" property, a ValueError
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
236 is raised. This method must be called by __init__.
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
237
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
238 """
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
239 if 'title' not in properties:
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
240 properties['title'] = hyperdb.String(indexme='yes')
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
241 if 'messages' not in properties:
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
242 properties['messages'] = hyperdb.Multilink("msg")
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
243 if 'files' not in properties:
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
244 properties['files'] = hyperdb.Multilink("file")
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
245 if 'nosy' not in properties:
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
246 # note: journalling is turned off as it really just wastes
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
247 # space. this behaviour may be overridden in an instance
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
248 properties['nosy'] = hyperdb.Multilink("user", do_journal="no")
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
249 if 'superseder' not in properties:
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
250 properties['superseder'] = hyperdb.Multilink(classname)
24549122f9b1 Factor common code to hyperdb/roundupdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 7750
diff changeset
251
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 # New methods:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
253 def addmessage(self, issueid, summary, text):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 """Add a message to an issue's mail spool.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 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
257 owns the database connection as the author, and the specified summary
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 text.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 The "files" and "recipients" fields are left empty.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 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
263 appended to the "messages" field of the specified issue.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 """
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
266 def nosymessage(self, issueid, msgid, oldvalues, whichnosy='nosy',
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
267 from_address=None, cc=None, bcc=None,
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
268 cc_emails=None,
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
269 bcc_emails=None, subject=None,
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
270 note_filter=None, add_headers=None):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 """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
272
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 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
274 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
275
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 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
277
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
278 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
279 list, and it's called a 'System Message'.
2228
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
280
5081
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
281 The "subject" argument is used as subject for the message. If no
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
282 subject is passed, a subject will be generated from the message.
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
283 Note the subject does not include the item designator [classID]
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
284 prefix that allows proper processing of reply emails. The caller
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
285 needs to include that label in the subject if needed.
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
286
2228
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
287 The "cc" argument indicates additional recipients to send the
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
288 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
289 list.
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
290
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
291 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
292 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
293 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
294 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
295 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
296 protected (using appropriate permissions), otherwise the bcc
5081
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
297 will be deduceable 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
298
29576edb45d5 Allow to specify additional cc and bcc emails (not roundup users)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4480
diff changeset
299 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
300 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
301 this can be useful for sending to additional email addresses
5081
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
302 which are not roundup users. These arguments are currently not
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
303 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
304 (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
305
46239c21a1eb Sending of PGP-Encrypted mail to all users or selected users (via roles)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4541
diff changeset
306 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
307 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
308 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
309 *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
310 fail if not all the keys are available in roundups keyring.
5675
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
311
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
312 If note_filter is specified it is a function with this
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
313 prototype:
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
314 note_filter(original_note, issueid, newvalues, oldvalues)
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
315 If called, note_filter returns the new value for the message body.
5970
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
316
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
317 The add_headers parameter allows to set additional headers for
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
318 the outgoing email.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
319 """
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
320
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
321 if cc is None: cc = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
322 if bcc is None: bcc = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
323 if cc_emails is None: cc_emails = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
324 if bcc_emails is None: bcc_emails = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
325 if add_headers is None: add_headers = {} # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
326
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
327 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
328 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
329 if msgid:
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
330 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
331 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
332 else:
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
333 # "system message"
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
334 authid = None
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
335 recipients = []
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
336
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
337 sendto = dict(plain=[], crypt=[])
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
338 bcc_sendto = dict(plain=[], crypt=[])
1949
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
339 seen_message = {}
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
340 for recipient in recipients:
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
341 seen_message[recipient] = 1
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
342
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
343 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
344 """ 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
345 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
346 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
347 ciphered = encrypt and (not pgproles or
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
348 self.db.user.has_role(
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
349 userid, *iter_roles(pgproles)))
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
350 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
351 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
352 recipients.append(userid)
2073
261c2e6ceb1e *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
353
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
354 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
355 """ 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
356 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
357 Also check permissions on the message if not a system
4290
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4289
diff changeset
358 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
359 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
360 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
361 """
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
362 allowed = True
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
363 if msgid:
7275e3dec0e0 Fix security-problem: If user hasn't permission on a message...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4225
diff changeset
364 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
365 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
366 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
367 '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
368 return (userid and
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
369 (self.db.user.get(userid, 'username') != 'anonymous') and
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
370 allowed and userid not in seen_message)
2073
261c2e6ceb1e *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
371
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
372 # 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
373 # 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
374 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
375 (self.db.config.MESSAGES_TO_AUTHOR == 'yes' or
4547
d9d7319afffa Add config-option "nosy" to messages_to_author setting in [nosy] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4542
diff changeset
376 (self.db.config.MESSAGES_TO_AUTHOR == 'new' and not oldvalues) or
d9d7319afffa Add config-option "nosy" to messages_to_author setting in [nosy] section...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4542
diff changeset
377 (self.db.config.MESSAGES_TO_AUTHOR == 'nosy' and authid in
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
378 self.get(issueid, whichnosy)))):
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
379 add_recipient(authid, sendto)
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
380
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
381 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
382 seen_message[authid] = 1
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
383
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
384 # 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
385 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
386 if good_recipient(userid):
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
387 add_recipient(userid, sendto)
5312
a4fe76fba54a issue2550957: Duplicate emails (with patch).
John Rouillard <rouilj@ieee.org>
parents: 5224
diff changeset
388 seen_message[userid] = 1
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
389 if encrypt and not pgproles:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
390 sendto['crypt'].extend(cc_emails)
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
391 else:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
392 sendto['plain'].extend(cc_emails)
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
393
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
394 # now deal with bcc people.
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
395 for userid in bcc:
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
396 if good_recipient(userid):
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
397 add_recipient(userid, bcc_sendto)
5312
a4fe76fba54a issue2550957: Duplicate emails (with patch).
John Rouillard <rouilj@ieee.org>
parents: 5224
diff changeset
398 seen_message[userid] = 1
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
399 if encrypt and not pgproles:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
400 bcc_sendto['crypt'].extend(bcc_emails)
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
401 else:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
402 bcc_sendto['plain'].extend(bcc_emails)
337
8cd545738d8e Features:
Richard Jones <richard@users.sourceforge.net>
parents: 318
diff changeset
403
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
404 if oldvalues:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
405 note = self.generateChangeNote(issueid, oldvalues)
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
406 else:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
407 note = self.generateCreateNote(issueid)
5675
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
408 if note_filter:
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
409 cn = self.classname
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
410 cl = self.db.classes[cn]
f3d68c1bb96e issue2551018 add new nosy_filter parameter to nosymessage. Function
John Rouillard <rouilj@ieee.org>
parents: 5494
diff changeset
411 note = note_filter(note, issueid, self.db, cl, oldvalues)
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
412
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
413 # 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
414 # 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
415 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
416 # 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
417 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
418 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
419 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
420 self.send_message(issueid, msgid, note, sendto['plain'],
5970
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
421 from_address, bcc_sendto['plain'],
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
422 subject, add_headers=add_headers)
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
423 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
424 self.send_message(issueid, msgid, note, sendto['crypt'],
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
425 from_address, bcc_sendto['crypt'], subject,
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
426 crypt=True, add_headers=add_headers)
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
427
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
428 # backwards compatibility - don't remove
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
429 sendmessage = nosymessage
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
430
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
431 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
432 """ 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
433 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
434 """
5494
b7fa56ced601 use gpg module instead of pyme module for PGP encryption
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5493
diff changeset
435 plain = gpg.core.Data(message.as_string())
b7fa56ced601 use gpg module instead of pyme module for PGP encryption
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5493
diff changeset
436 cipher = gpg.core.Data()
b7fa56ced601 use gpg module instead of pyme module for PGP encryption
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5493
diff changeset
437 ctx = gpg.core.Context()
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
438 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
439 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
440 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
441 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
442 # 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
443 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
444 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
445 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
446 else:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
447 msg = _('No key for "%(adr)s" in keyring') % locals()
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
448 raise MessageSendError(msg)
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
449 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
450 ctx.op_encrypt(keys, 1, plain, cipher)
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
451 cipher.seek(0, 0)
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
452 msg = MIMEMultipart('encrypted', boundary=None, _subparts=None,
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
453 protocol="application/pgp-encrypted")
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
454 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
455 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
456 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
457 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
458 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
459 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
460 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
461
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
462 def send_message(self, issueid, msgid, note, sendto, from_address=None,
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
463 bcc_sendto=None, subject=None, crypt=False,
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
464 add_headers=None, authid=None):
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
465 '''Actually send the nominated message from this issue to the sendto
5970
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
466 recipients, with the note appended. It's possible to add
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
467 headers to the message with the add_headers variable.
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
468 '''
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
469
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
470 if bcc_sendto is None: bcc_sendto = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
471 if add_headers is None: add_headers = {} # noqa: E701
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
472 users = self.db.user
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
473 messages = self.db.msg
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
474 files = self.db.file
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
475
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
476 if msgid is None:
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
477 inreplyto = None
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
478 messageid = None
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
479 else:
2765
3468f74bd7ce fix copy/paste error made in r1.114
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2738
diff changeset
480 inreplyto = messages.get(msgid, 'inreplyto')
3468f74bd7ce fix copy/paste error made in r1.114
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2738
diff changeset
481 messageid = messages.get(msgid, 'messageid')
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
482
1927
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
483 # 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
484 if not messageid:
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
485 # 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
486 # create one
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
487 messageid = "<%s.%s.%s%s@%s>" % (
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
488 time.time(),
5488
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5473
diff changeset
489 b2s(base64.b32encode(random_.token_bytes(10))),
52cb53eedf77 reworked random number use
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5473
diff changeset
490 self.classname, issueid, 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
491 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
492 messages.set(msgid, messageid=messageid)
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
493
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
494 # compose title
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
495 cn = self.classname
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
496 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
497
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
498 # figure author information
6425
443f80297ac1 send_message allows setting message sender via authid.
John Rouillard <rouilj@ieee.org>
parents: 6148
diff changeset
499 if authid:
443f80297ac1 send_message allows setting message sender via authid.
John Rouillard <rouilj@ieee.org>
parents: 6148
diff changeset
500 pass
443f80297ac1 send_message allows setting message sender via authid.
John Rouillard <rouilj@ieee.org>
parents: 6148
diff changeset
501 elif msgid:
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
502 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
503 else:
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
504 authid = self.db.getuid()
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
505 authname = users.get(authid, 'realname')
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
506 if not authname:
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
507 authname = users.get(authid, 'username', '')
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
508 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
509
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
510 if authaddr and self.db.config.MAIL_ADD_AUTHOREMAIL:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
511 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
512 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
513 authaddr = ""
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
514
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
515 # make the message body
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
516 m = ['']
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
517
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
518 # put in roundup's signature
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 509
diff changeset
519 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
520 m.append(self.email_signature(issueid, msgid))
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
521
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
522 # 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
523 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
524 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
525 m.append(_("New submission from %(authname)s%(authaddr)s:")
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
526 % locals())
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
527 elif msgid:
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3599
diff changeset
528 m.append(_("%(authname)s%(authaddr)s added the comment:")
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
529 % locals())
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
530 else:
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
531 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
532 m.append('')
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
533
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
534 # add the content
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
535 if msgid is not None:
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
536 m.append(messages.get(msgid, 'content', ''))
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
537
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
538 # 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
539 message_files = []
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
540 if msgid:
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
541 for fileid in messages.get(msgid, 'files'):
3941
9997b941dd6d remove some metakit references
Richard Jones <richard@users.sourceforge.net>
parents: 3939
diff changeset
542 # check the attachment size
4347
0e33bf5571dc make some more memorydb tests pass
Richard Jones <richard@users.sourceforge.net>
parents: 4338
diff changeset
543 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
544 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
545 message_files.append(fileid)
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
546 else:
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
547 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
548 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
549 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
550 m.append(_("File '%(filename)s' not attached - "
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
551 "you can download it from %(link)s.") %
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
552 locals())
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
553
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
554 # add the change note
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
555 if note:
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
556 m.append(note)
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
557
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
558 # put in roundup's signature
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 509
diff changeset
559 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
560 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
561
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
562 # figure the encoding
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
563 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
564
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
565 # construct the content and convert to unicode object
5473
3afda04c96a1 mailer string encoding fixes
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5422
diff changeset
566 body = s2u('\n'.join(m))
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
567
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
568 # 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
569 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
570
1360
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
571 # 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
572 if from_address is None:
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
573 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
574
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
575 # 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
576 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
577 if from_tag:
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
578 from_tag = ' ' + from_tag
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
579
5081
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
580 if subject is None:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
581 subject = '[%s%s] %s' % (cn, issueid, title)
5081
786f0581bc90 issue2109308 add subject argument to nosymessage. Initial patch Frank Niessink. Test and application with slight mods by rouilj
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
582
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
583 author = (authname + from_tag, from_address)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
584
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
585 # 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
586 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
587 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
588 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
589 sendto = [sendto]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
590
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
591 # tracker sender info
5416
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
592 tracker_name = s2u(self.db.config.TRACKER_NAME)
4338
94ee533613ac Attempt to generate more human-readable addresses in email
Richard Jones <richard@users.sourceforge.net>
parents: 4290
diff changeset
593 tracker_name = nice_sender_header(tracker_name, from_address,
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
594 charset)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
595
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
596 # 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
597 # 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
598 # 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
599 # and/or fixing some day
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
600 first = True
7575
2b0089104f08 flake8: rename loop variable in 'for sendto in sendto:'
John Rouillard <rouilj@ieee.org>
parents: 7211
diff changeset
601 for to_addr in sendto:
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
602 # create the message
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
603 mailer = Mailer(self.db.config)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
604
4541
62239a524beb PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4497
diff changeset
605 message = mailer.get_standard_message(multipart=message_files)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
606
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
607 # set reply-to as requested by config option
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
608 # TRACKER_REPLYTO_ADDRESS
5098
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
609 replyto_config = self.db.config.TRACKER_REPLYTO_ADDRESS
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
610 if replyto_config:
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
611 if replyto_config == "AUTHOR":
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
612 # note that authaddr at this point is already
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
613 # surrounded by < >, so get the original address
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
614 # from the db as nice_send_header adds < >
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
615 replyto_addr = nice_sender_header(
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
616 authname,
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
617 users.get(authid, 'address', ''),
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
618 charset)
5098
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
619 else:
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
620 replyto_addr = replyto_config
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
621 else:
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
622 replyto_addr = tracker_name
99e289359798 issue2550803: Replying to NOSY mail goes to the tracker through
John Rouillard <rouilj@ieee.org>
parents: 5081
diff changeset
623 message['Reply-To'] = replyto_addr
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
624
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
625 # message ids
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
626 if messageid:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
627 message['Message-Id'] = messageid
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
628 if inreplyto:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
629 message['In-Reply-To'] = inreplyto
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
630
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
631 # 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
632 # a class that has a name attribute
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
633 for propname, prop in self.getprops().items():
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
634 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
635 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
636 cl = self.db.getclass(prop.classname)
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
637 label = None
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
638 if 'name' in cl.getprops():
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
639 label = 'name'
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
640 if prop.msg_header_property in cl.getprops():
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
641 label = prop.msg_header_property
5124
a927f9549af0 Fix issue2550751: Email Header Issue.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
642 if prop.msg_header_property == "":
a927f9549af0 Fix issue2550751: Email Header Issue.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
643 # if msg_header_property is set to empty string
a927f9549af0 Fix issue2550751: Email Header Issue.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
644 # suppress the header entirely. You can't use
a927f9549af0 Fix issue2550751: Email Header Issue.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
645 # 'msg_header_property == None'. None is the
a927f9549af0 Fix issue2550751: Email Header Issue.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
646 # default value.
a927f9549af0 Fix issue2550751: Email Header Issue.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
647 label = None
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
648 if not label:
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
649 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
650 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
651 value = self.get(issueid, propname)
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
652 if value is None:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
653 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
654 values = [value]
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
655 else:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
656 values = self.get(issueid, propname)
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
657 if not values:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
658 continue
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4983
diff changeset
659 values = [cl.get(v, label) for v in values]
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
660 values = ', '.join(values)
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
661 header = "X-Roundup-%s-%s" % (self.classname, propname)
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
662 try:
5473
3afda04c96a1 mailer string encoding fixes
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5422
diff changeset
663 values.encode('ascii')
3afda04c96a1 mailer string encoding fixes
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5422
diff changeset
664 message[header] = values
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
665 except UnicodeError:
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
666 message[header] = Header(values, charset)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
667
5750
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
668 # Add header for main id number to make filtering
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
669 # email easier than extracting from subject line.
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
670 header = "X-Roundup-%s-Id" % (self.classname)
5750
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
671 values = issueid
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
672 try:
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
673 values.encode('ascii')
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
674 message[header] = values
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
675 except UnicodeError:
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
676 message[header] = Header(values, charset)
5970
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
677 # Generate additional headers
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
678 for k in add_headers:
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
679 v = add_headers[k]
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
680 try:
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
681 v.encode('ascii')
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
682 message[k] = v
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
683 except UnicodeError:
11a9c5b2efd4 Additional headers for nosymessage
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5750
diff changeset
684 message[k] = Header(v, charset)
5750
2c0f89edabe1 issue2551043: Add X-Roundup-issue-id email header.
John Rouillard <rouilj@ieee.org>
parents: 5675
diff changeset
685
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
686 if not inreplyto:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
687 # 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
688 msgs = self.get(issueid, 'messages')
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
689 # 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
690 # 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
691 # 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
692 if msgs and msgs[0] != msgid:
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
693 inreplyto = messages.get(msgs[0], 'messageid')
3958
642201ee1d75 paranoia from Toby Dickenson
Richard Jones <richard@users.sourceforge.net>
parents: 3957
diff changeset
694 if inreplyto:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
695 message['In-Reply-To'] = inreplyto
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
696
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
697 # attach files
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
698 if message_files:
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
699 # first up the text as a part
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
700 part = mailer.get_standard_message()
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
701 part.set_payload(body, part.get_charset())
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
702 message.attach(part)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
703
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
704 for fileid in message_files:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
705 name = files.get(fileid, 'name')
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
706 mime_type = (files.get(fileid, 'type') or
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
707 mimetypes.guess_type(name)[0] or
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
708 'application/octet-stream')
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
709 if mime_type == 'text/plain':
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
710 content = files.get(fileid, 'content')
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
711 part = MIMEText('')
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
712 del part['Content-Transfer-Encoding']
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
713 try:
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
714 enc = content.encode('ascii')
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
715 part = mailer.get_text_message('us-ascii')
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
716 part.set_payload(enc)
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
717 except UnicodeError:
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
718 # 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
719 # use quoted printable
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
720 # XXX stuffed if we know the charset though :(
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
721 part = mailer.get_text_message('utf-8')
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
722 part.set_payload(content, part.get_charset())
4424
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
723 elif mime_type == 'message/rfc822':
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
724 content = files.get(fileid, 'content')
4424
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
725 main, sub = mime_type.split('/')
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
726 p = FeedParser()
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
727 p.feed(content)
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
728 part = MIMEBase(main, sub)
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
729 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
730 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
731 # some other type, so encode it
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
732 content = files.get(fileid, 'binary_content')
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
733 main, sub = mime_type.split('/')
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
734 part = MIMEBase(main, sub)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
735 part.set_payload(content)
5422
a0ed8d5d744f Python 3 preparation: update email module names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5418
diff changeset
736 encoders.encode_base64(part)
4424
f1affb6b7a08 Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4423
diff changeset
737 cd = 'Content-Disposition'
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
738 part[cd] = 'attachment;\n filename="%s"' % name
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
739 message.attach(part)
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
740
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
741 else:
5493
725266c03eab updated mailgw to no longer use mimetools based on jerrykan's patch
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5488
diff changeset
742 message.set_payload(body, message.get_charset())
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
743
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
744 if crypt:
7575
2b0089104f08 flake8: rename loop variable in 'for sendto in sendto:'
John Rouillard <rouilj@ieee.org>
parents: 7211
diff changeset
745 send_msg = self.encrypt_to(message, to_addr)
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
746 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
747 send_msg = message
7575
2b0089104f08 flake8: rename loop variable in 'for sendto in sendto:'
John Rouillard <rouilj@ieee.org>
parents: 7211
diff changeset
748 mailer.set_message_attributes(send_msg, to_addr, subject, author)
4969
010ce624b320 Fixing duplicated email headers message-id, reply-to, in-reply-to. (part of issue2550869).
Bernhard Reiter <bernhard@intevation.de>
parents: 4745
diff changeset
749 if crypt:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
750 send_msg['Message-Id'] = message['Message-Id']
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
751 send_msg['Reply-To'] = message['Reply-To']
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
752 if message.get('In-Reply-To'):
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
753 send_msg['In-Reply-To'] = message['In-Reply-To']
4969
010ce624b320 Fixing duplicated email headers message-id, reply-to, in-reply-to. (part of issue2550869).
Bernhard Reiter <bernhard@intevation.de>
parents: 4745
diff changeset
754
7575
2b0089104f08 flake8: rename loop variable in 'for sendto in sendto:'
John Rouillard <rouilj@ieee.org>
parents: 7211
diff changeset
755 if to_addr:
2b0089104f08 flake8: rename loop variable in 'for sendto in sendto:'
John Rouillard <rouilj@ieee.org>
parents: 7211
diff changeset
756 mailer.smtp_send(to_addr, send_msg.as_string())
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
757 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
758 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
759 # 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
760 # 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
761 for bcc in bcc_sendto:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
762 send_msg = self.encrypt_to(message, [bcc])
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
763 send_msg['Message-Id'] = message['Message-Id']
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
764 send_msg['Reply-To'] = message['Reply-To']
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
765 if message.get('In-Reply-To'):
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
766 send_msg['In-Reply-To'] = message['In-Reply-To']
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
767 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
768 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
769 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
770 first = False
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
771
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
772 def email_signature(self, issueid, msgid):
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
773 ''' 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
774 '''
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
775 # 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
776 # 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
777 base = self.db.config.TRACKER_WEB
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
778 if (not isinstance(base, type('')) or
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
779 not (base.startswith('http://') or
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
780 base.startswith('https://'))):
2183
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
781 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
782 "fully-qualified URL"
2183
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
783 else:
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
784 if not base.endswith('/'):
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
785 base = base + '/'
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
786 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
787
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
788 # ensure the email address is properly quoted
4092
4b0ddce43d08 migrate from MimeWriter to email
Richard Jones <richard@users.sourceforge.net>
parents: 4059
diff changeset
789 email = formataddr((self.db.config.TRACKER_NAME,
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
790 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
791
1586
d1bab419f2a2 web url got longer
Richard Jones <richard@users.sourceforge.net>
parents: 1577
diff changeset
792 line = '_' * max(len(web)+2, len(email))
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
793 return '\n%s\n%s\n<%s>\n%s' % (line, email, web, line)
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
794
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
795 def generateCreateNote(self, issueid):
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
796 """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
797 """
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
798 cn = self.classname
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
799 cl = self.db.classes[cn]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
800 props = cl.getprops(protected=0)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
801
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
802 # list the values
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
803 m = []
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
804 prop_items = sorted(props.items())
3132
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
805 for propname, prop in prop_items:
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5098
diff changeset
806 # Omit quiet properties from history/changelog
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5098
diff changeset
807 if prop.quiet:
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5098
diff changeset
808 continue
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
809 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
810 # skip boring entries
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
811 if not value:
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
812 continue
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
813 if isinstance(prop, hyperdb.Link):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
814 link = self.db.classes[prop.classname]
6962
ff879aa00987 remove some unreachable code. If condition is always the same.
John Rouillard <rouilj@ieee.org>
parents: 6961
diff changeset
815 key = link.labelprop(default_to_id=1)
ff879aa00987 remove some unreachable code. If condition is always the same.
John Rouillard <rouilj@ieee.org>
parents: 6961
diff changeset
816 if key:
ff879aa00987 remove some unreachable code. If condition is always the same.
John Rouillard <rouilj@ieee.org>
parents: 6961
diff changeset
817 value = link.get(value, key)
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
818 elif isinstance(prop, hyperdb.Multilink):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
819 link = self.db.classes[prop.classname]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
820 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
821 if key:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
822 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
823 value.sort()
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
824 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
825 else:
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
826 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
827 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
828 value = '\n'+self.indentChangeNoteValue(value)
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
829 m.append('%s: %s' % (propname, value))
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
830 m.insert(0, '----------')
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
831 m.insert(0, '')
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
832 return '\n'.join(m)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
833
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
834 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
835 """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
836 """
2514
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
837 if not isinstance(oldvalues, type({})):
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
838 raise TypeError("'oldvalues' must be dict-like, not %s." %
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
839 type(oldvalues))
772
db5daf396518 Removed temporary workaround.
Derrick Hudson <dman13@users.sourceforge.net>
parents: 770
diff changeset
840
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
841 cn = self.classname
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
842 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
843 changed = {}
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
844 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
845
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
846 # determine what changed
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
847 for key in oldvalues.keys():
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
848 if key in ['files', 'messages']:
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1112
diff changeset
849 continue
2077
3e0961d6d44d Added the "actor" property.
Richard Jones <richard@users.sourceforge.net>
parents: 2073
diff changeset
850 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
851 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
852 # 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
853 # 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
854 try:
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
855 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
856 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
857 continue
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
858 # 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
859 # 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
860 try:
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
861 old_value = oldvalues[key]
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
862 if isinstance(new_value, type([])):
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
863 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
864 old_value.sort()
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
865 if new_value != old_value:
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
866 changed[key] = old_value
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
867 except Exception:
434
2441743e335b Removed generation of change note from "sendmessage" in roundupdb.py.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 428
diff changeset
868 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
869
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
870 # list the changes
440
de5bf4191f11 Enabled transaction support in the bsddb backend.
Richard Jones <richard@users.sourceforge.net>
parents: 439
diff changeset
871 m = []
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
872 changed_items = sorted(changed.items())
3132
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
873 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
874 prop = props[propname]
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5098
diff changeset
875 # Omit quiet properties from history/changelog
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5098
diff changeset
876 if prop.quiet:
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5098
diff changeset
877 continue
4358
887a153cedec The email for the first message on an issue...
Richard Jones <richard@users.sourceforge.net>
parents: 4347
diff changeset
878 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
879 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
880 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
881 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
882 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
883 if value:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
884 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
885 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
886 value = ''
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
887 if oldvalue:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
888 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
889 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
890 oldvalue = ''
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
891 change = '%s -> %s' % (oldvalue, value)
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
892 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
893 change = ''
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
894 if value is None: value = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
895 if oldvalue is None: oldvalue = [] # noqa: E701
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
896 changed_links = []
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
897 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
898 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
899 # check for additions
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
900 for entry in value:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
901 if entry in oldvalue: continue # noqa: E701
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
902 if key:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
903 changed_links.append(link.get(entry, key))
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
904 else:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
905 changed_links.append(entry)
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
906 if changed_links:
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
907 changed_links.sort()
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
908 change = '+%s' % (', '.join(changed_links))
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
909 changed_links = []
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
910 # check for removals
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
911 for entry in oldvalue:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
912 if entry in value: continue # noqa: E701
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
913 if key:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
914 changed_links.append(link.get(entry, key))
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
915 else:
6961
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
916 changed_links.append(entry)
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
917 if changed_links:
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
918 changed_links.sort()
de3118b4d224 flake8 fixes - use None as sentinel
John Rouillard <rouilj@ieee.org>
parents: 6658
diff changeset
919 change += ' -%s' % (', '.join(changed_links))
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
920 else:
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
921 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
922 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
923 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
924 oldvalue = self.indentChangeNoteValue(str(oldvalue))
3790
9171e01ac932 use named variable slots in translation string
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3750
diff changeset
925 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
926 "new": value, "old": oldvalue}
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
927 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
928 if m:
442
52b5f53d12f3 fixed the order of the blank line and '-------' line
Richard Jones <richard@users.sourceforge.net>
parents: 440
diff changeset
929 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
930 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
931 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
932
3740
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
933 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
934 lines = text.rstrip('\n').split('\n')
6008
2b53c310089f flake8 cleanup formatting plus
John Rouillard <rouilj@ieee.org>
parents: 5976
diff changeset
935 lines = [' '+line for line in lines]
3740
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
936 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
937
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
938 # vim: set filetype=python sts=4 sw=4 et si :

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