Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
 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), )
Exemplo n.º 3
0
        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
Exemplo n.º 4
0
 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),)
Exemplo n.º 5
0
    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'))
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
 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()
Exemplo n.º 8
0
 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
Exemplo n.º 9
0
 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
Exemplo n.º 10
0
 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')))
Exemplo n.º 11
0
 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')))
Exemplo n.º 12
0
 def test_end_with_args(self):
     tmpl = TextTemplate("""
     #if foo
       bar
     #end 'if foo'""")
     self.assertEqual('\n', str(tmpl.generate(foo=False)))
Exemplo n.º 13
0
 def test_comment_escaping(self):
     tmpl = TextTemplate('\\## escaped comment')
     self.assertEqual('## escaped comment', str(tmpl.generate()))
Exemplo n.º 14
0
 def test_comment(self):
     tmpl = TextTemplate('## a comment')
     self.assertEqual('', str(tmpl.generate()))
Exemplo n.º 15
0
 def test_escaping(self):
     tmpl = TextTemplate('\\#escaped')
     self.assertEqual('#escaped', str(tmpl.generate()))