# HG changeset patch # User cmlenz # Date 1187302067 0 # Node ID ca0fded18882737f41db483b7f98f5c3a75538ef # Parent 201f467e0ec1692acfba83f2e57f33554660c54e Fixes and more tests for the admin panels. diff --git a/bitten/admin.py b/bitten/admin.py --- a/bitten/admin.py +++ b/bitten/admin.py @@ -98,7 +98,7 @@ if req.method == 'POST': if 'save' in req.args: - self._save_config(req, config) + self._update_config(req, config) req.redirect(req.abs_href.admin(cat, page)) data['config'] = { @@ -142,7 +142,12 @@ # Internal methods def _activate_configs(self, req): + req.perm.assert_permission('BUILD_MODIFY') + active = req.args.get('active') + if not active: + return + active = isinstance(active, list) and active or [active] db = self.env.get_db_cnx() for config in BuildConfig.select(self.env, db=db, @@ -153,6 +158,14 @@ def _create_config(self, req): req.perm.assert_permission('BUILD_CREATE') + + name = req.args.get('name') + if not name: + raise TracError('Missing required field "name"', 'Missing field') + if not re.match(r'^[\w.-]+$', name): + raise TracError('The field "name" may only contain letters, ' + 'digits, periods, or dashes.', 'Invalid field') + config = BuildConfig(self.env) config.name = req.args.get('name') config.label = req.args.get('label', config.name) @@ -175,6 +188,8 @@ db.commit() def _update_config(self, req, config): + req.perm.assert_permission('BUILD_MODIFY') + name = req.args.get('name') if not name: raise TracError('Missing required field "name"', 'Missing field') @@ -194,8 +209,7 @@ try: repos.get_node(path, req.args.get('min_rev')) except TracError, e: - raise TracError(e, - 'Invalid value for oldest revision') + raise TracError(e, 'Invalid value for oldest revision') recipe_xml = req.args.get('recipe', '') if recipe_xml: diff --git a/bitten/templates/bitten_admin_configs.cs b/bitten/templates/bitten_admin_configs.cs --- a/bitten/templates/bitten_admin_configs.cs +++ b/bitten/templates/bitten_admin_configs.cs @@ -61,12 +61,18 @@
Add Configuration: -
- -
-
- -
+ + + + +
+ +
+
diff --git a/bitten/tests/admin.py b/bitten/tests/admin.py --- a/bitten/tests/admin.py +++ b/bitten/tests/admin.py @@ -247,6 +247,18 @@ config = BuildConfig.fetch(self.env, name='bar') self.assertEqual('Bar', config.label) + def test_process_add_config_no_name(self): + req = Mock(method='POST', perm=PermissionCache(self.env, 'joe'), + args={'add': '', 'name': ''}) + + provider = BuildConfigurationsAdminPageProvider(self.env) + try: + provider.process_admin_request(req, 'bitten', 'configs', '') + self.fail('Expected TracError') + + except TracError, e: + self.assertEqual('Missing required field "name"', e.message) + def test_process_add_config_no_perms(self): BuildConfig(self.env, name='foo', label='Foo', path='branches/foo', active=True).insert() @@ -257,12 +269,8 @@ args={'add': '', 'name': 'bar', 'label': 'Bar'}) provider = BuildConfigurationsAdminPageProvider(self.env) - try: - provider.process_admin_request(req, 'bitten', 'configs', '') - self.fail('Expected PermissionError') - - except PermissionError: - pass + self.assertRaises(PermissionError, provider.process_admin_request, req, + 'bitten', 'configs', '') def test_process_remove_config(self): BuildConfig(self.env, name='foo', label='Foo', path='branches/foo', @@ -328,12 +336,23 @@ args={'remove': '', 'sel': 'bar'}) provider = BuildConfigurationsAdminPageProvider(self.env) + self.assertRaises(PermissionError, provider.process_admin_request, req, + 'bitten', 'configs', '') + + def test_process_update_config_no_name(self): + BuildConfig(self.env, name='foo', label='Foo', path='branches/foo', + active=True).insert() + + req = Mock(method='POST', perm=PermissionCache(self.env, 'joe'), + args={'save': ''}) + + provider = BuildConfigurationsAdminPageProvider(self.env) try: - provider.process_admin_request(req, 'bitten', 'configs', '') - self.fail('Expected PermissionError') + provider.process_admin_request(req, 'bitten', 'configs', 'foo') + self.fail('Expected TracError') - except PermissionError: - pass + except TracError, e: + self.assertEqual('Missing required field "name"', e.message) def suite():