# -*- coding: utf-8 -*- from trac import __version__ from trac.core import * from trac.config import * from trac.notification import NotifyEmail from trac.util import md5 from trac.util.datefmt import to_timestamp from trac.util.text import CRLF, wrap, to_unicode, obfuscate_email_address from genshi.template.text import TextTemplate from tracrendezvous.model import RendezVous, RendezVousLocation class RendezVousNotificationSystem(Component): always_notify_workflow_change = BoolOption('rendezvous', 'always_notify_workflow_changes', 'true', """Always send notifications to all authors, voters in the rendezvous on workflow changes""") ticket_subject_template = Option('rendezvous', 'ticket_subject_template', '$prefix #$rendezvous.rendezvous_id: $summary', """A Genshi text template snippet used to get the notification subject. (since 0.3)""") class RendezVousSchedulingNotifyEmail(NotifyEmail): """Notification for a scheduled rendezvous. """ template_name = "rendezvous_notify_email.txt" rendezvous = None modtime = 0 from_email = 'trac+rendezvous@localhost' COLS = 75 ical_fmt = "%Y%m%dT%H%M00Z" def __init__(self, env): NotifyEmail.__init__(self, env) def notify(self, editor, rendezvous, is_new=False, modtime=None): self.editor = editor self.rendezvous = rendezvous self.modtime = modtime self.is_new = is_new changes_body = '' changes_descr = '' self.rendezvous.link = self.env.abs_href.rendezvous(rendezvous.rendezvous_id) self.rendezvous_description = wrap( self.rendezvous.description, self.COLS, initial_indent=' ', subsequent_indent=' ', linesep=CRLF) subject = self.format_subj("RendezVous evolved to %s") if not is_new: subject = 'Re: ' + subject self.data.update({ 'rendezvous_props': self.format_props(), 'rendezvous_body_hdr': self.format_hdr(), 'subject': subject, 'rendezvous': rendezvous, 'changes_body': changes_body, 'changes_descr': changes_descr }) NotifyEmail.notify(self, rendezvous.rendezvous_id, subject) def format_props(self): rendezvous = self.rendezvous text = "" text+= "%s: %s\n" % ("Name".center(12), rendezvous.name) text+= "%s: %s\n" % ("Author".center(12), rendezvous.author) text+= "%s: %s\n" % ("Created on".center(12), rendezvous.time_created) location = RendezVousLocation.fetch_one(self.env, rendezvous.location_id) text+= "%s: %s\n" % ("Location".center(12), location and location.name or "") text+= "%s: %s\n" % ("Coordinates".center(12), location and location.coordinate_str() or "") return text def get_recipients(self, rendezvous_id): def parse_email(txt): return filter(lambda x: '@' in x, txt.replace(',', ' ').split()) r = RendezVous.fetch_one(self.env, rendezvous_id, fetch_dates=True) recipients = [] if r: tmp = r.email if tmp: emails = parse_email(tmp) recipients.extend(emails) tmp = r.dates[r.elected].email if tmp: emails = parse_email(tmp) recipients.extend(emails) return recipients, [] def format_hdr(self): return '#%s: %s' % (self.rendezvous.rendezvous_id, wrap(self.rendezvous.description, self.COLS, linesep=CRLF)) def format_subj(self, summary): template = self.config.get('rendezvous','rendezvous_subject_template') template = TextTemplate(template.encode('utf8')) prefix = self.config.get('notification', 'smtp_subject_prefix') if prefix == '__default__': prefix = '[%s]' % self.config.get('project', 'name') data = { 'prefix': prefix, 'summary': summary, 'rendezvous': self.rendezvous, 'env': self.env, } return template.generate(**data).render('text', encoding=None).strip() def get_message_id(self, rcpt, modtime=None): """Generate a predictable, but sufficiently unique message ID.""" s = '%s.%08d.%d.%s' % (self.config.get('project', 'url'), int(self.rendezvous.rendezvous_id), to_timestamp(modtime), rcpt.encode('ascii', 'ignore')) dig = md5(s).hexdigest() host = self.from_email[self.from_email.find('@') + 1:] msgid = '<%03d.%s@%s>' % (len(s), dig, host) return msgid def send(self, torcpts, ccrcpts): dest = self.editor or 'anonymous' hdrs = {} hdrs['Message-ID'] = self.get_message_id(dest, self.modtime) hdrs['X-Trac-Ticket-ID'] = str(self.rendezvous.rendezvous_id) hdrs['X-Trac-Ticket-URL'] = self.rendezvous.link if not self.is_new: msgid = self.get_message_id(dest) hdrs['In-Reply-To'] = msgid hdrs['References'] = msgid NotifyEmail.send(self, torcpts, ccrcpts, hdrs)