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('