annotate roundup/roundupdb.py @ 3958:642201ee1d75

paranoia from Toby Dickenson
author Richard Jones <richard@users.sourceforge.net>
date Tue, 08 Jan 2008 20:58:31 +0000
parents 76ee5c3d0ced
children 68accc7d4b69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3702
06d7816976bc python 2.6 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 3621
diff changeset
1 from __future__ import nested_scopes
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
2 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
3 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
4 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
5 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
6 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
7 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
8 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
9 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
10 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
11 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
12 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
13 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
14 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
15 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
16 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
17 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
18 #
3958
642201ee1d75 paranoia from Toby Dickenson
Richard Jones <richard@users.sourceforge.net>
parents: 3957
diff changeset
19 # $Id: roundupdb.py,v 1.138 2008-01-08 20:58:31 richard Exp $
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 """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
22 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
23 __docformat__ = 'restructuredtext'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
24
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
25 import re, os, smtplib, socket, time, random
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
26 import cStringIO, base64, quopri, mimetypes
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
27 import os.path
1383
f19dde90e473 applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1379
diff changeset
28
f19dde90e473 applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1379
diff changeset
29 from rfc2822 import encode_header
f19dde90e473 applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1379
diff changeset
30
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
31 from roundup import password, date, hyperdb
3599
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
32 from roundup.i18n import _
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
33
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
34 # MessageSendError is imported for backwards compatibility
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
35 from roundup.mailer import Mailer, straddr, MessageSendError
458
fcda73536034 Added ROUNDUPDBSENDMAILDEBUG so one can test the sendmail method...
Richard Jones <richard@users.sourceforge.net>
parents: 453
diff changeset
36
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 class Database:
2735
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
38
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
39 # 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
40 # 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
41 # 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
42 # (eg. the current user edits their username)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
43 journal_uid = None
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 def getuid(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 """Return the id of the "user" node associated with the user
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 that owns this connection to the hyperdatabase."""
1800
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
47 if self.journaltag is None:
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
48 return None
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
49 elif self.journaltag == 'admin':
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
50 # 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
51 return '1'
a3b1b1dcf639 Use getuid(), not figure_curuserid()
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1799
diff changeset
52 else:
2735
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
53 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
54 self.journaltag):
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
55 uid = self.user.lookup(self.journaltag)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
56 self.journal_uid = (self.journaltag, uid)
85b9dcf908a2 record journaltag lookup ("fixes" [SF#998140])
Richard Jones <richard@users.sourceforge.net>
parents: 2569
diff changeset
57 return self.journal_uid[1]
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58
2906
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
59 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
60 """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
61 activities.
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
62 """
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
63 self.journaltag = username
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
64
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
65 def isCurrentUser(self, username):
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
66 """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
67 """
a8808157f892 fix some bugs introduced in refactoring of blobfiles filename()
Richard Jones <richard@users.sourceforge.net>
parents: 2765
diff changeset
68 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
69
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
70 def getUserTimezone(self):
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
71 """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
72 If no such property exists return 0
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
73 """
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
74 userid = self.getuid()
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
75 timezone = None
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
76 try:
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
77 tz = self.user.get(userid, 'timezone')
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
78 date.get_timezone(tz)
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
79 timezone = tz
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
80 except KeyError:
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
81 pass
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
82 # 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
83 # 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
84 # the timezone set in the tracker config.
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
85 if timezone is None:
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
86 timezone = self.config['TIMEZONE']
1402
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
87 return timezone
27586da5557c Added users' timezone support
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1383
diff changeset
88
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
89 def confirm_registration(self, otk):
2089
93f03c6714d8 A few big changes in this commit:
Richard Jones <richard@users.sourceforge.net>
parents: 2077
diff changeset
90 props = self.getOTKManager().getall(otk)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
91 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
92 value = props.get(propname, None)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
93 if value is None:
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
94 pass
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
95 elif isinstance(proptype, hyperdb.Date):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
96 props[propname] = date.Date(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
97 elif isinstance(proptype, hyperdb.Interval):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
98 props[propname] = date.Interval(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
99 elif isinstance(proptype, hyperdb.Password):
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
100 props[propname] = password.Password()
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
101 props[propname].unpack(value)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
102
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
103 # tag new user creation with 'admin'
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
104 self.journaltag = 'admin'
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
105
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
106 # create the new user
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
107 cl = self.user
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
108
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
109 props['roles'] = self.config.NEW_WEB_USER_ROLES
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
110 userid = cl.create(**props)
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
111 # 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
112 self.getOTKManager().destroy(otk)
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
113 self.commit()
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
114
1790
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
115 return userid
c8614db86be2 Extract confirm_registration() from client to roundupdb...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1622
diff changeset
116
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
117
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
118 class DetectorError(RuntimeError):
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
119 """ 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
120 """
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
121 pass
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
122
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
123 # deviation from spec - was called IssueClass
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 826
diff changeset
124 class IssueClass:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
125 """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
126 implementation. The backend should provide a mechanism that
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
127 enforces the title, messages, files, nosy and superseder
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
128 properties:
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
129
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
130 - title = hyperdb.String(indexme='yes')
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
131 - messages = hyperdb.Multilink("msg")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
132 - files = hyperdb.Multilink("file")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
133 - nosy = hyperdb.Multilink("user")
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1949
diff changeset
134 - 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
135 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
137 # 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
138 # 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
139 # marked for message extraction tool.
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
140 #
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
141 # 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
142 #
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
143 # 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
144 # defined in the classic template:
3904
91008ec8f9a0 retire "topic" usage
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3892
diff changeset
145 # assignedto, keyword, priority, status.
2545
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
146 (
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
147 ''"title", ''"messages", ''"files", ''"nosy", ''"superseder",
3904
91008ec8f9a0 retire "topic" usage
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3892
diff changeset
148 ''"assignedto", ''"keyword", ''"priority", ''"status",
2545
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
149 # following properties are common for all hyperdb classes
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
150 # 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
151 ''"actor", ''"activity", ''"creator", ''"creation",
f313ea652571 add common audit properties...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2518
diff changeset
152 )
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
153
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 # New methods:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 def addmessage(self, nodeid, summary, text):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 """Add a message to an issue's mail spool.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 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
159 owns the database connection as the author, and the specified summary
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 text.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 The "files" and "recipients" fields are left empty.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 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
165 appended to the "messages" field of the specified issue.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 """
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167
1360
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
168 def nosymessage(self, nodeid, msgid, oldvalues, whichnosy='nosy',
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
169 from_address=None, cc=[], bcc=[]):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 """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
171
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 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
173 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
174
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 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
176
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
177 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
178 list, and it's called a 'System Message'.
2228
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
179
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
180 The "cc" argument indicates additional recipients to send the
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
181 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
182 list.
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
183
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
184 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
185 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
186 list. These recipients will not be included in the To: or Cc:
1d1362c54c94 Some doc / comment fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 2218
diff changeset
187 address lists.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 """
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
189 if msgid:
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
190 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
191 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
192 else:
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
193 # "system message"
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
194 authid = None
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
195 recipients = []
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
196
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
197 sendto = []
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
198 bcc_sendto = []
1949
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
199 seen_message = {}
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
200 for recipient in recipients:
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
201 seen_message[recipient] = 1
3fa6df0d120d must be backward-compatible to py2.1
Richard Jones <richard@users.sourceforge.net>
parents: 1928
diff changeset
202
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
203 def add_recipient(userid, to):
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
204 # make sure they have an address
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
205 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
206 if address:
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
207 to.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
208 recipients.append(userid)
2073
261c2e6ceb1e *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
209
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
210 def good_recipient(userid):
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
211 # Make sure we don't send mail to either the anonymous
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
212 # user or a user who has already seen the message.
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
213 return (userid and
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
214 (self.db.user.get(userid, 'username') != 'anonymous') and
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
215 not seen_message.has_key(userid))
2073
261c2e6ceb1e *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2059
diff changeset
216
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
217 # 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
218 # 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
219 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
220 (self.db.config.MESSAGES_TO_AUTHOR == 'yes' or
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
221 (self.db.config.MESSAGES_TO_AUTHOR == 'new' and not oldvalues))):
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
222 add_recipient(authid, sendto)
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
223
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
224 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
225 seen_message[authid] = 1
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
226
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
227 # now deal with the nosy and cc people who weren't recipients.
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
228 for userid in cc + self.get(nodeid, whichnosy):
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
229 if good_recipient(userid):
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
230 add_recipient(userid, sendto)
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
231
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
232 # now deal with bcc people.
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
233 for userid in bcc:
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
234 if good_recipient(userid):
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
235 add_recipient(userid, bcc_sendto)
337
8cd545738d8e Features:
Richard Jones <richard@users.sourceforge.net>
parents: 318
diff changeset
236
753
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
237 if oldvalues:
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
238 note = self.generateChangeNote(nodeid, oldvalues)
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
239 else:
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
240 note = self.generateCreateNote(nodeid)
938edfdeac6e Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents: 749
diff changeset
241
1903
98b5f2c54dab Change nosymessage and send_message to accept msgid=None (RFE [SF#707235]).
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1830
diff changeset
242 # 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
243 # and send the mail.
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
244 if sendto or bcc_sendto:
2738
3a7039bc2f97 couple more msgid == None fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2737
diff changeset
245 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
246 self.db.msg.set(msgid, recipients=recipients)
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
247 self.send_message(nodeid, msgid, note, sendto, from_address,
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
248 bcc_sendto)
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
249
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
250 # backwards compatibility - don't remove
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
251 sendmessage = nosymessage
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
252
2218
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
253 def send_message(self, nodeid, msgid, note, sendto, from_address=None,
5673b24ceb0d roundupdb nosymessage() takes an optional bcc list
Richard Jones <richard@users.sourceforge.net>
parents: 2183
diff changeset
254 bcc_sendto=[]):
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
255 '''Actually send the nominated message from this node to the sendto
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
256 recipients, with the note appended.
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
257 '''
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
258 users = self.db.user
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
259 messages = self.db.msg
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
260 files = self.db.file
2518
cf17ba0a72f9 list IssueClass property names for message extraction tool
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
261
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
262 if msgid is None:
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
263 inreplyto = None
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
264 messageid = None
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
265 else:
2765
3468f74bd7ce fix copy/paste error made in r1.114
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2738
diff changeset
266 inreplyto = messages.get(msgid, 'inreplyto')
3468f74bd7ce fix copy/paste error made in r1.114
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2738
diff changeset
267 messageid = messages.get(msgid, 'messageid')
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
268
1927
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
269 # 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
270 if not messageid:
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
271 # 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
272 # create one
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
273 messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(),
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
274 self.classname, nodeid,
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
275 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
276 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
277 messages.set(msgid, messageid=messageid)
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 467
diff changeset
278
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
279 # compose title
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
280 cn = self.classname
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
281 title = self.get(nodeid, '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
282
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
283 # figure author information
3515
7015c1961013 have "System Messages" be marked as such again [SF#1281907]
Richard Jones <richard@users.sourceforge.net>
parents: 3440
diff changeset
284 if msgid:
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
285 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
286 else:
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
287 authid = self.db.getuid()
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
288 authname = users.get(authid, 'realname')
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
289 if not authname:
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
290 authname = users.get(authid, 'username', '')
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
291 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
292
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
293 if authaddr and self.db.config.MAIL_ADD_AUTHOREMAIL:
1927
f5e8aeb1382d Add 'safeget' method to hyperdb, including tests...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1903
diff changeset
294 authaddr = " <%s>" % straddr( ('',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
295 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
296 authaddr = ""
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
297
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
298 # make the message body
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
299 m = ['']
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
300
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
301 # put in roundup's signature
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 509
diff changeset
302 if self.db.config.EMAIL_SIGNATURE_POSITION == 'top':
428
7956563d49ae Property changes are now completely traceable, whether changes are
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 425
diff changeset
303 m.append(self.email_signature(nodeid, msgid))
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
304
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
305 # 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
306 if authid and self.db.config.MAIL_ADD_AUTHORINFO:
3939
63ab356dfcf9 Fix incorrect labelling of a change as a "new submission".
Richard Jones <richard@users.sourceforge.net>
parents: 3904
diff changeset
307 if msgid and len(self.get(nodeid, 'messages')) == 1:
3599
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
308 m.append(_("New submission from %(authname)s%(authaddr)s:")
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
309 % locals())
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
310 elif msgid:
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3599
diff changeset
311 m.append(_("%(authname)s%(authaddr)s added the comment:")
3599
f607494f5578 send_message: translate UI strings (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3515
diff changeset
312 % locals())
3892
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
313 else:
f762fa13cd8d Automatically find out author of property-only changes...
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3886
diff changeset
314 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
315 m.append('')
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
316
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 337
diff changeset
317 # add the content
2737
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
318 if msgid is not None:
37e2b70105f7 removed safeget() from the API [SF#994750]
Richard Jones <richard@users.sourceforge.net>
parents: 2735
diff changeset
319 m.append(messages.get(msgid, 'content', ''))
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
320
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
321 # 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
322 message_files = []
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
323 if msgid :
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
324 for fileid in messages.get(msgid, 'files') :
3941
9997b941dd6d remove some metakit references
Richard Jones <richard@users.sourceforge.net>
parents: 3939
diff changeset
325 # check the attachment size
9997b941dd6d remove some metakit references
Richard Jones <richard@users.sourceforge.net>
parents: 3939
diff changeset
326 filename = self.db.filename('file', fileid, None)
9997b941dd6d remove some metakit references
Richard Jones <richard@users.sourceforge.net>
parents: 3939
diff changeset
327 filesize = os.path.getsize(filename)
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
328 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
329 message_files.append(fileid)
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
330 else:
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
331 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
332 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
333 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
334 m.append(_("File '%(filename)s' not attached - "
5c4a039aa465 .send_message: fix translation for the "file not attached" message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3882
diff changeset
335 "you can download it from %(link)s.") % locals())
3882
46ef2a6fd79d config option to limit nosy attachments based on size
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3877
diff changeset
336
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
337 # add the change note
684
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
338 if note:
5b23ff865f3a added a "detectors" directory...
Richard Jones <richard@users.sourceforge.net>
parents: 667
diff changeset
339 m.append(note)
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
340
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
341 # put in roundup's signature
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 509
diff changeset
342 if self.db.config.EMAIL_SIGNATURE_POSITION == 'bottom':
428
7956563d49ae Property changes are now completely traceable, whether changes are
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 425
diff changeset
343 m.append(self.email_signature(nodeid, 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
344
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
345 # encode the content as quoted-printable
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
346 charset = getattr(self.db.config, 'EMAIL_CHARSET', 'utf-8')
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
347 m = '\n'.join(m)
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
348 if charset != 'utf-8':
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
349 m = unicode(m, 'utf-8').encode(charset)
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
350 content = cStringIO.StringIO(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
351 content_encoded = cStringIO.StringIO()
9382ad731c1c All messages sent to the nosy list are now encoded as quoted-printable.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 647
diff changeset
352 quopri.encode(content, content_encoded, 0)
667
52ca0ae46044 Faster, easier, less mess ;)
Richard Jones <richard@users.sourceforge.net>
parents: 665
diff changeset
353 content_encoded = content_encoded.getvalue()
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
354
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
355 # 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
356 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
357
1360
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
358 # 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
359 if from_address is None:
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
360 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
361
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
362 # 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
363 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
364 if from_tag:
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
365 from_tag = ' ' + from_tag
aa7e4e8b14be allow additional control over the roundupdb email sending...
Richard Jones <richard@users.sourceforge.net>
parents: 1329
diff changeset
366
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
367 subject = '[%s%s] %s'%(cn, nodeid, title)
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
368 author = (authname + from_tag, from_address)
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
369
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
370 # 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
371 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
372 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
373 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
374 sendto = [sendto]
1799
071ea6fc803f Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1794
diff changeset
375
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
376 # 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
377 # 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
378 # 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
379 # and/or fixing some day
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
380 first = True
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
381 for sendto in sendto:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
382 # create the message
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
383 mailer = Mailer(self.db.config)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
384 message, writer = mailer.get_standard_message(sendto, subject,
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
385 author)
2059
48600089c73d email charset fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2034
diff changeset
386
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
387 # set reply-to to the tracker
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
388 tracker_name = self.db.config.TRACKER_NAME
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
389 if charset != 'utf-8':
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
390 tracker = unicode(tracker_name, 'utf-8').encode(charset)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
391 tracker_name = encode_header(tracker_name, charset)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
392 writer.addheader('Reply-To', straddr((tracker_name, from_address)))
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
393
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
394 # message ids
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
395 if messageid:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
396 writer.addheader('Message-Id', messageid)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
397 if inreplyto:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
398 writer.addheader('In-Reply-To', inreplyto)
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
399
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
400 # 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
401 # a class that has a name attribute
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
402 for propname, prop in self.getprops().items():
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
403 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
404 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
405 cl = self.db.getclass(prop.classname)
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
406 if not 'name' in cl.getprops():
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
407 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
408 if isinstance(prop, hyperdb.Link):
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
409 value = self.get(nodeid, propname)
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
410 if value is None:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
411 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
412 values = [value]
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
413 else:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
414 values = self.get(nodeid, propname)
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
415 if not values:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
416 continue
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
417 values = [cl.get(v, 'name') for v in values]
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
418 values = ', '.join(values)
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
419 writer.addheader("X-Roundup-%s-%s" % (self.classname, propname),
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
420 values)
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
421 if not inreplyto:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
422 # Default the reply to the first message
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
423 msgs = self.get(nodeid, 'messages')
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
424 # Assume messages are sorted by increasing message number here
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
425 if msgs[0] != nodeid:
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
426 inreplyto = messages.get(msgs[0], 'messageid')
3958
642201ee1d75 paranoia from Toby Dickenson
Richard Jones <richard@users.sourceforge.net>
parents: 3957
diff changeset
427 if inreplyto:
642201ee1d75 paranoia from Toby Dickenson
Richard Jones <richard@users.sourceforge.net>
parents: 3957
diff changeset
428 writer.addheader('In-Reply-To', inreplyto)
3956
bb2722260e47 Fixes from Martin v. Löwis:
Richard Jones <richard@users.sourceforge.net>
parents: 3941
diff changeset
429
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
430 # attach files
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
431 if message_files:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
432 part = writer.startmultipartbody('mixed')
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
433 part = writer.nextpart()
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
434 part.addheader('Content-Transfer-Encoding', 'quoted-printable')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
435 body = part.startbody('text/plain; charset=%s'%charset)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
436 body.write(content_encoded)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
437 for fileid in message_files:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
438 name = files.get(fileid, 'name')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
439 mime_type = files.get(fileid, 'type')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
440 content = files.get(fileid, 'content')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
441 part = writer.nextpart()
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
442 if mime_type == 'text/plain':
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
443 part.addheader('Content-Disposition',
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
444 'attachment;\n filename="%s"'%name)
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
445 try:
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
446 content.decode('ascii')
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
447 except UnicodeError:
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
448 # 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
449 # use quoted printable
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
450 part.addheader('Content-Transfer-Encoding',
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
451 'quoted-printable')
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
452 body = part.startbody('text/plain')
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
453 body.write(quopri.encodestring(content))
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
454 else:
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
455 part.addheader('Content-Transfer-Encoding', '7bit')
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
456 body = part.startbody('text/plain')
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
457 body.write(content)
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
458 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
459 # some other type, so encode it
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
460 if not mime_type:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
461 # this should have been done when the file was saved
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
462 mime_type = mimetypes.guess_type(name)[0]
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
463 if mime_type is None:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
464 mime_type = 'application/octet-stream'
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
465 part.addheader('Content-Disposition',
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
466 'attachment;\n filename="%s"'%name)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
467 part.addheader('Content-Transfer-Encoding', 'base64')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
468 body = part.startbody(mime_type)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
469 body.write(base64.encodestring(content))
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
470 writer.lastpart()
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
471 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
472 writer.addheader('Content-Transfer-Encoding',
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
473 'quoted-printable')
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
474 body = writer.startbody('text/plain; charset=%s'%charset)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
475 body.write(content_encoded)
393
f40388721e40 incorporated patch from Roch'e Compaan implementing attachments in nosy e-mail
Richard Jones <richard@users.sourceforge.net>
parents: 380
diff changeset
476
3417
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
477 if first:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
478 mailer.smtp_send(sendto + bcc_sendto, message)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
479 else:
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
480 mailer.smtp_send(sendto, message)
07c696890f55 mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents: 3132
diff changeset
481 first = False
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
482
428
7956563d49ae Property changes are now completely traceable, whether changes are
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 425
diff changeset
483 def email_signature(self, nodeid, msgid):
411
a6088556e9ba Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 410
diff changeset
484 ''' 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
485 '''
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
486 # 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
487 # 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
488 base = self.db.config.TRACKER_WEB
1250
deab62016de7 https URLs from config now recognised as valid [SF#619829]
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
489 if (not isinstance(base , type('')) or
1253
fe67477e678f fixes from changes today
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
490 not (base.startswith('http://') or base.startswith('https://'))):
2183
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
491 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
492 "fully-qualified URL"
2183
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
493 else:
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
494 if not base.endswith('/'):
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
495 base = base + '/'
ac24a9c74cca be paranoid about TRACKER_WEB
Richard Jones <richard@users.sourceforge.net>
parents: 2153
diff changeset
496 web = base + self.classname + nodeid
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
497
17208b487199 [SF#565992] if ISSUE_TRACKER_WEB doesn't have the trailing '/', add it
Derrick Hudson <dman13@users.sourceforge.net>
parents: 758
diff changeset
498 # ensure the email address is properly quoted
1096
fa7df238e2d4 More cleaning up of configuration, and the "instance" -> "tracker" renaming.
Richard Jones <richard@users.sourceforge.net>
parents: 1095
diff changeset
499 email = straddr((self.db.config.TRACKER_NAME,
fa7df238e2d4 More cleaning up of configuration, and the "instance" -> "tracker" renaming.
Richard Jones <richard@users.sourceforge.net>
parents: 1095
diff changeset
500 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
501
1586
d1bab419f2a2 web url got longer
Richard Jones <richard@users.sourceforge.net>
parents: 1577
diff changeset
502 line = '_' * max(len(web)+2, len(email))
2095
7d886a79ab67 make sure email signature starts on a newline [SF#919759]
Richard Jones <richard@users.sourceforge.net>
parents: 2089
diff changeset
503 return '\n%s\n%s\n<%s>\n%s'%(line, email, web, line)
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
504
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
505
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
506 def generateCreateNote(self, nodeid):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
507 """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
508 """
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
509 cn = self.classname
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
510 cl = self.db.classes[cn]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
511 props = cl.getprops(protected=0)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
512
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
513 # list the values
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
514 m = []
3132
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
515 prop_items = props.items()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
516 prop_items.sort()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
517 for propname, prop in prop_items:
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
518 value = cl.get(nodeid, propname, None)
559
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
519 # skip boring entries
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
520 if not value:
bb5ee2f24ee0 Properties in change note are now sorted
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 537
diff changeset
521 continue
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
522 if isinstance(prop, hyperdb.Link):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
523 link = self.db.classes[prop.classname]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
524 if value:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
525 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
526 if key:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
527 value = link.get(value, key)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
528 else:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
529 value = ''
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
530 elif isinstance(prop, hyperdb.Multilink):
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
531 if value is None: value = []
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
532 l = []
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
533 link = self.db.classes[prop.classname]
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
534 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
535 if key:
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
536 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
537 value.sort()
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
538 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
539 else:
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
540 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
541 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
542 value = '\n'+self.indentChangeNoteValue(value)
534
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
543 m.append('%s: %s'%(propname, value))
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
544 m.insert(0, '----------')
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
545 m.insert(0, '')
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
546 return '\n'.join(m)
d17c60d16f7f [SF#503353] setting properties in initial email
Richard Jones <richard@users.sourceforge.net>
parents: 524
diff changeset
547
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
548 def generateChangeNote(self, nodeid, oldvalues):
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
549 """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
550 """
2514
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
551 if not isinstance(oldvalues, type({})):
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
552 raise TypeError("'oldvalues' must be dict-like, not %s."%
091711fb2f8c Initial logging integration: replace all debug prints with logging calls...
Richard Jones <richard@users.sourceforge.net>
parents: 2228
diff changeset
553 type(oldvalues))
772
db5daf396518 Removed temporary workaround.
Derrick Hudson <dman13@users.sourceforge.net>
parents: 770
diff changeset
554
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
555 cn = self.classname
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
556 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
557 changed = {}
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
558 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
559
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
560 # determine what changed
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
561 for key in oldvalues.keys():
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1112
diff changeset
562 if key in ['files','messages']:
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1112
diff changeset
563 continue
2077
3e0961d6d44d Added the "actor" property.
Richard Jones <richard@users.sourceforge.net>
parents: 2073
diff changeset
564 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
565 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
566 # 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
567 # 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
568 try:
1812
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
569 new_value = cl.get(nodeid, key)
6f3b92a817aa fixed Apply Error that was raised when property was deleted from class...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1800
diff changeset
570 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
571 continue
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
572 # 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
573 # 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
574 try:
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
575 old_value = oldvalues[key]
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
576 if type(new_value) is type([]):
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
577 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
578 old_value.sort()
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
579 if new_value != old_value:
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
580 changed[key] = old_value
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
581 except:
434
2441743e335b Removed generation of change note from "sendmessage" in roundupdb.py.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 428
diff changeset
582 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
583
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
584 # list the changes
440
de5bf4191f11 Enabled transaction support in the bsddb backend.
Richard Jones <richard@users.sourceforge.net>
parents: 439
diff changeset
585 m = []
3132
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
586 changed_items = changed.items()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
587 changed_items.sort()
3475ae520f19 code cleanup (patch [SF#115329] and additional)
Richard Jones <richard@users.sourceforge.net>
parents: 2906
diff changeset
588 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
589 prop = props[propname]
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
590 value = cl.get(nodeid, propname, None)
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
591 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
592 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
593 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
594 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
595 if value:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
596 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
597 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
598 value = ''
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
599 if oldvalue:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
600 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
601 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
602 oldvalue = ''
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
603 change = '%s -> %s'%(oldvalue, value)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
604 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
605 change = ''
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
606 if value is None: value = []
434
2441743e335b Removed generation of change note from "sendmessage" in roundupdb.py.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 428
diff changeset
607 if oldvalue is None: oldvalue = []
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
608 l = []
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
609 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
610 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
611 # check for additions
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
612 for entry in value:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
613 if entry in oldvalue: continue
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
614 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
615 l.append(link.get(entry, key))
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
616 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
617 l.append(entry)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
618 if l:
1095
711f2ecee20f unit tests pass again
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
619 l.sort()
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
620 change = '+%s'%(', '.join(l))
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
621 l = []
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
622 # check for removals
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
623 for entry in oldvalue:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
624 if entry in value: continue
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
625 if key:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
626 l.append(link.get(entry, key))
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
627 else:
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
628 l.append(entry)
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
629 if l:
1095
711f2ecee20f unit tests pass again
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
630 l.sort()
428
7956563d49ae Property changes are now completely traceable, whether changes are
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 425
diff changeset
631 change += ' -%s'%(', '.join(l))
453
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
632 else:
5b422e3bd05d Performance tuning.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 445
diff changeset
633 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
634 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
635 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
636 oldvalue = self.indentChangeNoteValue(str(oldvalue))
3790
9171e01ac932 use named variable slots in translation string
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3750
diff changeset
637 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
638 "new": value, "old": oldvalue}
425
fc907b6ef135 Property changes are now listed in emails generated by Roundup
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 416
diff changeset
639 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
640 if m:
442
52b5f53d12f3 fixed the order of the blank line and '-------' line
Richard Jones <richard@users.sourceforge.net>
parents: 440
diff changeset
641 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
642 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
643 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
644
3740
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
645 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
646 lines = text.rstrip('\n').split('\n')
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
647 lines = [ ' '+line for line in lines ]
1442ba0c4850 fix email change note rendering of multiline properties (patch [SF#1575223])
Richard Jones <richard@users.sourceforge.net>
parents: 3702
diff changeset
648 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
649
3440
0c78c9bbb542 in nosy messages, use quoted printable encoding for text/plain files...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3417
diff changeset
650 # vim: set filetype=python sts=4 sw=4 et si :

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