changeset 607:5d396356bf7a

0.6dev: Reworked UI for adding Target Platform. Like elsewhere in Trac web admin, 'New Target Platform' is now a fieldset to the right of the listing. This fixes the issue discussed on #333.
author osimons
date Fri, 31 Jul 2009 01:18:15 +0000
parents 07ac9218f649
children 3e018dcb1b91
files bitten/admin.py bitten/htdocs/admin.css bitten/templates/bitten_admin_configs.html bitten/tests/admin.py
diffstat 4 files changed, 30 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/admin.py
+++ b/bitten/admin.py
@@ -124,16 +124,9 @@
                             req.redirect(req.abs_href.admin(cat, page,
                                                             config_name))
                 else: # creating target platform
-                    if req.method == 'POST':
-                        if 'add' in req.args:
-                            self._create_platform(req, config_name)
-                            req.redirect(req.abs_href.admin(cat, page,
-                                                            config_name))
-                        elif 'cancel' in req.args:
-                            req.redirect(req.abs_href.admin(cat, page,
-                                                            config_name))
-
-                    platform = TargetPlatform(self.env, config=config_name)
+                    platform = self._create_platform(req, config_name)
+                    req.redirect(req.abs_href.admin(cat, page,
+                                            config_name, platform.id))
 
                 # Set up template variables
                 data['platform'] = {
@@ -151,11 +144,7 @@
                                                        config=config.name))
 
                 if req.method == 'POST':
-                    if 'add' in req.args: # Add target platform
-                        platform = self._create_platform(req, config)
-                        req.redirect(req.abs_href.admin(cat, page, config.name))
-
-                    elif 'remove' in req.args: # Remove selected platforms
+                    if 'remove' in req.args: # Remove selected platforms
                         self._remove_platforms(req)
                         req.redirect(req.abs_href.admin(cat, page, config.name))
 
@@ -298,12 +287,12 @@
     def _create_platform(self, req, config_name):
         req.perm.assert_permission('BUILD_MODIFY')
 
-        name = req.args.get('name')
+        name = req.args.get('platform_name')
         if not name:
             raise TracError('Missing required field "name"', 'Missing field')
 
         platform = TargetPlatform(self.env, config=config_name, name=name)
-        self._update_platform(req, platform)
+        platform.insert()
         return platform
 
     def _remove_platforms(self, req):
--- a/bitten/htdocs/admin.css
+++ b/bitten/htdocs/admin.css
@@ -1,6 +1,9 @@
 table.form th { text-align: right; }
 div.platforms h3 { margin-top: 3em; }
+table#platformlist { width: 67%; }
 table#platformlist td ul { list-style: none; margin: 0; padding: 0; }
+fieldset#newplatform { float:right; width: 30%; margin-top: -0.75em;
+                padding-top: 0; }
 
 dl.help { color: #666; font-size: 90%; margin: 1em .5em; }
 dl.help dt { font-weight: bold; }
--- a/bitten/templates/bitten_admin_configs.html
+++ b/bitten/templates/bitten_admin_configs.html
@@ -74,6 +74,15 @@
       </div>
       <div class="platforms">
         <h3>Target Platforms</h3>
+        <fieldset id="newplatform">
+          <legend>New Target Platform</legend>
+          <div class="field"><label>Name:
+            <input type="text" name="platform_name" value="" />
+            </label></div>
+          <div class="buttons">
+            <input type="submit" name="new" value="Add platform" />
+          </div>
+        </fieldset>
         <table class="listing" id="platformlist">
           <thead>
             <tr><th class="sel">&nbsp;</th>
@@ -105,8 +114,6 @@
           </tbody>
         </table>
         <div class="buttons">
-          <input type="submit" name="new"
-                 value="Add platform" />
           <input type="submit" name="remove"
                  value="Delete selected platforms" />
         </div>
--- a/bitten/tests/admin.py
+++ b/bitten/tests/admin.py
@@ -593,28 +593,24 @@
             self.assertEqual('Steps must have an "id" attribute', e.message)
             self.assertEqual('Invalid Recipe', e.title)
 
-    def test_process_new_platform(self):
+    def test_process_new_platform_no_name(self):
         BuildConfig(self.env, name='foo', label='Foo', path='branches/foo',
                     active=True).insert()
 
         data = {}
         req = Mock(method='POST', chrome={}, hdf=data, href=Href('/'),
                    perm=PermissionCache(self.env, 'joe'),
-                   args={'new': ''})
+                   args={'new': '', 'platform_name': ''})
 
         provider = BuildConfigurationsAdminPageProvider(self.env)
