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