Author: astaric
Date: Wed May 22 11:08:38 2013
New Revision: 1485148

URL: http://svn.apache.org/r1485148
Log:
Configurable default_product_prefix.

Added options multiproduct.default_product_prefix, that can
be used to set prefix for default product. It can be set 
in trac.ini before env is upgraded to multiproduct or by passing
--default-product-prefix to bloodhound_setup.

Modified:
    bloodhound/trunk/bloodhound_multiproduct/multiproduct/api.py
    bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py
    bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py
    bloodhound/trunk/bloodhound_multiproduct/tests/web_ui.py
    bloodhound/trunk/installer/bloodhound_setup.py

Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/api.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/api.py?rev=1485148&r1=1485147&r2=1485148&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/api.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/api.py Wed May 22 
11:08:38 2013
@@ -47,14 +47,12 @@ from multiproduct.dbcursor import GLOBAL
 from multiproduct.model import Product, ProductResourceMap, ProductSetting
 from multiproduct.util import EmbeddedLinkFormatter, IDENTIFIER
 
-__all__ = ['MultiProductSystem', 'PRODUCT_SYNTAX_DELIMITER', 'DEFAULT_PRODUCT']
+__all__ = ['MultiProductSystem', 'PRODUCT_SYNTAX_DELIMITER']
 
 DB_VERSION = 4
 DB_SYSTEM_KEY = 'bloodhound_multi_product_version'
 PLUGIN_NAME = 'Bloodhound multi product'
 
-DEFAULT_PRODUCT = '@'
-
 class ISupportMultiProductEnvironment(Interface):
     """Extension point interface for components that are aware of multi
     product environment and its specifics.
@@ -79,6 +77,13 @@ class MultiProductSystem(Component):
                ISupportMultiProductEnvironment, ITemplateProvider, 
                ITicketFieldProvider, IWikiSyntaxProvider, ITicketManipulator)
 
+    default_product_prefix = Option(
+        'multiproduct',
+        'default_product_prefix',
+        default='@',
+        doc="""Prefix used for default product when migrating single-product
+        installations to multi-product.""")
+
     product_base_url = Option('multiproduct', 'product_base_url', '',
         """A pattern used to generate the base URL of product environments,
         e.g. the use cases listed in bh:wiki:/Proposals/BEP-0003#url-mapping .
@@ -312,7 +317,7 @@ class MultiProductSystem(Component):
         self.log.info("Creating default product")
         db("""INSERT INTO bloodhound_product (prefix, name, description, owner)
               VALUES ('%s', '%s', '%s', '')
-           """ % (DEFAULT_PRODUCT, 'Default', 'Default product'))
+           """ % (self.default_product_prefix, 'Default', 'Default product'))
 
     def _upgrade_tickets(self, db, TICKET_TABLES, create_temp_table):
         # migrate tickets that don't have product assigned to default product
@@ -323,14 +328,14 @@ class MultiProductSystem(Component):
         self.log.info("Migrating tickets w/o product to default product")
         db("""UPDATE ticket SET product='%s'
                       WHERE (product IS NULL OR product='')
-           """ % DEFAULT_PRODUCT)
+           """ % self.default_product_prefix)
         self._migrate_attachments(
             db("""SELECT a.type, a.id, a.filename
                             FROM attachment a
                       INNER JOIN ticket t ON a.id = %(t.id)s
                            WHERE a.type='ticket'
                        """ % {'t.id': db.cast('t.id', 'text')}),
-            to_product=DEFAULT_PRODUCT
+            to_product=self.default_product_prefix
         )
         self.log.info("Migrating ticket tables to a new schema")
         for table in TICKET_TABLES:
@@ -392,18 +397,18 @@ class MultiProductSystem(Component):
            """ % dict(table=table,
                       temp_table=temp_table_name,
                       cols=cols,
-                      default_product=DEFAULT_PRODUCT,))
+                      default_product=self.default_product_prefix,))
         db("""UPDATE attachment
                  SET product='%s'
                WHERE attachment.type='wiki'
