Issue #90: Users can receive multiple e-mails.

If an e-mail address is used in the 'Queue CC' set up and then that 
e-mail address is used as a submitter for a ticket, they received two 
emails. Worse, if that user was ALSO the 'assigned to' person for that 
ticket, they got THREE emails! 
This fix will ensure a particular email goes to an address only once.
Thanks to Andreas Kotowicz for this patch.
This commit is contained in:
Ross Poulton 2009-08-11 09:02:48 +00:00
parent 06fe35e944
commit b492bd5bd2
3 changed files with 38 additions and 13 deletions

View File

@ -133,6 +133,8 @@ class TicketForm(forms.Form):
'ticket': t, 'ticket': t,
'queue': q, 'queue': q,
} }
messages_sent_to = []
if t.submitter_email: if t.submitter_email:
send_templated_mail( send_templated_mail(
@ -143,8 +145,9 @@ class TicketForm(forms.Form):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(t.submitter_email)
if t.assigned_to and t.assigned_to != user and getattr(t.assigned_to.usersettings.settings, 'email_on_ticket_assign', False): if t.assigned_to and t.assigned_to != user and getattr(t.assigned_to.usersettings.settings, 'email_on_ticket_assign', False) and t.assigned_to.email and t.assigned_to.email not in messages_sent_to:
send_templated_mail( send_templated_mail(
'assigned_owner', 'assigned_owner',
context, context,
@ -153,8 +156,9 @@ class TicketForm(forms.Form):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(t.assigned_to.email)
if q.new_ticket_cc: if q.new_ticket_cc and q.new_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'newticket_cc', 'newticket_cc',
context, context,
@ -163,8 +167,9 @@ class TicketForm(forms.Form):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(q.new_ticket_cc)
if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc: if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc and q.updated_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'newticket_cc', 'newticket_cc',
context, context,
@ -272,6 +277,8 @@ class PublicTicketForm(forms.Form):
'queue': q, 'queue': q,
} }
messages_sent_to = []
send_templated_mail( send_templated_mail(
'newticket_submitter', 'newticket_submitter',
context, context,
@ -280,8 +287,9 @@ class PublicTicketForm(forms.Form):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(t.submitter_email)
if q.new_ticket_cc: if q.new_ticket_cc and q.new_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'newticket_cc', 'newticket_cc',
context, context,
@ -290,8 +298,9 @@ class PublicTicketForm(forms.Form):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(q.new_ticket_cc)
if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc: if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc and q.updated_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'newticket_cc', 'newticket_cc',
context, context,

View File

@ -196,6 +196,8 @@ class API:
'queue': ticket.queue, 'queue': ticket.queue,
'comment': f.comment, 'comment': f.comment,
} }
messages_sent_to = []
if public and ticket.submitter_email: if public and ticket.submitter_email:
send_templated_mail( send_templated_mail(
@ -205,8 +207,9 @@ class API:
sender=ticket.queue.from_address, sender=ticket.queue.from_address,
fail_silently=True, fail_silently=True,
) )
messages_sent_to.append(ticket.submitter_email)
if ticket.queue.updated_ticket_cc: if ticket.queue.updated_ticket_cc and ticket.queue.updated_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'updated_cc', 'updated_cc',
context, context,
@ -214,8 +217,9 @@ class API:
sender=ticket.queue.from_address, sender=ticket.queue.from_address,
fail_silently=True, fail_silently=True,
) )
messages_sent_to.append(ticket.queue.updated_ticket_cc)
if ticket.assigned_to and self.request.user != ticket.assigned_to and getattr(ticket.assigned_to.usersettings.settings, 'email_on_ticket_apichange', False): if ticket.assigned_to and self.request.user != ticket.assigned_to and getattr(ticket.assigned_to.usersettings.settings, 'email_on_ticket_apichange', False) and ticket.assigned_to.email and ticket.assigned_to.email not in messages_sent_to:
send_templated_mail( send_templated_mail(
'updated_owner', 'updated_owner',
context, context,
@ -257,6 +261,8 @@ class API:
} }
subject = '%s %s (Resolved)' % (ticket.ticket, ticket.title) subject = '%s %s (Resolved)' % (ticket.ticket, ticket.title)
messages_sent_to = []
if ticket.submitter_email: if ticket.submitter_email:
send_templated_mail( send_templated_mail(
@ -266,8 +272,9 @@ class API:
sender=ticket.queue.from_address, sender=ticket.queue.from_address,
fail_silently=True, fail_silently=True,
) )
messages_sent_to.append(ticket.submitter_email)
if ticket.queue.updated_ticket_cc: if ticket.queue.updated_ticket_cc and ticket.queue.updated_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'resolved_cc', 'resolved_cc',
context, context,
@ -275,8 +282,9 @@ class API:
sender=ticket.queue.from_address, sender=ticket.queue.from_address,
fail_silently=True, fail_silently=True,
) )
messages_sent_to.append(ticket.queue.updated_ticket_cc)
if ticket.assigned_to and self.request.user != ticket.assigned_to and getattr(ticket.assigned_to.usersettings.settings, 'email_on_ticket_apichange', False): if ticket.assigned_to and self.request.user != ticket.assigned_to and getattr(ticket.assigned_to.usersettings.settings, 'email_on_ticket_apichange', False) and ticket.assigned_to.email and ticket.assigned_to.email not in messages_sent_to:
send_templated_mail( send_templated_mail(
'resolved_resolved', 'resolved_resolved',
context, context,

View File

@ -233,6 +233,8 @@ def update_ticket(request, ticket_id, public=False):
if f.new_status == Ticket.RESOLVED_STATUS: if f.new_status == Ticket.RESOLVED_STATUS:
ticket.resolution = comment ticket.resolution = comment
messages_sent_to = []
if ticket.submitter_email and public and (f.comment or (f.new_status in (Ticket.RESOLVED_STATUS, Ticket.CLOSED_STATUS))): if ticket.submitter_email and public and (f.comment or (f.new_status in (Ticket.RESOLVED_STATUS, Ticket.CLOSED_STATUS))):
context.update( context.update(
resolution=ticket.resolution, resolution=ticket.resolution,
@ -254,8 +256,9 @@ def update_ticket(request, ticket_id, public=False):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(ticket.submitter_email)
if ticket.assigned_to and request.user != ticket.assigned_to and ticket.assigned_to.email: if ticket.assigned_to and request.user != ticket.assigned_to and ticket.assigned_to.email and ticket.assigned_to.email not in messages_sent_to:
# We only send e-mails to staff members if the ticket is updated by # We only send e-mails to staff members if the ticket is updated by
# another user. The actual template varies, depending on what has been # another user. The actual template varies, depending on what has been
# changed. # changed.
@ -277,8 +280,9 @@ def update_ticket(request, ticket_id, public=False):
fail_silently=True, fail_silently=True,
files=files, files=files,
) )
messages_sent_to.append(ticket.assigned_to.email)
if ticket.queue.updated_ticket_cc: if ticket.queue.updated_ticket_cc and ticket.queue.updated_ticket_cc not in messages_sent_to:
if reassigned: if reassigned:
template_cc = 'assigned_cc' template_cc = 'assigned_cc'
elif f.new_status == Ticket.RESOLVED_STATUS: elif f.new_status == Ticket.RESOLVED_STATUS:
@ -347,6 +351,8 @@ def mass_update(request):
'resolution': t.resolution, 'resolution': t.resolution,
} }
messages_sent_to = []
if t.submitter_email: if t.submitter_email:
send_templated_mail( send_templated_mail(
'closed_submitter', 'closed_submitter',
@ -355,8 +361,9 @@ def mass_update(request):
sender=t.queue.from_address, sender=t.queue.from_address,
fail_silently=True, fail_silently=True,
) )
messages_sent_to.append(t.submitter_email)
if t.assigned_to and request.user != t.assigned_to and t.assigned_to.email: if t.assigned_to and request.user != t.assigned_to and t.assigned_to.email and t.assigned_to.email not in messages_sent_to:
send_templated_mail( send_templated_mail(
'closed_owner', 'closed_owner',
context, context,
@ -364,8 +371,9 @@ def mass_update(request):
sender=t.queue.from_address, sender=t.queue.from_address,
fail_silently=True, fail_silently=True,
) )
messages_sent_to.append(t.assigned_to.email)
if t.queue.updated_ticket_cc: if t.queue.updated_ticket_cc and t.queue.updated_ticket_cc not in messages_sent_to:
send_templated_mail( send_templated_mail(
'closed_cc', 'closed_cc',
context, context,