Opened 6 years ago
Closed 5 years ago
#13225 closed defect (fixed)
[notification] ticket_subject_template cannot begin with # character
| Reported by: | Ryan J Ollos | Owned by: | Ryan J Ollos |
|---|---|---|---|
| Priority: | normal | Milestone: | 1.4.2 |
| Component: | general | Version: | |
| Severity: | normal | Keywords: | |
| Cc: | Branch: | ||
| Release Notes: |
Fixed |
||
| API Changes: | |||
| Internal Changes: | |||
Description
Reported in th:comment:8:ticket:13654. The issue is seen with [notification] ticket_subject_template, and likely [notification] batch_subject_template.
[notification] ticket_subject_template = #${ticket.id}: ${summary}
Need to check if the issue occurs prior to the Jinja2 transition.
Attachments (0)
Change History (12)
comment:1 by , 6 years ago
| Summary: | ticket_subject_template cannot begin with # character → [notification] ticket_subject_template cannot begin with # character |
|---|
comment:2 by , 6 years ago
comment:3 by , 6 years ago
I think line_comment_prefix=None should be used by the same reason.
>>> from trac.util.text import jinja2env >>> data = {'ticket': {'id': 42}} >>> def jinja2template(template, text=False): ... return jinja2env(autoescape=not text, ... line_statement_prefix=None).from_string(template) ... >>> jinja2template('${ticket.id}', text=True).render(**data) u'42' >>> >>> jinja2template('#${ticket.id}', text=True).render(**data) u'#42' >>> jinja2template('##${ticket.id}', text=True).render(**data) u'' >>> >>> def jinja2template(template, text=False): ... return jinja2env(autoescape=not text, ... line_statement_prefix=None, ... line_comment_prefix=None).from_string(template) ... >>> jinja2template('#${ticket.id}', text=True).render(**data) u'#42' >>> jinja2template('##${ticket.id}', text=True).render(**data) u'##42'
comment:4 by , 6 years ago
| Milestone: | next-stable-1.4.x → 1.4.1 |
|---|
comment:5 by , 6 years ago
| Milestone: | 1.4.1 → 1.4.2 |
|---|
comment:6 by , 5 years ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:7 by , 5 years ago
| Release Notes: | modified (diff) |
|---|
Added test coverage to anonymous comment:1 change and Jun's comment:2 change: log:rjollos.git:t13325_ticket_subject_template.
follow-up: 11 comment:8 by , 5 years ago
This could break plugins that need multiline templates with comments or statements, right? (I'm not aware of any such plugins, so maybe not a problem.)
Would a jinja2template(..., oneliner=True) parameter be useful?
For example a (untested) Jinja2TemplateTestCase:
def test_multiline_text_template(self): self.assertEqual(""" ## This is a comment in a multiline template with the following statement: # if True: <h1>Hell&O</h1> # endif """, jinja2template("<h1>${hell}O</h1>", text=True, oneliner=False).render( {'hell': 'Hell&'}))
Or is jinja2template inherently intended only for oneliners, and multiline templates should always use chrome.render_template_string instead? Is it limited to text=True?
comment:9 by , 5 years ago
It's a good question. Probably better to add the oneliner=True option unless someone has a good answer otherwise.
comment:11 by , 5 years ago
Replying to Peter Suter:
Or is
jinja2templateinherently intended only for oneliners, and multiline templates should always usechrome.render_template_stringinstead?
I think this is the right question. The notification body is rendered using text=True but chrome.render_template_string is used.
A plugin implementing notification might use inline source for the notification body, and that inline source might have statements. The inline source code might be plain text (text=True) or HTML (text=False).
Instead, added a utility function in trac.ticket.notification that avoids explicitly adding an argument to jinja2template. Instead, jinja2template supports pass-through of arguments to jinjaenv: [59709a6e8/rjollos.git]
comment:12 by , 5 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |



In trac.ticket.notification.TicketFormatter._format_subj and
._format_subj_batchmodifythe calls to trac.util.text.jinja2template useline_statement_prefix='#'.The default
line_statement_prefix=None(and similar forline_comment_prefix) is probably better for such single-line templates.