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