The post_process_request receives the returned values from process_request. For Jinja2 templates, the process_request should return a tuple of (template, data).
See https://trac.edgewall.org/wiki/TracDev/PortingFromGenshiToJinja#IRequestHandler Therefore, before implementing IRequestFilter interface, the returned values of process_request should be modified and the template should be ported to Jinja2 from Genshi. Index: trachours/hours.py =================================================================== --- trachours/hours.py (revision 18705) +++ trachours/hours.py (working copy) @@ -384,8 +384,8 @@ data['queries'] = get_all_dict(self.env, """ SELECT id, title, description, query FROM ticket_time_query """) - return 'hours_listqueries.html', data, 'text/html' - return 'hours_savequery.html', data, 'text/html' + return 'hours_listqueries.html', data + return 'hours_savequery.html', data def process_query(self, req): """redict to save, edit or delete a query based on arguments""" @@ -842,7 +842,7 @@ add_stylesheet(req, 'common/css/report.css') add_script(req, 'common/js/query.js') - return 'hours_timeline.html', data, 'text/html' + return 'hours_timeline.html', data def process_ticket(self, req): """process a request to /hours/<ticket number>""" @@ -901,7 +901,7 @@ add_ctxtnav(req, 'Back to Ticket #%s' % ticket_id, req.href.ticket(ticket_id)) - return 'hours_ticket.html', data, 'text/html' + return 'hours_ticket.html', data # Methods for transforming data to rss Index: trachours/multiproject.py =================================================================== --- trachours/multiproject.py (revision 18705) +++ trachours/multiproject.py (working copy) @@ -204,7 +204,7 @@ data['total'] = hours_format % total - return 'hours_multiproject.html', data, 'text/html' + return 'hours_multiproject.html', data if __name__ == '__main__': Index: trachours/web_ui.py =================================================================== --- trachours/web_ui.py (revision 18705) +++ trachours/web_ui.py (working copy) @@ -311,7 +311,7 @@ # _('Next Week')) # prevnext_nav(req, _('Prev Week'), _('Next Week')) - return 'hours_users.html', data, "text/html" + return 'hours_users.html', data def user(self, req, user): """hours page for a single user""" @@ -360,7 +360,7 @@ req.send(buffer.getvalue(), 'text/csv') - return 'hours_user.html', data, 'text/html' + return 'hours_user.html', data def export_csv(self, req, data, sep=',', mimetype='text/csv'): content = StringIO() On 2025/08/27 10:59, Rob Hills wrote: > I'm using https://trac.edgewall.org/wiki/TracDev/PortingFromGenshiToJinja as > a guide to help me update the TracHours plugin > <https://trac-hacks.org/wiki/TracHoursPlugin> to work with Trac 1.6 > > I have implemented the IRequestFilter interface and added a > post_process_request() method which returns three results: template, data > and content_type, as shown in the Porting from Genshi to Jinja howto > <https://trac.edgewall.org/wiki/TracDev/PortingFromGenshiToJinja#ImplementIRequestFilter.post_process_requesttoconditionallyaddJavaScriptcode>. > The content_type variable is passed in via the method call and not altered, > and is the string "text/html" > > However, when this gets processed via trac.web.main here > <https://github.com/edgewall/trac/blob/0dde63bb84da28ad87f1a3d3d7bea7b55d415620/trac/web/main.py#L250>, > the content_type variable returned by the post_process_request() method gets > transferred into the metadata variable and a few lines down here > <https://github.com/edgewall/trac/blob/0dde63bb84da28ad87f1a3d3d7bea7b55d415620/trac/web/main.py#L264>, > the code expects metadata to have a "setdefault" method. As it's a string, > it doesn't have this method and hence throws the AttributeError "''str' > object has no attribute 'setdefault'". > > I suspect I'm doing something wrong in my code, but I'm not sure what! > > Rob Hills > Waikiki, Western Australia > > > On Wednesday, 27 August 2025 at 01:16:21 UTC+8 RjOllos wrote: > > On Tuesday, August 26, 2025 at 5:45:49 AM UTC-7 [email protected] wrote: > > I posted this > <https://groups.google.com/g/trac-hacks/c/_FJQMrNekZQ/m/FZ81e_N-AAAJ> on the > Trac Hacks group but got no replies. Is that group still going? > > > It's dead. > > > > Should I post the original query here instead? > > > Yes, please do. > > -- > You received this message because you are subscribed to the Google Groups > "Trac Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion visit > https://groups.google.com/d/msgid/trac-users/3341c5e4-b7a9-4d44-b121-daba8f3a05ecn%40googlegroups.com > > <https://groups.google.com/d/msgid/trac-users/3341c5e4-b7a9-4d44-b121-daba8f3a05ecn%40googlegroups.com?utm_medium=email&utm_source=footer>. -- Jun Omae <[email protected]> (大前 潤) -- You received this message because you are subscribed to the Google Groups "Trac Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/trac-users/97494b08-df1d-4edf-b669-ea33102ac3e3%40gmail.com.
