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)