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.

Reply via email to