def notify(self, req, ticket, name): ctx = self.build_template_context(req, ticket, name) section = self.config['ticket-workflow-notifications'] condition = section.get('%s.condition' % name, None) if condition is not None: condition_value = TextTemplate(condition.replace( "\\n", "\n")).generate(**ctx).render(encoding=None).strip() if condition_value != 'True': self.log.debug( "Skipping notification %s for ticket %s " "because condition '%s' did not evaluate to True (it evaluated to %s)" % (name, ticket.id if ticket.exists else "(new ticket)", condition, condition_value)) return False else: self.log.debug( "Sending notification %s for ticket %s " "because condition '%s' did evaluate to True" % (name, ticket.id if ticket.exists else "(new ticket)", condition)) else: self.log.debug( "Sending notification %s for ticket %s " "because there was no condition" % (name, ticket.id if ticket.exists else "(new ticket)")) body = TextTemplate( section.get('%s.body' % name).replace( "\\n", "\n")).generate(**ctx).render(encoding=None) subject = TextTemplate( section.get('%s.subject' % name).replace( "\\n", "\n")).generate(**ctx).render(encoding=None) subject = ' '.join(subject.splitlines()) recipients = TextTemplate( section.get('%s.recipients' % name).replace( "\\n", "\n")).generate(**ctx).render(encoding=None) recipients = [r.strip() for r in recipients.split(",")] notifier = WorkflowNotifyEmail( self.env, template_name='ticket_notify_workflow_email.txt', recipients=recipients, data={'body': body}) vars = inspect.getargspec(notifier.notify)[0] if len(vars) == 3: # Trac 0.12 and below args = [ticket.id, subject] elif len( vars ) == 4: # Trac 0.13 and up have an additional `author` argument to trac.notification:NotifyEmail.notify args = [ticket.id, subject, req.authname] else: self.log.error( "Cannot send notification %s for ticket %s " "because this trac version has an unknown NotifyEmail.notify signature " "%s" % (name, ticket.id if ticket.exists else "(new ticket)", condition, vars)) return False notifier.notify(*args)
def _expand_docs(self, docs, ctx): try: tmpl = TextTemplate(docs) return tmpl.generate(**dict(ctx.items())).render() except (TemplateSyntaxError, BadDirectiveError), exc: self.log.exception("Syntax error rendering protocol documentation") return "'''Syntax error:''' [[BR]] %s" % (str(exc), )
def report_name(records, reserved_length=0): names = [] name_length = 0 record_count = len(records) max_length = (REPORT_NAME_MAX_LENGTH - reserved_length - len(str(record_count)) - 2) if action_report.record_name: template = TextTemplate(action_report.record_name) else: template = None for record in records[:5]: if template: record_name = template.generate(record=record).render() else: record_name = record.rec_name name_length += len(unicodedata.normalize('NFKD', record_name)) + 1 if name_length > max_length: break names.append(record_name) name = '-'.join(names) if len(records) > len(names): name += '__' + str(record_count - len(names)) return name
def _expand_docs(self, docs, ctx): try : tmpl = TextTemplate(docs) return tmpl.generate(**dict(ctx.items())).render() except (TemplateSyntaxError, BadDirectiveError), exc: self.log.exception("Syntax error rendering protocol documentation") return "'''Syntax error:''' [[BR]] %s" % (str(exc),)
def test_empty_lines1(self): tmpl = TextTemplate("""Your items: #for item in items * ${item} #end""") self.assertEqual( """Your items: * 0 * 1 * 2 """, tmpl.generate(items=range(3)).render('text'))
def format_subject(self): template = self.config.get('fullblog-notification', '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') action = self.action.strip('post_').replace('_', ' ') data = { 'blog': self.blog, 'prefix': prefix, 'action': action } return template.generate(**data).render('text', encoding=None).strip()
def format_subj(self, summary): template = self.config.get('notification','ticket_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, 'ticket': self.ticket, 'env': self.env, } return template.generate(**data).render('text', encoding=None).strip()
def check_record_name(self): if not self.record_name: return try: TextTemplate(self.record_name) except Exception as exception: raise ValidationError( gettext('ir.msg_report_invalid_record_name', report=self.rec_name, exception=exception)) from exception
def check_record_name(cls, reports, field_names=None): if field_names and 'record_name' not in field_names: return for report in reports: if not report.record_name: return try: TextTemplate(report.record_name) except Exception as exception: raise ValidationError(gettext( 'ir.msg_report_invalid_record_name', report=report.rec_name, exception=exception)) from exception
def test_unicode_input(self): text = u'$foo\xf6$bar' tmpl = TextTemplate(text) self.assertEqual(u'x\xf6y', unicode(tmpl.generate(foo='x', bar='y')))
def test_latin1_encoded(self): text = u'$foo\xf6$bar'.encode('iso-8859-1') tmpl = TextTemplate(text, encoding='iso-8859-1') self.assertEqual(u'x\xf6y', unicode(tmpl.generate(foo='x', bar='y')))
def test_end_with_args(self): tmpl = TextTemplate(""" #if foo bar #end 'if foo'""") self.assertEqual('\n', str(tmpl.generate(foo=False)))
def test_comment_escaping(self): tmpl = TextTemplate('\\## escaped comment') self.assertEqual('## escaped comment', str(tmpl.generate()))
def test_comment(self): tmpl = TextTemplate('## a comment') self.assertEqual('', str(tmpl.generate()))
def test_escaping(self): tmpl = TextTemplate('\\#escaped') self.assertEqual('#escaped', str(tmpl.generate()))