def notify(self, tickets, new_values, comment, action, author): """Send batch ticket change notification e-mail (untranslated)""" t = deactivate() try: self._notify(tickets, new_values, comment, action, author) finally: reactivate(t)
def notify(self, tickets, new_values, comment, action, author): """Send batch ticket change notification e-mail (untranslated)""" t = deactivate() try: self._notify(tickets, new_values, comment, action, author) finally: reactivate(t)
def format(self, tickets, new_values, comment, action, author): """Format batch ticket change notification e-mail (untranslated)""" t = deactivate() try: self._prepare_body(tickets, new_values, comment, action, author) return self._format_body() finally: reactivate(t)
def format(self, tickets, new_values, comment, action, author): """Format batch ticket change notification e-mail (untranslated)""" t = deactivate() try: self._prepare_body(tickets, new_values, comment, action, author) return self._format_body() finally: reactivate(t)
def _format_body(self): stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: return stream.render('text', encoding='utf-8') finally: reactivate(t)
def _format_body(self): stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: return stream.render('text', encoding='utf-8') finally: reactivate(t)
def notify(self, ticket, newticket=True, modtime=None): """Send ticket change notification e-mail (untranslated)""" t = deactivate() translated_fields = ticket.fields try: ticket.fields = TicketSystem(self.env).get_ticket_fields() self._notify(ticket, newticket, modtime) finally: ticket.fields = translated_fields reactivate(t)
def notify(self, ticket, newticket=True, modtime=None): """Send ticket change notification e-mail (untranslated)""" t = deactivate() translated_fields = ticket.fields try: ticket.fields = TicketSystem(self.env).get_ticket_fields() self._notify(ticket, newticket, modtime) finally: ticket.fields = translated_fields reactivate(t)
def _translation_deactivated(ticket=None): t = deactivate() if ticket is not None: ts = TicketSystem(ticket.env) translated_fields = ticket.fields ticket.fields = ts.get_ticket_fields() try: yield finally: if ticket is not None: ticket.fields = translated_fields reactivate(t)
def translation_deactivated(ticket=None): t = deactivate() if ticket is not None: ts = TicketSystem(ticket.env) translated_fields = ticket.fields ticket.fields = ts.get_ticket_fields() try: yield finally: if ticket is not None: ticket.fields = translated_fields reactivate(t)
def notify_attachment(self, ticket, author, filename, modtime, body): """Send ticket attachment notification (untranslated)""" t = deactivate() translated_fields = ticket.fields try: ticket.fields = TicketSystem(self.env).get_ticket_fields() self.ticket = ticket self.modtime = modtime self.newticket = False self.reporter = '' self.owner = '' link = self.env.abs_href.ticket(ticket.id) summary = self.ticket['summary'] ticket_values = ticket.values.copy() ticket_values['id'] = ticket.id wrap_kargs = { 'initial_indent': ' ', 'subsequent_indent': ' ', 'linesep': CRLF } if 'ambiwidth' in getargspec(wrap)[0]: wrap_kargs['ambiwidth'] = self.ambiwidth ticket_values['description'] = wrap( ticket_values.get('description', ''), self.COLS, **wrap_kargs ) ticket_values['new'] = self.newticket ticket_values['link'] = link subject = 'Re: ' + self.format_subj(summary) author = obfuscate_email_address(author) change = { 'author': author } self.data.update({ 'ticket_props': self.format_props(), 'ticket_body_hdr': self.format_hdr(), 'subject': subject, 'ticket': ticket_values, 'change': change, 'changes_body': body, }) NotifyEmail.notify(self, ticket.id, subject) finally: ticket.fields = translated_fields reactivate(t)
def substitute_message(self, message, ignore_exc=True): try: chrome = Chrome(self.env) req = self._create_request() t = deactivate() try: make_activable(lambda: req.locale, self.env.path) return self._substitute_message(chrome, req, message) finally: reactivate(t) except: self.log.warn('Caught exception while substituting message', exc_info=True) if ignore_exc: return message raise
def _internal_render(self, req, name, content, render_args=None): if not name == 'latex': return self._show_err('Unknown macro %s' % (name)) label = None for line in content.split("\n"): m = reLABEL.search(content) if m: label = m.group(1) # We have to remove unnecessary ending lines because it seems otherwise preview LaTeX package # improperly crops the PDF -- if there is an empty line bettween the end of the content # and \end{preview} content = content.strip() key = sha1( content.encode('utf-8') + self.template_digest + str(self.png_resolution)).hexdigest() imgname = key + '.png' imgpath = os.path.join(self.cache_dir, imgname) if not os.path.exists(imgpath): errmsg = self._validate(content) if errmsg: return self._show_err(errmsg) texname = key + '.tex' texpath = os.path.join(self.cache_dir, texname) # Don't translate tex file t = deactivate() try: f = open(texpath, mode='w') self.template.generate(content=content).render( encoding='utf-8', out=f) f.close() except Exception, e: reactivate(t) return self._show_err("Problem creating tex file: %s" % (e)) finally:
def _internal_render(self, req, name, content, render_args=None): if not name == 'latex': return self._show_err('Unknown macro %s' % (name)) label = None for line in content.split("\n"): m = reLABEL.search(content) if m: label = m.group(1) # We have to remove unnecessary ending lines because it seems otherwise preview LaTeX package # improperly crops the PDF -- if there is an empty line bettween the end of the content # and \end{preview} content = content.strip() key = sha1(content.encode('utf-8') + self.template_digest + str(self.png_resolution)).hexdigest() imgname = key + '.png' imgpath = os.path.join(self.cache_dir, imgname) if not os.path.exists(imgpath): errmsg = self._validate(content) if errmsg: return self._show_err(errmsg) texname = key + '.tex' texpath = os.path.join(self.cache_dir, texname) # Don't translate tex file t = deactivate() try: f = open(texpath, mode='w') self.template.generate(content=content).render(encoding='utf-8', out=f) f.close() except Exception, e: reactivate(t) return self._show_err("Problem creating tex file: %s" % (e)) finally:
def send(self, torcpts, ccrcpts, mime_headers={}): """ this method is based NotifyEmail in trac/notification.py As the default trac NotifyEmail class assumes alot, and will overwrite headers we do not call our ancestor class method here, but send the mail direct """ from email.MIMEText import MIMEText from email.Utils import formatdate stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: body = stream.render('text') finally: reactivate(t) projname = self.env.project_name public_cc = self.config.getbool('notification', 'use_public_cc') headers = {} headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ headers['X-Trac-Version'] = __version__ headers['X-Trac-Project'] = projname headers['X-URL'] = self.env.project_url headers['Precedence'] = 'bulk' headers['Auto-Submitted'] = 'auto-generated' headers['Subject'] = self.subject headers['From'] = (self.from_name or projname, self.from_email) headers['Reply-To'] = self.reply_to_email # add Message-ID and In-Reply-To for threaded mail clients if self.action == 'post_created': headers['Message-ID'] = self.get_message_id( projname, self.blog.name) else: headers['Message-ID'] = self.get_message_id( projname, self.blog.name, self.time) headers['In-Reply-To'] = headers[ 'References'] = self.get_message_id(projname, self.blog.name) def build_addresses(rcpts): """Format and remove invalid addresses""" return filter(lambda x: x, [self.get_smtp_address(addr) for addr in rcpts]) def remove_dup(rcpts, all): """Remove duplicates""" tmp = [] for rcpt in rcpts: if not rcpt in all: tmp.append(rcpt) all.append(rcpt) return (tmp, all) toaddrs = build_addresses(torcpts) ccaddrs = build_addresses(ccrcpts) accparam = self.config.getlist('fullblog-notification', 'smtp_always_cc') accaddrs = accparam and build_addresses(accparam) or [] recipients = [] (toaddrs, recipients) = remove_dup(toaddrs, recipients) (ccaddrs, recipients) = remove_dup(ccaddrs, recipients) (accaddrs, recipients) = remove_dup(accaddrs, recipients) # if there is not valid recipient, leave immediately if len(recipients) < 1: self.env.log.info('no recipient for a fullblog notification') return cc = accaddrs + ccaddrs if cc: headers['Cc'] = ', '.join(cc) if toaddrs: headers['To'] = ', '.join(toaddrs) headers['Date'] = formatdate() msg = MIMEText(body, 'plain') # Message class computes the wrong type from MIMEText constructor, # which does not take a Charset object as initializer. Reset the # encoding type to force a new, valid evaluation del msg['Content-Transfer-Encoding'] msg.set_charset(self._charset) self.add_headers(msg, headers) self.add_headers(msg, mime_headers) NotificationSystem(self.env).send_email(self.from_email, recipients, msg.as_string())
def send(self, torcpts, ccrcpts, mime_headers={}): from email.MIMEText import MIMEText from email.Utils import formatdate attach_diff = self.config.getbool('wiki-notification', 'attach_diff') if attach_diff: from email.MIMEMultipart import MIMEMultipart self.data["wikidiff"] = None charset = str(self._charset) stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: body = stream.render('text', encoding=charset) finally: reactivate(t) # self.env.log.debug('Email Contents: %s', body) public_cc = self.config.getbool('wiki-notification', 'use_public_cc') headers = {} headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ headers['X-Trac-Version'] = __version__ headers['X-Trac-Project'] = self.env.project_name headers['X-URL'] = self.env.project_url headers['Precedence'] = 'bulk' headers['Auto-Submitted'] = 'auto-generated' headers['Subject'] = self.subject headers['From'] = ( self.from_name, self.from_email) if self.from_name else self.from_email headers['Reply-To'] = self.replyto_email def build_addresses(rcpts): """Format and remove invalid addresses""" return filter(lambda x: x, [self.get_smtp_address(addr) for addr in rcpts]) blocked_addresses = [] def remove_dup(rcpts, all): """Remove duplicates""" tmp = [] for rcpt in rcpts: if rcpt in self.banned_addresses: self.env.log.debug("Banned Address: %s", rcpt) blocked_addresses.append(rcpt) elif not rcpt in all: tmp.append(rcpt) all.append(rcpt) return (tmp, all) toaddrs = build_addresses(torcpts) ccaddrs = build_addresses(ccrcpts) accaddrs = build_addresses(self.config.getlist( 'wiki-notification', 'smtp_always_cc', [])) bccaddrs = build_addresses(self.config.getlist( 'wiki-notification', 'smtp_always_bcc', [])) recipients = [] (toaddrs, recipients) = remove_dup(toaddrs, recipients) (ccaddrs, recipients) = remove_dup(ccaddrs, recipients) (accaddrs, recipients) = remove_dup(accaddrs, recipients) (bccaddrs, recipients) = remove_dup(bccaddrs, recipients) self.env.log.debug("Not notifying the following addresses: %s", ', '.join(blocked_addresses)) # if there is not valid recipient, leave immediately if len(recipients) < 1: self.env.log.info('no recipient for a wiki notification') return dest = self.change_author or 'anonymous' headers['X-Trac-Wiki-URL'] = self.data['link'] pcc = accaddrs if public_cc: pcc += ccaddrs if toaddrs: headers['To'] = ', '.join(toaddrs) if pcc: headers['Cc'] = ', '.join(pcc) headers['Date'] = formatdate() if attach_diff: # With MIMEMultipart the charset has to be set before any parts # are added. msg = MIMEMultipart('mixed', None, [], charset=charset) msg.preamble = 'This is a multi-part message in MIME format.' # The text Message mail = MIMEText(body, 'plain', charset) mail.add_header('Content-Disposition', 'inline', filename="message.txt") msg.attach(mail) try: # The Diff Attachment attach = MIMEText(self.wikidiff.encode( 'utf-8'), 'x-patch', charset) attach.add_header('Content-Disposition', 'inline', filename=self.page.name + '.diff') msg.attach(attach) except AttributeError: # We don't have a wikidiff to attach pass else: msg = MIMEText(body, 'plain', charset) self.add_headers(msg, headers) self.add_headers(msg, mime_headers) self.env.log.info("Sending notification to %s" % (recipients,)) try: NotificationSystem(self.env).send_email( self.from_email, recipients, msg.as_string()) except Exception, err: self.env.log.debug('Notification could not be sent: %r', err)
def send(self, torcpts, ccrcpts, mime_headers={}): from email.MIMEText import MIMEText from email.Utils import formatdate stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: body = stream.render('text', encoding='utf-8') finally: reactivate(t) public_cc = self.config.getbool('notification', 'use_public_cc') headers = { 'X-Mailer': 'Trac %s, by Edgewall Software' % __version__, 'X-Trac-Version': __version__, 'X-Trac-Project': self.env.project_name, 'X-URL': self.env.project_url, 'Precedence': 'bulk', 'Auto-Submitted': 'auto-generated', 'Subject': self.subject, 'From': (self.from_name, self.from_email) if self.from_name else self.from_email, 'Reply-To': self.replyto_email } def build_addresses(rcpts): """Format and remove invalid addresses""" return filter(lambda x: x, [self.get_smtp_address(addr) for addr in rcpts]) def remove_dup(rcpts, all): """Remove duplicates""" tmp = [] for rcpt in rcpts: if not rcpt in all: tmp.append(rcpt) all.append(rcpt) return tmp, all notify_sys = NotificationSystem(self.env) toaddrs = build_addresses(torcpts) ccaddrs = build_addresses(ccrcpts) accaddrs = notify_sys.smtp_always_cc_list bccaddrs = notify_sys.smtp_always_bcc_list recipients = [] toaddrs, recipients = remove_dup(toaddrs, recipients) ccaddrs, recipients = remove_dup(ccaddrs, recipients) accaddrs, recipients = remove_dup(accaddrs, recipients) bccaddrs, recipients = remove_dup(bccaddrs, recipients) # if there is not valid recipient, leave immediately if len(recipients) < 1: self.env.log.info("no recipient for a ticket notification") return pcc = accaddrs if public_cc: pcc += ccaddrs if toaddrs: headers['To'] = ', '.join(toaddrs) if pcc: headers['Cc'] = ', '.join(pcc) headers['Date'] = formatdate() msg = MIMEText(body, 'plain') # Message class computes the wrong type from MIMEText constructor, # which does not take a Charset object as initializer. Reset the # encoding type to force a new, valid evaluation del msg['Content-Transfer-Encoding'] msg.set_charset(self._charset) self.add_headers(msg, headers) self.add_headers(msg, mime_headers) NotificationSystem(self.env).send_email(self.from_email, recipients, msg.as_string())
def send(self, torcpts, ccrcpts, mime_headers={}): from email.MIMEText import MIMEText from email.Utils import formatdate stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: body = stream.render('text', encoding='utf-8') finally: reactivate(t) public_cc = self.config.getbool('notification', 'use_public_cc') headers = {} headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ headers['X-Trac-Version'] = __version__ headers['X-Trac-Project'] = self.env.project_name headers['X-URL'] = self.env.project_url headers['Precedence'] = 'bulk' headers['Auto-Submitted'] = 'auto-generated' headers['Subject'] = self.subject headers['From'] = (self.from_name, self.from_email) if self.from_name \ else self.from_email headers['Reply-To'] = self.replyto_email def build_addresses(rcpts): """Format and remove invalid addresses""" return filter(lambda x: x, \ [self.get_smtp_address(addr) for addr in rcpts]) def remove_dup(rcpts, all): """Remove duplicates""" tmp = [] for rcpt in rcpts: if not rcpt in all: tmp.append(rcpt) all.append(rcpt) return (tmp, all) toaddrs = build_addresses(torcpts) ccaddrs = build_addresses(ccrcpts) accparam = self.config.get('notification', 'smtp_always_cc') accaddrs = accparam and \ build_addresses(accparam.replace(',', ' ').split()) or [] bccparam = self.config.get('notification', 'smtp_always_bcc') bccaddrs = bccparam and \ build_addresses(bccparam.replace(',', ' ').split()) or [] recipients = [] (toaddrs, recipients) = remove_dup(toaddrs, recipients) (ccaddrs, recipients) = remove_dup(ccaddrs, recipients) (accaddrs, recipients) = remove_dup(accaddrs, recipients) (bccaddrs, recipients) = remove_dup(bccaddrs, recipients) # if there is not valid recipient, leave immediately if len(recipients) < 1: self.env.log.info('no recipient for a ticket notification') return pcc = accaddrs if public_cc: pcc += ccaddrs if toaddrs: headers['To'] = ', '.join(toaddrs) if pcc: headers['Cc'] = ', '.join(pcc) headers['Date'] = formatdate() msg = MIMEText(body, 'plain') # Message class computes the wrong type from MIMEText constructor, # which does not take a Charset object as initializer. Reset the # encoding type to force a new, valid evaluation del msg['Content-Transfer-Encoding'] msg.set_charset(self._charset) self.add_headers(msg, headers) self.add_headers(msg, mime_headers) NotificationSystem(self.env).send_email(self.from_email, recipients, msg.as_string())
texname = key + '.tex' texpath = os.path.join(self.cache_dir, texname) # Don't translate tex file t = deactivate() try: f = open(texpath, mode='w') self.template.generate(content=content).render( encoding='utf-8', out=f) f.close() except Exception, e: reactivate(t) return self._show_err("Problem creating tex file: %s" % (e)) finally: reactivate(t) os.chdir(self.cache_dir) args = [ self.pdflatex_cmd, "-interaction=nonstopmode", texname, ] self.log.debug("Running command: %s", " ".join(args)) failure, errmsg = self._launch("", *args) if failure: return self._show_err(errmsg) args = [ self.gs_cmd, '-dSAFER',
def send(self, torcpts, ccrcpts, mime_headers={}): from email.MIMEText import MIMEText from email.Utils import formatdate attach_diff = self.config.getbool('wiki-notification', 'attach_diff') if attach_diff: from email.MIMEMultipart import MIMEMultipart self.data["wikidiff"] = None charset = str(self._charset) stream = self.template.generate(**self.data) # don't translate the e-mail stream t = deactivate() try: body = stream.render('text', encoding=charset) finally: reactivate(t) # self.env.log.debug('Email Contents: %s', body) public_cc = self.config.getbool('wiki-notification', 'use_public_cc') headers = {} headers['X-Mailer'] = 'Trac %s, by Edgewall Software' % __version__ headers['X-Trac-Version'] = __version__ headers['X-Trac-Project'] = self.env.project_name headers['X-URL'] = self.env.project_url headers['Precedence'] = 'bulk' headers['Auto-Submitted'] = 'auto-generated' headers['Subject'] = self.subject headers['From'] = ( self.from_name, self.from_email) if self.from_name else self.from_email headers['Reply-To'] = self.replyto_email def build_addresses(rcpts): """Format and remove invalid addresses""" return filter(lambda x: x, [self.get_smtp_address(addr) for addr in rcpts]) blocked_addresses = [] def remove_dup(rcpts, all): """Remove duplicates""" tmp = [] for rcpt in rcpts: if rcpt in self.banned_addresses: self.env.log.debug("Banned Address: %s", rcpt) blocked_addresses.append(rcpt) elif not rcpt in all: tmp.append(rcpt) all.append(rcpt) return (tmp, all) toaddrs = build_addresses(torcpts) ccaddrs = build_addresses(ccrcpts) accaddrs = build_addresses( self.config.getlist('wiki-notification', 'smtp_always_cc', [])) bccaddrs = build_addresses( self.config.getlist('wiki-notification', 'smtp_always_bcc', [])) recipients = [] (toaddrs, recipients) = remove_dup(toaddrs, recipients) (ccaddrs, recipients) = remove_dup(ccaddrs, recipients) (accaddrs, recipients) = remove_dup(accaddrs, recipients) (bccaddrs, recipients) = remove_dup(bccaddrs, recipients) self.env.log.debug("Not notifying the following addresses: %s", ', '.join(blocked_addresses)) # if there is not valid recipient, leave immediately if len(recipients) < 1: self.env.log.info('no recipient for a wiki notification') return dest = self.change_author or 'anonymous' headers['X-Trac-Wiki-URL'] = self.data['link'] pcc = accaddrs if public_cc: pcc += ccaddrs if toaddrs: headers['To'] = ', '.join(toaddrs) if pcc: headers['Cc'] = ', '.join(pcc) headers['Date'] = formatdate() if attach_diff: # With MIMEMultipart the charset has to be set before any parts # are added. msg = MIMEMultipart('mixed', None, [], charset=charset) msg.preamble = 'This is a multi-part message in MIME format.' # The text Message mail = MIMEText(body, 'plain', charset) mail.add_header('Content-Disposition', 'inline', filename="message.txt") msg.attach(mail) try: # The Diff Attachment attach = MIMEText(self.wikidiff.encode('utf-8'), 'x-patch', charset) attach.add_header('Content-Disposition', 'inline', filename=self.page.name + '.diff') msg.attach(attach) except AttributeError: # We don't have a wikidiff to attach pass else: msg = MIMEText(body, 'plain', charset) self.add_headers(msg, headers) self.add_headers(msg, mime_headers) self.env.log.info("Sending notification to %s" % (recipients, )) try: NotificationSystem(self.env).send_email(self.from_email, recipients, msg.as_string()) except Exception, err: self.env.log.debug('Notification could not be sent: %r', err)
return self._show_err(errmsg) texname = key + '.tex' texpath = os.path.join(self.cache_dir, texname) # Don't translate tex file t = deactivate() try: f = open(texpath, mode='w') self.template.generate(content=content).render(encoding='utf-8', out=f) f.close() except Exception, e: reactivate(t) return self._show_err("Problem creating tex file: %s" % (e)) finally: reactivate(t) os.chdir(self.cache_dir) args = [ self.pdflatex_cmd, "-interaction=nonstopmode", texname, ] self.log.debug("Running command: %s", " ".join(args)) failure, errmsg = self._launch("", *args) if failure: return self._show_err(errmsg) args = [ self.gs_cmd, '-dSAFER',