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)


Reply via email to