diff --git a/trac/ticket/templates/query.html b/trac/ticket/templates/query.html
index 6cd43de9e3..3dface0f3f 100644
--- a/trac/ticket/templates/query.html
+++ b/trac/ticket/templates/query.html
@@ -333,7 +333,7 @@
${title} (${
# include 'query_results.html'
- # if tickets:
+ # if tickets and batch_modify:
# include 'batch_modify.html' ignore missing
# endif
diff --git a/trac/ticket/tests/batch.py b/trac/ticket/tests/batch.py
index 9abc820569..b690b64530 100644
--- a/trac/ticket/tests/batch.py
+++ b/trac/ticket/tests/batch.py
@@ -15,15 +15,18 @@
from datetime import datetime, timedelta
from trac.core import Component, implements
-from trac.perm import DefaultPermissionPolicy, DefaultPermissionStore, \
- PermissionSystem
+from trac.perm import (
+ DefaultPermissionPolicy, DefaultPermissionGroupProvider,
+ DefaultPermissionStore, PermissionSystem,
+)
from trac.test import EnvironmentStub, MockRequest, makeSuite
from trac.ticket import api, default_workflow, model, web_ui
from trac.ticket.batch import BatchModifyModule
from trac.ticket.test import insert_ticket
+from trac.ticket.query import QueryModule
from trac.util.datefmt import datetime_now, utc
from trac.web.api import HTTPBadRequest, RequestDone
-from trac.web.chrome import web_context
+from trac.web.chrome import Chrome, web_context
from trac.web.session import DetachedSession
@@ -183,8 +186,9 @@ def tearDownClass(cls):
def setUp(self):
self.env = EnvironmentStub(default_data=True, enable=[
default_workflow.ConfigurableTicketWorkflow,
- DefaultPermissionPolicy, DefaultPermissionStore,
- BatchModifyModule, api.TicketSystem, web_ui.TicketModule
+ DefaultPermissionPolicy, DefaultPermissionGroupProvider,
+ DefaultPermissionStore, Chrome, QueryModule,
+ BatchModifyModule, api.TicketSystem, web_ui.TicketModule,
])
self.env.config.set('trac', 'permission_policies',
'DefaultPermissionPolicy')
@@ -234,6 +238,17 @@ def _insert_component(self, name):
component.name = name
component.insert()
+ def _process_query_request(self, req):
+ query_mod = QueryModule(self.env)
+ self.assertTrue(query_mod.match_request(req))
+ batch_mod = BatchModifyModule(self.env)
+ batch_mod.pre_process_request(req, query_mod)
+ template, data = query_mod.process_request(req)
+ return batch_mod.post_process_request(req, template, data, {})
+
+ def _render_fragment(self, req, template, data):
+ return Chrome(self.env).render_fragment(req, template, data)
+
def test_require_post_method(self):
"""Request must use POST method."""
module = BatchModifyModule(self.env)
@@ -779,6 +794,23 @@ def test_post_process_request_error_handling(self):
self.assertEqual((None, None, None),
module.post_process_request(req, None, None, None))
+ def test_view_without_batch_modify(self):
+ req = MockRequest(self.env, path_info='/query', authname='user1',
+ args={'status': '!closed'})
+ template, data, metadata = self._process_query_request(req)
+ self.assertNotIn('batch_modify', data)
+ fragment = self._render_fragment(req, template, data)
+ self.assertNotIn('