Author: andrej
Date: Wed Mar 13 15:53:52 2013
New Revision: 1456009

URL: http://svn.apache.org/r1456009
Log:
Adding support of IResourceChangeListener to ModelBase and subsequently to 
Product

Modified:
    incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py
    incubator/bloodhound/trunk/bloodhound_multiproduct/multiproduct/model.py
    incubator/bloodhound/trunk/bloodhound_multiproduct/tests/model.py

Modified: incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py?rev=1456009&r1=1456008&r2=1456009&view=diff
==============================================================================
--- incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py 
(original)
+++ incubator/bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py Wed 
Mar 13 15:53:52 2013
@@ -18,7 +18,7 @@
 
 from trac.db import Table, Column
 from trac.core import TracError
-from trac.resource import ResourceNotFound
+from trac.resource import ResourceNotFound, ResourceSystem
 from trac.ticket.api import TicketSystem
 
 
@@ -132,9 +132,11 @@ class ModelBase(object):
         with self._env.db_transaction as db:
             db(sql, values)
             self._exists = False
-            self._data = dict([(k, None) for k in self._data.keys()])
-            self._old_data.update(self._data)
             TicketSystem(self._env).reset_ticket_fields()
+        ResourceSystem(self._env).resource_deleted(self)
+        self._data = dict([(k, None) for k in self._data.keys()])
+        self._old_data.update(self._data)
+
     
     def insert(self):
         """Create new record in the database"""
@@ -172,6 +174,7 @@ class ModelBase(object):
             self._exists = True
             self._old_data.update(self._data)
             TicketSystem(self._env).reset_ticket_fields()
+        ResourceSystem(self._env).resource_created(self)
 
     def _update_relations(self, db):
         """Extra actions due to update"""
@@ -200,11 +203,15 @@ class ModelBase(object):
         sdata.update(self._meta)
         sql = """UPDATE %(table_name)s SET %(values)s
                  WHERE %(where)s""" % sdata
+        old_data = self._old_data.copy()
         with self._env.db_transaction as db:
             db(sql, setvalues + values)
             self._update_relations(db)
             self._old_data.update(self._data)
             TicketSystem(self._env).reset_ticket_fields()
+
+        ResourceSystem(self._env).resource_changed(self, old_data)
+
     
     @classmethod
     def select(cls, env, db=None, where=None):

Modified: 
incubator/bloodhound/trunk/bloodhound_multiproduct/multiproduct/model.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/trunk/bloodhound_multiproduct/multiproduct/model.py?rev=1456009&r1=1456008&r2=1456009&view=diff
==============================================================================
--- incubator/bloodhound/trunk/bloodhound_multiproduct/multiproduct/model.py 
(original)
+++ incubator/bloodhound/trunk/bloodhound_multiproduct/multiproduct/model.py 
Wed Mar 13 15:53:52 2013
@@ -53,9 +53,10 @@ class Product(ModelBase):
                 sdata.update(self._meta)
                 raise TracError('%(object_name)s %(new_table)s does not exist' 
%
                                 sdata)
+        original_prefix = self._data['prefix']
         super(Product, self).delete()
         #find and update all resources that should move
-        where = {'product_id':self._data['prefix']}
+        where = {'product_id':original_prefix}
         for prm in ProductResourceMap.select(self._env, where=where):
             prm._data['product_id'] = resources_to
             prm.update()

Modified: incubator/bloodhound/trunk/bloodhound_multiproduct/tests/model.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/trunk/bloodhound_multiproduct/tests/model.py?rev=1456009&r1=1456008&r2=1456009&view=diff
==============================================================================
--- incubator/bloodhound/trunk/bloodhound_multiproduct/tests/model.py (original)
+++ incubator/bloodhound/trunk/bloodhound_multiproduct/tests/model.py Wed Mar 
13 15:53:52 2013
@@ -28,9 +28,14 @@ from trac.core import TracError
 
 from multiproduct.model import Product
 from multiproduct.api import MultiProductSystem
+from trac.tests.resource import TestResourceChangeListener
 
 class ProductTestCase(unittest.TestCase):
     """Unit tests covering the Product model"""
