On 2023/01/13 16:10, Rolf Boelens wrote:
> After some more testing and debugging, it appears the
> 'ticket_notify_email.txt' template was not correct. I've now used the
> template as can be found here
> <https://trac.edgewall.org/wiki/TracNotification>.
> Now it works for tickets reported by "normal" users.
> When a ticket is reported by "admin", the notification email is still not
> send (with error "/Failure sending notification on change to ticket #xx:
> AttributeError: 'list' object has no attribute 'update'"/
> This is no problem in normal usage as normally the admin account won't report
> tickets.
I've filed the issue in https://trac.edgewall.org/ticket/13515
Please try attached patch to fix it.
--
Jun Omae <[email protected]> (大前 潤)
--
You received this message because you are subscribed to the Google Groups "Trac
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/trac-users/6aaccb39-4958-8cbf-69be-9a9d90f6c359%40gmail.com.
diff -ur Trac-1.4.3.orig/trac/notification/api.py
Trac-1.4.3/trac/notification/api.py
--- Trac-1.4.3.orig/trac/notification/api.py 2021-05-10 07:14:13.000000000
+0900
+++ Trac-1.4.3/trac/notification/api.py 2023-01-16 18:26:51.804001854 +0900
@@ -23,6 +23,7 @@
ListOption, Option)
from trac.core import Component, Interface, ExtensionPoint
from trac.util import as_bool, lazy, to_list
+from trac.util.text import exception_to_unicode
__all__ = ['IEmailAddressResolver', 'IEmailDecorator', 'IEmailSender',
@@ -209,6 +210,11 @@
self.time = time
self.author = author
+ def __repr__(self):
+ return '<%s realm=%r, category=%r, target=%r, time=%r, author=%r>' % \
+ (self.__class__.__name__, self.realm, self.category,
+ self.target, self.time, self.author)
+
class NotificationSystem(Component):
@@ -370,7 +376,12 @@
:param event: a `NotificationEvent`
"""
- self.distribute_event(event, self.subscriptions(event))
+ try:
+ self.distribute_event(event, self.subscriptions(event))
+ except Exception as e:
+ self.log.error("Failure distributing event %r%s", event,
+ exception_to_unicode(e, traceback=True))
+ raise
def distribute_event(self, event, subscriptions):
"""Distribute a event to all subscriptions.
diff -ur Trac-1.4.3.orig/trac/ticket/notification.py
Trac-1.4.3/trac/ticket/notification.py
--- Trac-1.4.3.orig/trac/ticket/notification.py 2021-05-10 07:14:13.000000000
+0900
+++ Trac-1.4.3/trac/ticket/notification.py 2023-01-16 18:26:59.340082792
+0900
@@ -690,6 +690,14 @@
# Harvest previous CC field
if 'fields' in event.changes and 'cc' in event.changes['fields']:
cc_users.update(to_set(event.changes['fields']['cc']['old']))
+
+ # Get members of permission groups
+ groups = PermissionSystem(self.env).get_groups_dict()
+ for cc in sorted(cc_users):
+ if cc in groups:
+ cc_users.discard(cc)
+ cc_users.update(groups[cc])
+
return _ticket_change_subscribers(self, cc_users)
def description(self):
@@ -751,13 +759,6 @@
if not isinstance(candidates, (list, set, tuple)):
candidates = [candidates]
- # Get members of permission groups
- groups = PermissionSystem(subscriber.env).get_groups_dict()
- for cc in set(candidates):
- if cc in groups:
- candidates.remove(cc)
- candidates.update(groups[cc])
-
matcher = RecipientMatcher(subscriber.env)
klass = subscriber.__class__.__name__
sids = set()