Mercurial > bitten > bitten-test
diff bitten/web_ui.py @ 436:cfbc9ee622d5
Finish the move of build configuration management into the admin interface.
author | cmlenz |
---|---|
date | Fri, 17 Aug 2007 10:43:09 +0000 |
parents | 8864b3917221 |
children | 6d5ac24061dc |
line wrap: on
line diff
--- a/bitten/web_ui.py +++ b/bitten/web_ui.py @@ -13,10 +13,6 @@ from datetime import datetime import posixpath import re -try: - set -except NameError: - from sets import Set as set from StringIO import StringIO import pkg_resources @@ -35,8 +31,6 @@ from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, \ BuildLog, Report from bitten.queue import collect_changes -from bitten.recipe import Recipe, InvalidRecipeError -from bitten.util import xmlio _status_label = {Build.PENDING: 'pending', Build.IN_PROGRESS: 'in progress', @@ -125,230 +119,18 @@ view = req.args.get('view') config = req.args.get('config') - if req.method == 'POST': - if config: - if action == 'new': - self._do_create_platform(req, config) - elif action == 'delete': - self._do_delete_config(req, config) - else: - platform_id = req.args.get('platform') - if platform_id: - if action == 'edit': - self._do_save_platform(req, config, platform_id) - elif 'delete' in req.args: - self._do_delete_platforms(req) - self._render_config_form(req, config) - elif 'new' in req.args: - platform = TargetPlatform(self.env, config=config) - self._render_platform_form(req, platform) - else: - self._do_save_config(req, config) - else: - if action == 'new': - self._do_create_config(req) + if config: + self._render_config(req, config) + elif view == 'inprogress': + self._render_inprogress(req) else: - if config: - if action == 'delete': - self._render_config_confirm(req, config) - elif action == 'edit': - platform_id = req.args.get('platform') - if platform_id: - platform = TargetPlatform.fetch(self.env, - int(platform_id)) - self._render_platform_form(req, platform) - elif 'new' in req.args: - platform = TargetPlatform(self.env, config=config) - self._render_platform_form(req, platform) - else: - self._render_config_form(req, config) - else: - self._render_config(req, config) - else: - if action == 'new': - self._render_config_form(req) - elif view == 'inprogress': - self._render_inprogress(req) - else: - self._render_overview(req) + self._render_overview(req) add_stylesheet(req, 'bitten/bitten.css') return 'bitten_config.cs', None # Internal methods - def _do_create_config(self, req): - """Create a new build configuration.""" - req.perm.assert_permission('BUILD_CREATE') - - if 'cancel' in req.args: - req.redirect(req.href.build()) - - config_name = req.args.get('name') - - if BuildConfig.fetch(self.env, config_name): - raise TracError('A build configuration with the name "%s" already ' - 'exists' % config_name, 'Duplicate name') - - config = BuildConfig(self.env) - self._process_config(req, config) - config.insert() - - req.redirect(req.href.build(config.name)) - - def _do_delete_config(self, req, config_name): - """Save changes to a build configuration.""" - req.perm.assert_permission('BUILD_DELETE') - - if 'cancel' in req.args: - req.redirect(req.href.build(config_name)) - - db = self.env.get_db_cnx() - - config = BuildConfig.fetch(self.env, config_name, db=db) - assert config, 'Build configuration "%s" does not exist' % config_name - - config.delete(db=db) - - db.commit() - - req.redirect(req.href.build()) - - def _do_save_config(self, req, config_name): - """Save changes to a build configuration.""" - req.perm.assert_permission('BUILD_MODIFY') - - if 'cancel' in req.args: - req.redirect(req.href.build(config_name)) - - config = BuildConfig.fetch(self.env, config_name) - if not config: - # FIXME: 404 - raise TracError('Build configuration "%s" does not exist' - % config_name, 'Object not found') - - if 'activate' in req.args: - config.active = True - - elif 'deactivate' in req.args: - config.active = False - - else: - self._process_config(req, config) - - config.update() - req.redirect(req.href.build(config.name)) - - def _process_config(self, req, config): - 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') - - path = req.args.get('path', '') - repos = self.env.get_repository(req.authname) - max_rev = req.args.get('max_rev') or None - try: - node = repos.get_node(path, max_rev) - assert node.isdir, '%s is not a directory' % node.path - except (AssertionError, TracError), e: - raise TracError(e, 'Invalid repository path') - if req.args.get('min_rev'): - try: - repos.get_node(path, req.args.get('min_rev')) - except TracError, e: - raise TracError(e, 'Invalid value for oldest revision') - - recipe_xml = req.args.get('recipe', '') - if recipe_xml: - try: - Recipe(xmlio.parse(recipe_xml)).validate() - except xmlio.ParseError, e: - raise TracError('Failure parsing recipe: %s' % e, - 'Invalid recipe') - except InvalidRecipeError, e: - raise TracError(e, 'Invalid recipe') - - config.name = name - config.path = repos.normalize_path(path) - config.recipe = recipe_xml - config.min_rev = req.args.get('min_rev') - config.max_rev = req.args.get('max_rev') - config.label = req.args.get('label', '') - config.description = req.args.get('description', '') - - def _do_create_platform(self, req, config_name): - """Create a new target platform.""" - req.perm.assert_permission('BUILD_MODIFY') - - if 'cancel' in req.args: - req.redirect(req.href.build(config_name, action='edit')) - - platform = TargetPlatform(self.env, config=config_name) - if self._process_platform(req, platform): - platform.insert() - req.redirect(req.href.build(config_name, action='edit')) - - def _do_delete_platforms(self, req): - """Delete selected target platforms.""" - req.perm.assert_permission('BUILD_MODIFY') - self.log.debug('_do_delete_platforms') - - db = self.env.get_db_cnx() - for platform_id in [int(id) for id in req.args.get('delete_platform')]: - platform = TargetPlatform.fetch(self.env, platform_id, db=db) - self.log.info('Deleting target platform %s of configuration %s', - platform.name, platform.config) - platform.delete(db=db) - - # FIXME: this should probably also delete all builds done for this - # platform, and all the associated reports - - db.commit() - - def _do_save_platform(self, req, config_name, platform_id): - """Save changes to a target platform.""" - req.perm.assert_permission('BUILD_MODIFY') - - if 'cancel' in req.args: - req.redirect(req.href.build(config_name, action='edit')) - - platform = TargetPlatform.fetch(self.env, platform_id) - if self._process_platform(req, platform): - platform.update() - req.redirect(req.href.build(config_name, action='edit')) - - def _process_platform(self, req, platform): - platform.name = req.args.get('name') - - properties = [int(key[9:]) for key in req.args.keys() - if key.startswith('property_')] - properties.sort() - patterns = [int(key[8:]) for key in req.args.keys() - if key.startswith('pattern_')] - patterns.sort() - platform.rules = [(req.args.get('property_%d' % property), - req.args.get('pattern_%d' % pattern)) - for property, pattern in zip(properties, patterns) - if req.args.get('property_%d' % property)] - - add_rules = [int(key[9:]) for key in req.args.keys() - if key.startswith('add_rule_')] - if add_rules: - platform.rules.insert(add_rules[0] + 1, ('', '')) - self._render_platform_form(req, platform) - return False - rm_rules = [int(key[8:]) for key in req.args.keys() - if key.startswith('rm_rule_')] - if rm_rules: - del platform.rules[rm_rules[0]] - self._render_platform_form(req, platform) - return False - - return True - def _render_overview(self, req): req.hdf['title'] = 'Build Status' show_all = False @@ -356,8 +138,6 @@ show_all = True req.hdf['config.show_all'] = show_all - add_link(req, 'views', req.href.build(view='inprogress'), 'In Progress Builds') - configs = BuildConfig.select(self.env, include_inactive=show_all) for idx, config in enumerate(configs): prefix = 'configs.%d' % idx @@ -402,7 +182,8 @@ } req.hdf['page.mode'] = 'overview' - req.hdf['config.can_create'] = req.perm.has_permission('BUILD_CREATE') + add_link(req, 'views', req.href.build(view='inprogress'), + 'In Progress Builds') def _render_inprogress(self, req): req.hdf['title'] = 'In Progress Builds' @@ -475,9 +256,7 @@ 'max_rev': config.max_rev, 'max_rev_href': req.href.changeset(config.max_rev), 'active': config.active, 'description': description, - 'browser_href': req.href.browser(config.path), - 'can_modify': req.perm.has_permission('BUILD_MODIFY'), - 'can_delete': req.perm.has_permission('BUILD_DELETE') + 'browser_href': req.href.browser(config.path) } req.hdf['page.mode'] = 'view_config' @@ -547,53 +326,6 @@ next_href = req.href.build(config.name, page=page + 1) add_link(req, 'next', next_href, 'Next Page') - def _render_config_confirm(self, req, config_name): - req.perm.assert_permission('BUILD_DELETE') - config = BuildConfig.fetch(self.env, config_name) - req.hdf['title'] = 'Delete Build Configuration "%s"' \ - % config.label or config.name - req.hdf['config'] = {'name': config.name} - req.hdf['page.mode'] = 'delete_config' - - def _render_config_form(self, req, config_name=None): - config = BuildConfig.fetch(self.env, config_name) - if config: - req.perm.assert_permission('BUILD_MODIFY') - req.hdf['config'] = { - 'name': config.name, 'exists': config.exists, - 'path': config.path, 'active': config.active, - 'recipe': config.recipe, 'min_rev': config.min_rev, - 'max_rev': config.max_rev, 'label': config.label, - 'description': config.description - } - - req.hdf['title'] = 'Edit Build Configuration "%s"' \ - % config.label or config.name - for idx, platform in enumerate(TargetPlatform.select(self.env, - config_name)): - req.hdf['config.platforms.%d' % idx] = { - 'id': platform.id, 'name': platform.name, - 'href': req.href.build(config_name, action='edit', - platform=platform.id) - } - else: - req.perm.assert_permission('BUILD_CREATE') - req.hdf['title'] = 'Create Build Configuration' - req.hdf['page.mode'] = 'edit_config' - - def _render_platform_form(self, req, platform): - req.perm.assert_permission('BUILD_MODIFY') - if platform.exists: - req.hdf['title'] = 'Edit Target Platform "%s"' % platform.name - else: - req.hdf['title'] = 'Add Target Platform' - req.hdf['platform'] = { - 'name': platform.name, 'id': platform.id, 'exists': platform.exists, - 'rules': [{'property': propname, 'pattern': pattern} - for propname, pattern in platform.rules] or [('', '')] - } - req.hdf['page.mode'] = 'edit_platform' - class BuildController(Component): """Renders the build page."""