Author: astaric
Date: Mon May 20 07:47:32 2013
New Revision: 1484388

URL: http://svn.apache.org/r1484388
Log:
Do not allow closing tickets with open children. Towards #528.

Modified:
    bloodhound/trunk/bloodhound_relations/bhrelations/api.py
    bloodhound/trunk/bloodhound_relations/bhrelations/tests/api.py
    bloodhound/trunk/bloodhound_relations/bhrelations/tests/validation.py

Modified: bloodhound/trunk/bloodhound_relations/bhrelations/api.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_relations/bhrelations/api.py?rev=1484388&r1=1484387&r2=1484388&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_relations/bhrelations/api.py (original)
+++ bloodhound/trunk/bloodhound_relations/bhrelations/api.py Mon May 20 
07:47:32 2013
@@ -460,7 +460,8 @@ class TicketRelationsSpecifics(Component
     def validate_ticket(self, req, ticket):
         action = req.args.get('action')
         if action == 'resolve':
-            blockers = RelationsSystem(self.env).find_blockers(
+            rls = RelationsSystem(self.env)
+            blockers = rls.find_blockers(
                 ticket, self.is_blocker)
             if blockers:
                 blockers_str = ', '.join(
@@ -471,6 +472,14 @@ class TicketRelationsSpecifics(Component
                        % blockers_str)
                 yield None, msg
 
+            for relation in [r for r in rls.get_relations(ticket)
+                             if r['type'] == rls.CHILDREN_RELATION_TYPE]:
+                ticket = 
self._create_ticket_by_full_id(relation['destination'])
+                if ticket['status'] != 'closed':
+                    msg = ("Cannot resolve this ticket because it has open"
+                           "child tickets.")
+                    yield None, msg
+
     def is_blocker(self, resource):
         ticket = self._create_ticket_by_full_id(resource)
         if ticket['status'] != 'closed':

Modified: bloodhound/trunk/bloodhound_relations/bhrelations/tests/api.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_relations/bhrelations/tests/api.py?rev=1484388&r1=1484387&r2=1484388&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_relations/bhrelations/tests/api.py (original)
+++ bloodhound/trunk/bloodhound_relations/bhrelations/tests/api.py Mon May 20 
07:47:32 2013
@@ -517,6 +517,19 @@ class ApiTestCase(BaseApiApiTestCase):
         except ValidationError:
             self.fail("Could not add valid relation.")
 
+    def test_cannot_close_ticket_with_open_children(self):
+        t1 = self._insert_and_load_ticket("1", status='closed')
+        t2 = self._insert_and_load_ticket("2", status='closed')
+        t3 = self._insert_and_load_ticket("3")
+        self.relations_system.add(t2, t1, "parent")
+        self.relations_system.add(t3, t1, "parent")
+
+        self.req.args["action"] = 'resolve'
+        warnings = TicketRelationsSpecifics(self.env).validate_ticket(
+            self.req, t1)
+        #assert
+        self.assertEqual(1, len(list(warnings)))
+
 
 class RelationChangingListenerTestCase(BaseApiApiTestCase):
     def test_can_sent_adding_event(self):

Modified: bloodhound/trunk/bloodhound_relations/bhrelations/tests/validation.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_relations/bhrelations/tests/validation.py?rev=1484388&r1=1484387&r2=1484388&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_relations/bhrelations/tests/validation.py 
(original)
+++ bloodhound/trunk/bloodhound_relations/bhrelations/tests/validation.py Mon 
May 20 07:47:32 2013
@@ -17,8 +17,7 @@
 #  KIND, either express or implied.  See the License for the
 #  specific language governing permissions and limitations
 #  under the License.
-
-from trac.test import Mock
+import unittest
 
 from bhrelations.validation import Validator
 from bhrelations.tests.api import BaseApiApiTestCase
@@ -92,4 +91,10 @@ class GraphFunctionsTestCase(BaseApiApiT
         )
 
 
+def suite():
+    test_suite = unittest.TestSuite()
+    test_suite.addTest(unittest.makeSuite(GraphFunctionsTestCase, 'test'))
+    return test_suite
 
+if __name__ == '__main__':
+    unittest.main()


Reply via email to