annotate examples/trac/trac/ticket/notification.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2003-2006 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2003-2005 Daniel Lundin <daniel@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2005-2006 Emmanuel Blot <emmanuel.blot@free.fr>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 # Author: Daniel Lundin <daniel@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 import md5
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac import __version__
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.config import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.util.text import CRLF, wrap
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.notification import NotifyEmail
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 class TicketNotificationSystem(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 always_notify_owner = BoolOption('notification', 'always_notify_owner',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 'false',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 """Always send notifications to the ticket owner (''since 0.9'').""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 always_notify_reporter = BoolOption('notification', 'always_notify_reporter',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 'false',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 """Always send notifications to any address in the ''reporter''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 field.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 always_notify_updater = BoolOption('notification', 'always_notify_updater',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 'true',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 """Always send notifications to the person who causes the ticket
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 property change.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 class TicketNotifyEmail(NotifyEmail):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 """Notification of ticket changes."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 template_name = "ticket_notify_email.cs"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 ticket = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 newticket = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 modtime = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 from_email = 'trac+ticket@localhost'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 COLS = 75
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 def __init__(self, env):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 NotifyEmail.__init__(self, env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 self.prev_cc = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 def notify(self, ticket, req, newticket=True, modtime=0):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 self.ticket = ticket
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 self.modtime = modtime
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 self.newticket = newticket
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 self.ticket['description'] = wrap(self.ticket.values.get('description', ''),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 self.COLS, initial_indent=' ',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 subsequent_indent=' ', linesep=CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 self.hdf.set_unescaped('email.ticket_props', self.format_props())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 self.hdf.set_unescaped('email.ticket_body_hdr', self.format_hdr())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 self.hdf['ticket.new'] = self.newticket
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 subject = self.format_subj()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 link = req.abs_href.ticket(ticket.id)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 if not self.newticket:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 subject = 'Re: ' + subject
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 self.hdf.set_unescaped('email.subject', subject)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 changes = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 if not self.newticket and modtime: # Ticket change
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 from trac.ticket.web_ui import TicketModule
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 for change in TicketModule(self.env).grouped_changelog_entries(
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 ticket, self.db, when=modtime):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 if not change['permanent']: # attachment with same time...
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 self.hdf.set_unescaped('ticket.change.author',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 change['author'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 self.hdf.set_unescaped('ticket.change.comment',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 wrap(change['comment'], self.COLS,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 ' ', ' ', CRLF))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 link += '#comment:%d' % change['cnum']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 for field, values in change['fields'].iteritems():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 old = values['old']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 new = values['new']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 pfx = 'ticket.change.%s' % field
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 newv = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 if field == 'description':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 new_descr = wrap(new, self.COLS, ' ', ' ', CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 old_descr = wrap(old, self.COLS, '> ', '> ', CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 old_descr = old_descr.replace(2*CRLF, CRLF + '>' + CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 cdescr = CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 cdescr += 'Old description:' + 2*CRLF + old_descr + 2*CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 cdescr += 'New description:' + 2*CRLF + new_descr + CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 self.hdf.set_unescaped('email.changes_descr', cdescr)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 elif field == 'cc':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 (addcc, delcc) = self.diff_cc(old, new)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 chgcc = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 if delcc:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 chgcc += wrap(" * cc: %s (removed)" % ', '.join(delcc),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 self.COLS, ' ', ' ', CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 chgcc += CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 if addcc:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 chgcc += wrap(" * cc: %s (added)" % ', '.join(addcc),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 self.COLS, ' ', ' ', CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 chgcc += CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 if chgcc:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 changes += chgcc
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 self.prev_cc += old and self.parse_cc(old) or []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 newv = new
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 l = 7 + len(field)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 chg = wrap('%s => %s' % (old, new), self.COLS - l, '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 l * ' ', CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 changes += ' * %s: %s%s' % (field, chg, CRLF)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 if newv:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 self.hdf.set_unescaped('%s.oldvalue' % pfx, old)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 self.hdf.set_unescaped('%s.newvalue' % pfx, newv)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 if changes:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 self.hdf.set_unescaped('email.changes_body', changes)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 self.ticket['link'] = link
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 self.hdf.set_unescaped('ticket', self.ticket.values)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 NotifyEmail.notify(self, ticket.id, subject)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 def format_props(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 tkt = self.ticket
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 fields = [f for f in tkt.fields if f['name'] not in ('summary', 'cc')]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 width = [0, 0, 0, 0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 i = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 for f in [f['name'] for f in fields if f['type'] != 'textarea']:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 if not tkt.values.has_key(f):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 fval = tkt[f]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 if fval.find('\n') != -1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 idx = 2 * (i % 2)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 if len(f) > width[idx]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 width[idx] = len(f)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 if len(fval) > width[idx + 1]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 width[idx + 1] = len(fval)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 i += 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 format = ('%%%is: %%-%is | ' % (width[0], width[1]),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 ' %%%is: %%-%is%s' % (width[2], width[3], CRLF))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 l = (width[0] + width[1] + 5)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 sep = l * '-' + '+' + (self.COLS - l) * '-'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 txt = sep + CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 big = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 i = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 for f in [f for f in fields if f['name'] != 'description']:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 fname = f['name']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 if not tkt.values.has_key(fname):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 fval = tkt[fname]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 if f['type'] == 'textarea' or '\n' in unicode(fval):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 big.append((fname.capitalize(), CRLF.join(fval.splitlines())))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 txt += format[i % 2] % (fname.capitalize(), fval)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 i += 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 if i % 2:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 txt += CRLF
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 if big:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 txt += sep
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 for name, value in big:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 txt += CRLF.join(['', name + ':', value, '', ''])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 txt += sep
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 return txt
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 def parse_cc(self, txt):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 return filter(lambda x: '@' in x, txt.replace(',', ' ').split())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 def diff_cc(self, old, new):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 oldcc = NotifyEmail.addrsep_re.split(old)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 newcc = NotifyEmail.addrsep_re.split(new)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 added = [x for x in newcc if x and x not in oldcc]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 removed = [x for x in oldcc if x and x not in newcc]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 return (added, removed)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 def format_hdr(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 return '#%s: %s' % (self.ticket.id, wrap(self.ticket['summary'],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 self.COLS, linesep=CRLF))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 def format_subj(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 projname = self.config.get('project', 'name')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 return '[%s] #%s: %s' % (projname, self.ticket.id,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 self.ticket['summary'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 def get_recipients(self, tktid):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 notify_reporter = self.config.getbool('notification',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 'always_notify_reporter')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 notify_owner = self.config.getbool('notification',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 'always_notify_owner')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 notify_updater = self.config.getbool('notification',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 'always_notify_updater')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 ccrecipients = self.prev_cc
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 torecipients = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 cursor = self.db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 # Harvest email addresses from the cc, reporter, and owner fields
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 cursor.execute("SELECT cc,reporter,owner FROM ticket WHERE id=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 (tktid,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 if row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 ccrecipients += row[0] and row[0].replace(',', ' ').split() or []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 if notify_reporter:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 torecipients.append(row[1])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 if notify_owner:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 torecipients.append(row[2])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 # Harvest email addresses from the author field of ticket_change(s)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 if notify_reporter:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 cursor.execute("SELECT DISTINCT author,ticket FROM ticket_change "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 "WHERE ticket=%s", (tktid,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 for author,ticket in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 torecipients.append(author)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 # Suppress the updater from the recipients
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 if not notify_updater:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 cursor.execute("SELECT author FROM ticket_change WHERE ticket=%s "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 "ORDER BY time DESC LIMIT 1", (tktid,))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 (updater, ) = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 torecipients = [r for r in torecipients if r and r != updater]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 return (torecipients, ccrecipients)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 def get_message_id(self, rcpt, modtime=0):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 """Generate a predictable, but sufficiently unique message ID."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 s = '%s.%08d.%d.%s' % (self.config.get('project', 'url'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 int(self.ticket.id), modtime, rcpt)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 dig = md5.new(s).hexdigest()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 host = self.from_email[self.from_email.find('@') + 1:]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 msgid = '<%03d.%s@%s>' % (len(s), dig, host)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 return msgid
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 def send(self, torcpts, ccrcpts):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 hdrs = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 always_cc = self.config['notification'].get('smtp_always_cc')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 always_bcc = self.config['notification'].get('smtp_always_bcc')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 dest = filter(None, torcpts) or filter(None, ccrcpts) or \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 filter(None, [always_cc]) or filter(None, [always_bcc])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 if not dest:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 self.env.log.info('no recipient for a ticket notification')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 hdrs['Message-ID'] = self.get_message_id(dest[0], self.modtime)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 hdrs['X-Trac-Ticket-ID'] = str(self.ticket.id)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250 hdrs['X-Trac-Ticket-URL'] = self.ticket['link']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 if not self.newticket:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 hdrs['In-Reply-To'] = self.get_message_id(dest[0])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 hdrs['References'] = self.get_message_id(dest[0])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 NotifyEmail.send(self, torcpts, ccrcpts, hdrs)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255
Copyright (C) 2012-2017 Edgewall Software