+    INITIAL_PREFIX = 'tp'
+    INITIAL_NAME = 'test project'
+    INITIAL_DESCRIPTION = 'a test project'
+
     def setUp(self):
         self.env = EnvironmentStub(enable=['trac.*', 'multiproduct.*'])
         self.env.path = tempfile.mkdtemp('bh-product-tempenv')
@@ -42,18 +47,32 @@ class ProductTestCase(unittest.TestCase)
             # table remains but database version is deleted
             pass
         
-        self.default_data = {'prefix':'tp',
-                             'name':'test project',
-                             'description':'a test project'}
-        
-        product = Product(self.env)
-        product._data.update(self.default_data)
-        product.insert()
-    
+        self.listener = self._enable_resource_change_listener()
+        self.default_data = {'prefix':self.INITIAL_PREFIX,
+                             'name':self.INITIAL_NAME,
+                             'description':self.INITIAL_DESCRIPTION}
+        
+        self.product = Product(self.env)
+        self.product._data.update(self.default_data)
+        self.product.insert()
+
     def tearDown(self):
         shutil.rmtree(self.env.path)
         self.env.reset_db()
     
+    def _enable_resource_change_listener(self):
+        listener = TestResourceChangeListener(self.env)
+        listener.resource_type = Product
+        listener.callback = self.listener_callback
+        return listener
+
+    def listener_callback(self, action, resource, context, old_values = None):
+        # pylint: disable=unused-argument
+        # pylint: disable=attribute-defined-outside-init
+        self.prefix = resource.prefix
+        self.name = resource.name
+        self.description = resource.description
+
     def test_set_table_field(self):
         """tests that table.field style update works"""
         test = {'prefix': 'td',
@@ -91,10 +110,11 @@ class ProductTestCase(unittest.TestCase)
         
         products = list(Product.select(self.env, where={'prefix':'tp'}))
         self.assertEqual(1, len(products))
-        products = list(Product.select(self.env, where={'name':'test 
project'}))
+        products = list(Product.select(self.env,
+            where={'name':'test project'}))
         self.assertEqual(1, len(products))
-        products = list(Product.select(self.env, where={'prefix':'tp3',
-                                                        'name':'test project 
3'}))
+        products = list(Product.select(self.env,
+            where={'prefix':'tp3', 'name':'test project 3'}))
         self.assertEqual(1, len(products))
     
     def test_update(self):
@@ -200,12 +220,44 @@ class ProductTestCase(unittest.TestCase)
         structure =  dict([(table.name, [col.name for col in table.columns])
                            for table in schema])
         tm1 = TestModel(self.env)
-        tm1._data.update({'id':1,'value':'value1'})
+        tm1._data.update({'id':1, 'value':'value1'})
         tm1.insert()
         tm2 = TestModel(self.env)
-        tm2._data.update({'id':2,'value':'value2'})
+        tm2._data.update({'id':2, 'value':'value2'})
         tm2.insert()
 
+    def test_change_listener_created(self):
+        self.assertEqual('created', self.listener.action)
+        self.assertIsInstance(self.listener.resource, Product)
+        self.assertEqual(self.INITIAL_PREFIX, self.prefix)
+        self.assertEqual(self.INITIAL_NAME, self.name)
+        self.assertEqual(self.INITIAL_DESCRIPTION, self.description)
+
+    def test_change_listener_changed(self):
+        CHANGED_NAME = "changed name"
+        self.product.name = CHANGED_NAME
+        self.product.update()
+        self.assertEqual('changed', self.listener.action)
+        self.assertIsInstance(self.listener.resource, Product)
+        self.assertEqual(CHANGED_NAME, self.name)
+        self.assertEqual(
+            self.INITIAL_PREFIX, self.listener.old_values["prefix"])
+        self.assertEqual(
+            self.INITIAL_NAME, self.listener.old_values["name"])
+        self.assertEqual(
+            self.INITIAL_DESCRIPTION, self.listener.old_values["description"])
+
+    def test_change_listener_deleted(self):
+        self.product.delete()
+        self.assertEqual('deleted', self.listener.action)
+        self.assertIsInstance(self.listener.resource, Product)
+        self.assertEqual(self.INITIAL_PREFIX, self.prefix)
+
+def suite():
+    test_suite = unittest.TestSuite()
+    test_suite.addTest(unittest.makeSuite(ProductTestCase, 'test'))
+    return test_suite
+
 if __name__ == '__main__':
     unittest.main()
 


Reply via email to