-           """ % DEFAULT_PRODUCT)
+           """ % self.default_product_prefix)
         self._migrate_attachments(
             db("""SELECT type, id, filename
                     FROM attachment
                    WHERE type='wiki'
                      AND product='%s'
-               """ % (DEFAULT_PRODUCT)),
-            to_product=DEFAULT_PRODUCT,
+               """ % (self.default_product_prefix)),
+            to_product=self.default_product_prefix,
         )
         self._drop_temp_table(db, temp_table_name)
 
@@ -450,7 +455,7 @@ class MultiProductSystem(Component):
                 continue
             db("""INSERT INTO repository (id, name, value)
                           VALUES (%s, 'product', '%s')""" %
-               (id, DEFAULT_PRODUCT))
+               (id, self.default_product_prefix))
             repositories_linked.append(id)
             self.log.info("Repository '%s' (%s) soft linked to default 
product",
                           name, id)

Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py?rev=1485148&r1=1485147&r2=1485148&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py Wed May 22 
11:08:38 2013
@@ -63,8 +63,10 @@ class MultiProductEnvironmentFactory(Env
         else:
             redirect = REDIRECT_DEFAULT_RE.match(path_info)
             if redirect:
-                from multiproduct.api import DEFAULT_PRODUCT
-                env = create_product_env(DEFAULT_PRODUCT,
+                from multiproduct.api import MultiProductSystem
+                default_product_prefix = \
+                    MultiProductSystem(global_env).default_product_prefix
+                env = create_product_env(default_product_prefix,
                                          environ['SCRIPT_NAME'],
                                          environ['PATH_INFO'])
         return env

Modified: bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py?rev=1485148&r1=1485147&r2=1485148&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/tests/upgrade.py Wed May 22 
11:08:38 2013
@@ -340,6 +340,17 @@ class EnvironmentUpgradeTestCase(unittes
         with self.env.db_direct_transaction as db:
             db('SELECT * FROM "p1_dummy_table"')
 
+    def test_migrating_to_multiproduct_with_custom_default_prefix(self):
+        ticket = self.insert_ticket('ticket')
+
+        self.env.config.set('multiproduct', 'default_product_prefix', 'xxx')
+        self._enable_multiproduct()
+        self.env.upgrade()
+
+        products = Product.select(self.env)
+        self.assertEqual(len(products), 1)
+        self.assertEqual(products[0].prefix, 'xxx')
+
     def _enable_multiproduct(self):
         self._update_config('components', 'multiproduct.*', 'enabled')
 

Modified: bloodhound/trunk/bloodhound_multiproduct/tests/web_ui.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/tests/web_ui.py?rev=1485148&r1=1485147&r2=1485148&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/tests/web_ui.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/tests/web_ui.py Wed May 22 
11:08:38 2013
@@ -30,7 +30,7 @@ from trac.web.api import HTTPInternalErr
 from trac.web.href import Href
 from trac.web.main import RequestDispatcher
 
-from multiproduct.api import DEFAULT_PRODUCT
+from multiproduct.api import MultiProductSystem
 from multiproduct.env import ProductEnvironment
 from multiproduct.model import Product
 from multiproduct.web_ui import ProductModule
@@ -174,10 +174,12 @@ class ProductModuleTestCase(RequestHandl
         req.authname = 'testuser'
         req.environ['PATH_INFO'] = '/products'
 
+        mps = MultiProductSystem(self.global_env)
         def assert_product_list(req, template, data, content_type):
             self.assertEquals('product_list.html', template)
             self.assertIs(None, content_type)
-            self.assertEquals([DEFAULT_PRODUCT, self.default_product], 
+            self.assertEquals([mps.default_product_prefix,
+                               self.default_product],
                               [p.prefix for p in data.get('products')])
             self.assertTrue('context' in data)
             ctx = data['context']

Modified: bloodhound/trunk/installer/bloodhound_setup.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/installer/bloodhound_setup.py?rev=1485148&r1=1485147&r2=1485148&view=diff
==============================================================================
--- bloodhound/trunk/installer/bloodhound_setup.py (original)
+++ bloodhound/trunk/installer/bloodhound_setup.py Wed May 22 11:08:38 2013
@@ -215,6 +215,12 @@ class BloodhoundSetup(object):
                   "repository-type and the repository-path options."
             return False
 
+        custom_prefix = 'default_product_prefix'
+        if custom_prefix in options and options[custom_prefix]:
+            default_product_prefix = options[custom_prefix]
+        else:
+            default_product_prefix = '@'
+
         digestfile = os.path.abspath(os.path.join(new_env,
                                                   options['digestfile']))
         realm =  options['realm']
@@ -253,6 +259,10 @@ class BloodhoundSetup(object):
                                                             
'bloodhound_multiproduct/multiproduct/hooks.py')))
         base_config['trac']['environment_factory'] = environment_factory_path
         base_config['trac']['request_factory'] = request_factory_path
+        if default_product_prefix != '@':
+            base_config['multiproduct'] = dict(
+                default_product_prefix=default_product_prefix
+            )
 
         self.writeconfig(baseini, [base_config, accounts_config])
 
@@ -283,13 +293,17 @@ class BloodhoundSetup(object):
         bloodhound.onecmd('wiki bh-upgrade')
 
         print "Loading default product wiki"
-        bloodhound.onecmd('product admin @ wiki load %s' % " ".join(pages))
+        bloodhound.onecmd('product admin %s wiki load %s' %
+                          (default_product_prefix,
+                           " ".join(pages)))
 
         print "Running default product wiki upgrades"
-        bloodhound.onecmd('product admin @ wiki upgrade')
+        bloodhound.onecmd('product admin %s wiki upgrade' %
+                          default_product_prefix)
 
         print "Running default product wiki Bloodhound upgrades"
-        bloodhound.onecmd('product admin @ wiki bh-upgrade')
+        bloodhound.onecmd('product admin %s wiki bh-upgrade' %
+                          default_product_prefix)
 
         print """
 You can now start Bloodhound by running:
@@ -392,6 +406,11 @@ def handle_options():
                       help='specify the repository type - ')
     parser.add_option('--repository-path', dest='repo_path',
                       help='specify the repository type')
+
+    # Multiproduct options
+    parser.add_option('--default-product-prefix', 
dest='default_product_prefix',
+                      help='Specify prefix for default product (defaults to @')
+
     (options, args) = parser.parse_args()
     if args:
         print "Unprocessed options/arguments: ", args


Reply via email to