Author: jure
Date: Wed Mar 27 09:32:50 2013
New Revision: 1461467
URL: http://svn.apache.org/r1461467
Log:
#475, product CRUD commands, patch t475_r1460340_product_trac_admin_crud.diff
applied (from Olemis)
Modified:
bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py
Modified:
bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py
URL:
http://svn.apache.org/viewvc/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py?rev=1461467&r1=1461466&r2=1461467&view=diff
==============================================================================
---
bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py
(original)
+++
bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/product_admin.py
Wed Mar 27 09:32:50 2013
@@ -27,7 +27,7 @@ from trac.perm import PermissionSystem
from trac.resource import ResourceNotFound
from trac.ticket.admin import TicketAdminPanel, _save_config
from trac.util import lazy
-from trac.util.text import print_table
+from trac.util.text import print_table, to_unicode
from trac.util.translation import _, N_, gettext
from trac.web.api import HTTPNotFound, IRequestFilter, IRequestHandler
from trac.web.chrome import Chrome, add_notice, add_warning
@@ -47,9 +47,21 @@ class ProductAdminPanel(TicketAdminPanel
def get_admin_commands(self):
if not isinstance(self.env, ProductEnvironment):
+ yield ('product add', '<prefix> <owner> <name>',
+ 'Add a new product',
+ None, self._do_product_add)
+ yield ('product chown', '<prefix> <owner>',
+ 'Change product ownership',
+ self._complete_product, self._do_product_chown)
yield ('product list', '',
'Show available products',
None, self._do_product_list)
+ yield ('product remove', '<prefix>',
+ 'Remove/uninstall a product',
+ self._complete_product, self._do_product_remove)
+ yield ('product rename', '<prefix> <newname>',
+ 'Rename a product',
+ self._complete_product, self._do_product_rename)
def get_admin_panels(self, req):
if isinstance(req.perm.env, ProductEnvironment):
@@ -138,12 +150,43 @@ class ProductAdminPanel(TicketAdminPanel
data['owners'] = None
return 'admin_products.html', data
+ def load_product(self, prefix):
+ products = Product.select(self.env, where={'prefix' : prefix})
+ if not products:
+ raise AdminCommandError('Unknown product %s' % (prefix,))
+ return products[0]
+
+ def _complete_product(self, args):
+ if len(args) == 1:
+ return get_products(self.env)
+
+ def _do_product_add(self, prefix, owner, name):
+ product = Product(self.env)
+ product._data.update({'prefix':prefix, 'name':name, 'owner':owner})
+ try:
+ product.insert()
+ except TracError, exc:
+ raise AdminCommandError(to_unicode(exc))
+
+ def _do_product_chown(self, prefix, owner):
+ product = self.load_product(prefix)
+ product._data['owner'] = owner
+ product.update()
+
def _do_product_list(self):
if not isinstance(self.env, ProductEnvironment):
print_table([(p.prefix, p.owner, p.name)
for p in Product.select(self.env)],
[_('Prefix'), _('Owner'), _('Name')])
+ def _do_product_remove(self, prefix):
+ raise AdminCommandError(_("Command 'product remove' not supported
yet"))
+
+ def _do_product_rename(self, prefix, newname):
+ product = self.load_product(prefix)
+ product._data['name'] = newname
+ product.update()
+
#--------------------------
# Advanced administration in product context
@@ -227,9 +270,6 @@ class ProductAdminModule(Component):
'Execute admin (sub-)command upon product resources',
self._complete_product_admin, self._do_product_admin)
- def get_products(self):
- return [p.prefix for p in Product.select(self.env)]
-
def product_admincmd_mgr(self, prefix):
try:
product_env = ProductEnvironment.lookup_env(self.env, prefix)
@@ -240,7 +280,7 @@ class ProductAdminModule(Component):
def _complete_product_admin(self, args):
if len(args) == 1:
- return self.get_products()
+ return get_products(self.env)
else:
mgr = self.product_admincmd_mgr(args[0])
return mgr.complete_command(args[1:])
@@ -308,6 +348,10 @@ class ProductAdminModule(Component):
and (cat_id, panel_id) != ('general', 'plugin') # double-check !
+def get_products(env):
+ return [p.prefix for p in Product.select(env)]
+
+
class DefaultProductAdminWhitelist(Component):
implements(IProductAdminAclContributor)