Author: jure Date: Thu Mar 14 13:50:59 2013 New Revision: 1456434 URL: http://svn.apache.org/r1456434 Log: Removed ProductDelegate, leverage IResourceChangeListener to populate schema on product addition
Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/web_ui.py Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py?rev=1456434&r1=1456433&r2=1456434&view=diff ============================================================================== --- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py (original) +++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/api.py Thu Mar 14 13:50:59 2013 @@ -38,6 +38,7 @@ from trac.web.main import FakePerm, Fake from trac.wiki.api import IWikiSyntaxProvider from trac.wiki.formatter import LinkFormatter from trac.wiki.parser import WikiParser +from trac.resource import IResourceChangeListener from multiproduct.model import Product, ProductResourceMap, ProductSetting from multiproduct.util import EmbeddedLinkFormatter, IDENTIFIER @@ -71,7 +72,8 @@ class MultiProductSystem(Component): implements(IEnvironmentSetupParticipant, ITemplateProvider, IPermissionRequestor, ITicketFieldProvider, IResourceManager, - ISupportMultiProductEnvironment, IWikiSyntaxProvider) + ISupportMultiProductEnvironment, IWikiSyntaxProvider, + IResourceChangeListener) product_base_url = Option('multiproduct', 'product_base_url', '', """A pattern used to generate the base URL of product environments, @@ -96,12 +98,17 @@ class MultiProductSystem(Component): for mcls in (Product, ProductResourceMap)] # Tables which should be migrated (extended with 'product' column) - MIGRATE_TABLES = ['enum', 'component', 'milestone', 'version', + MIGRATE_TABLES = ['component', + 'milestone', + 'version', + 'enum', 'permission', 'wiki', 'report', ] + PRODUCT_POPULATE_TABLES = list(set(MIGRATE_TABLES) - set(['wiki'])) + def get_version(self): """Finds the current version of the bloodhound database schema""" rows = self.env.db_direct_query(""" @@ -195,13 +202,8 @@ class MultiProductSystem(Component): [t for t in table_defs if t.name == table.name][0].columns] if c != 'product'] self.log.info("Creating default product") - default_product = Product(self.env) - default_product.update_field_dict({'prefix': DEFAULT_PRODUCT, - 'name': 'Default', - 'description': 'Default product', - 'owner': '', - }) - default_product.insert() + db("INSERT INTO bloodhound_product (prefix, name, description, owner) " \ + "VALUES ('%s', '%s', '%s', '')" % (DEFAULT_PRODUCT, 'Default', 'Default product')) self.log.info("Migrating tickets w/o product to default product") db("""UPDATE ticket SET product='%s' @@ -290,6 +292,54 @@ class MultiProductSystem(Component): self.env.enable_multiproduct_schema(True) + + # IResourceChangeListener methods + def match_resource(self, resource): + return isinstance(resource, Product) + + def resource_created(self, resource, context): + import trac.db_default + from multiproduct.env import EnvironmentStub + + # Don't populate product database when running from within test + # environment stub as test cases really don't expect that ... + if isinstance(self.env, EnvironmentStub): + return + + product = resource + self.log.debug("Adding product info (%s) to tables:" % product.prefix) + with self.env.db_direct_transaction as db: + # create the default entries for this Product from defaults + for table in trac.db_default.get_data(db): + if not table[0] in self.PRODUCT_POPULATE_TABLES: + continue + + self.log.debug(" -> %s" % table[0]) + cols = table[1] + ('product', ) + rows = [p + (product.prefix, ) for p in table[2]] + db.executemany( + "INSERT INTO %s (%s) VALUES (%s)" % + (table[0], ','.join(cols), ','.join(['%s' for c in cols])), + rows) + + # in addition copy global admin permissions (they are + # not part of the default permission table) + rows = db("""SELECT username FROM permission WHERE action='TRAC_ADMIN' + AND product=''""") + rows = [(r[0], 'TRAC_ADMIN', product.prefix) for r in rows] + cols = ('username', 'action', 'product') + db.executemany("INSERT INTO permission (%s) VALUES (%s)" % + (','.join(cols), ','.join(['%s' for c in cols])), rows) + + def resource_changed(self, resource, old_values, context): + return + + def resource_deleted(self, resource, context): + return + + def resource_version_deleted(self, resource, context): + return + # ITemplateProvider methods def get_templates_dirs(self): """provide the plugin templates""" Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py?rev=1456434&r1=1456433&r2=1456434&view=diff ============================================================================== --- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py (original) +++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py Thu Mar 14 13:50:59 2013 @@ -27,7 +27,6 @@ from trac.resource import ResourceNotFou from model import Product from trac.util.translation import _, N_, gettext from trac.web.chrome import Chrome, add_notice, add_warning -from multiproduct.util import ProductDelegate from multiproduct.env import ProductEnvironment @@ -82,10 +81,11 @@ class ProductAdminPanel(TicketAdminPanel prod = Product(self.env, keys) except ResourceNotFound: prod = Product(self.env) - ProductDelegate.add_product(self.env, prod, keys, field_data) - add_notice(req, - _('The product "%(id)s" has been added.', - id=prefix)) + prod.update_field_dict(keys) + prod.update_field_dict(field_data) + prod.insert() + add_notice(req, _('The product "%(id)s" has been added.', + id=prefix)) req.redirect(req.href.admin(cat, page)) else: if prod.prefix is None: Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py?rev=1456434&r1=1456433&r2=1456434&view=diff ============================================================================== --- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py (original) +++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py Thu Mar 14 13:50:59 2013 @@ -20,44 +20,9 @@ from genshi.builder import tag -from trac import db_default from trac.util.text import unquote_label from trac.wiki.formatter import LinkFormatter -class ProductDelegate(object): - @staticmethod - def add_product(env, product, keys, field_data): - from multiproduct.api import MultiProductSystem - - product.update_field_dict(keys) - product.update_field_dict(field_data) - product.insert() - - env.log.debug("Adding product info (%s) to tables:" % product.prefix) - with env.db_direct_transaction as db: - # create the default entries for this Product from defaults - for table in db_default.get_data(db): - if not table[0] in MultiProductSystem.MIGRATE_TABLES: - continue - - env.log.debug(" -> %s" % table[0]) - cols = table[1] + ('product', ) - rows = [p + (product.prefix, ) for p in table[2]] - db.executemany( - "INSERT INTO %s (%s) VALUES (%s)" % - (table[0], ','.join(cols), ','.join(['%s' for c in cols])), - rows) - - # in addition copy global admin permissions (they are - # not part of the default permission table) - rows = db("""SELECT username FROM permission WHERE action='TRAC_ADMIN' - AND product=''""") - rows = [(r[0], 'TRAC_ADMIN', product.prefix) for r in rows] - cols = ('username', 'action', 'product') - db.executemany("INSERT INTO permission (%s) VALUES (%s)" % - (','.join(cols), ','.join(['%s' for c in cols])), rows) - - #-------------------------- # Custom wiki formatters #-------------------------- Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/web_ui.py URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/web_ui.py?rev=1456434&r1=1456433&r2=1456434&view=diff ============================================================================== --- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/web_ui.py (original) +++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/web_ui.py Thu Mar 14 13:50:59 2013 @@ -34,7 +34,6 @@ from trac.web.chrome import (add_link, a from trac.web.main import RequestDispatcher from multiproduct.model import Product -from multiproduct.util import ProductDelegate from multiproduct.api import DEFAULT_PRODUCT PRODUCT_RE = re.compile(r'^/products/(?P<pid>[^/]*)(?P<pathinfo>.*)') @@ -268,9 +267,12 @@ class ProductModule(Component): 'choose a different name.', name=name)) if not warnings: - ProductDelegate.add_product(self.env, product, keys, field_data) + prod = Product(self.env) + prod.update_field_dict(keys) + prod.update_field_dict(field_data) + prod.insert() add_notice(req, _('The product "%(id)s" has been added.', - id=prefix)) + id=prefix)) if warnings: product.update_field_dict(keys)