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)
 


Reply via email to