-        template_name, data = provider.render_admin_panel(
-            req, 'bitten', 'configs', 'foo'
-        )
+        try:
+            provider.render_admin_panel(req, 'bitten', 'configs', 'foo')
+            self.fail("No TracError?")
+        except Exception, e:
+            self.assertEquals(e.message, 'Missing required field "name"')
+            self.assertEquals(e.title, 'Missing field')
 
-        self.assertEqual('bitten_admin_configs.html', template_name)
-        assert 'platform' in data
-        platform = data['platform']
-        self.assertEqual({
-            'id': None, 'exists': False, 'name': None, 'rules': [('', '')],
-        }, platform)
-
-    def test_process_add_platform(self):
+    def test_process_new_platform(self):
         BuildConfig(self.env, name='foo', label='Foo', path='branches/foo',
                     active=True).insert()
 
@@ -625,8 +621,7 @@
         req = Mock(method='POST', perm=PermissionCache(self.env, 'joe'),
                    abs_href=Href('http://example.org/'), redirect=redirect,
                    authname='joe',
-                   args={'add': '', 'new': '', 'name': 'Test',
-                         'property_0': 'family', 'pattern_0': 'posix'})
+                   args={'add': '', 'new': '', 'platform_name': 'Test'})
 
         provider = BuildConfigurationsAdminPageProvider(self.env)
         try:
@@ -634,37 +629,12 @@
             self.fail('Expected RequestDone')
 
         except RequestDone:
-            self.assertEqual('http://example.org/admin/bitten/configs/foo',
+            self.assertEqual('http://example.org/admin/bitten/configs/foo/1',
                              redirected_to[0])
             platforms = list(TargetPlatform.select(self.env, config='foo'))
             self.assertEqual(1, len(platforms))
             self.assertEqual('Test', platforms[0].name)
-            self.assertEqual([('family', 'posix')], platforms[0].rules)
-
-    def test_process_add_platform_cancel(self):
-        BuildConfig(self.env, name='foo', label='Foo', path='branches/foo',
-                    active=True).insert()
-
-        redirected_to = []
-        def redirect(url):
-            redirected_to.append(url)
-            raise RequestDone
-        req = Mock(method='POST', perm=PermissionCache(self.env, 'joe'),
-                   abs_href=Href('http://example.org/'), redirect=redirect,
-                   authname='joe',
-                   args={'cancel': '', 'new': '', 'name': 'Test',
-                         'property_0': 'family', 'pattern_0': 'posix'})
-
-        provider = BuildConfigurationsAdminPageProvider(self.env)
-        try:
-            provider.render_admin_panel(req, 'bitten', 'configs', 'foo')
-            self.fail('Expected RequestDone')
-
-        except RequestDone:
-            self.assertEqual('http://example.org/admin/bitten/configs/foo',
-                             redirected_to[0])
-            platforms = list(TargetPlatform.select(self.env, config='foo'))
-            self.assertEqual(0, len(platforms))
+            self.assertEqual([], platforms[0].rules)
 
     def test_process_remove_platforms(self):
         BuildConfig(self.env, name='foo', label='Foo', path='branches/foo',
Copyright (C) 2012-2017 Edgewall Software