def render_admin_panel(self, req, category, page, path_info): if not isinstance(self.env, ProductEnvironment): return super(ProductRepositoryAdminPanel, self).render_admin_panel(req, category, page, path_info) req.perm.require('VERSIONCONTROL_ADMIN') db_provider = self.env[DbRepositoryProvider] if req.method == 'POST' and db_provider: if req.args.get('remove'): repolist = req.args.get('sel') if repolist: if isinstance(repolist, basestring): repolist = [ repolist, ] for reponame in repolist: db_provider.unlink_product(reponame) elif req.args.get('addlink') is not None and db_provider: reponame = req.args.get('repository') db_provider.link_product(reponame) req.redirect(req.href.admin(category, page)) # Retrieve info for all product repositories rm_product = RepositoryManager(self.env) rm_product.reload_repositories() all_product_repos = rm_product.get_all_repositories() repositories = dict( (reponame, self._extend_info(reponame, info.copy(), True)) for (reponame, info) in all_product_repos.iteritems()) types = sorted([''] + rm_product.get_supported_types()) # construct a list of all repositores not linked to this product rm = RepositoryManager(self.env.parent) all_repos = rm.get_all_repositories() unlinked_repositories = dict([ (k, all_repos[k]) for k in sorted(set(all_repos) - set(all_product_repos)) ]) data = { 'types': types, 'default_type': rm_product.repository_type, 'repositories': repositories, 'unlinked_repositories': unlinked_repositories } return 'repository_links.html', data
def render_admin_panel(self, req, category, page, path_info): if not isinstance(self.env, ProductEnvironment): return super(ProductRepositoryAdminPanel, self).render_admin_panel( req, category, page, path_info) req.perm.require('VERSIONCONTROL_ADMIN') db_provider = self.env[DbRepositoryProvider] if req.method == 'POST' and db_provider: if req.args.get('remove'): repolist = req.args.get('sel') if repolist: if isinstance(repolist, basestring): repolist = [repolist, ] for reponame in repolist: db_provider.unlink_product(reponame) elif req.args.get('addlink') is not None and db_provider: reponame = req.args.get('repository') db_provider.link_product(reponame) req.redirect(req.href.admin(category, page)) # Retrieve info for all product repositories rm_product = RepositoryManager(self.env) rm_product.reload_repositories() all_product_repos = rm_product.get_all_repositories() repositories = dict((reponame, self._extend_info( reponame, info.copy(), True)) for (reponame, info) in all_product_repos.iteritems()) types = sorted([''] + rm_product.get_supported_types()) # construct a list of all repositores not linked to this product rm = RepositoryManager(self.env.parent) all_repos = rm.get_all_repositories() unlinked_repositories = dict([(k, all_repos[k]) for k in sorted(set(all_repos) - set(all_product_repos))]) data = {'types': types, 'default_type': rm_product.repository_type, 'repositories': repositories, 'unlinked_repositories': unlinked_repositories} return 'repository_links.html', data
def render_admin_panel(self, req, category, page, path_info): # Retrieve info for all repositories rm = RepositoryManager(self.env) all_repos = rm.get_all_repositories() db_provider = self.env[DbRepositoryProvider] if path_info: # Detail view reponame = path_info if not is_default(path_info) else '' info = all_repos.get(reponame) if info is None: raise TracError( _("Repository '%(repo)s' not found", repo=path_info)) if req.method == 'POST': if req.args.get('cancel'): req.redirect(req.href.admin(category, page)) elif db_provider and req.args.get('save'): # Modify repository changes = {} valid = True for field in db_provider.repository_attrs: value = normalize_whitespace(req.args.get(field)) if (value is not None or field in ('hidden', 'sync_per_request')) \ and value != info.get(field): changes[field] = value if 'dir' in changes and not \ self._check_dir(req, changes['dir']): valid = False if valid and changes: db_provider.modify_repository(reponame, changes) add_notice(req, _('Your changes have been saved.')) name = req.args.get('name') pretty_name = name or '(default)' resync = tag.code('trac-admin "%s" repository resync ' '"%s"' % (self.env.path, pretty_name)) if 'dir' in changes: msg = tag_( 'You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) elif 'type' in changes: msg = tag_( 'You may have to run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) if name and name != path_info and 'alias' not in info: cset_added = tag.code('trac-admin "%s" changeset ' 'added "%s" $REV' % (self.env.path, pretty_name)) msg = tag_( 'You will need to update your ' 'post-commit hook to call ' '%(cset_added)s with the new ' 'repository name.', cset_added=cset_added) add_notice(req, msg) if valid: req.redirect(req.href.admin(category, page)) chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) data = {'view': 'detail', 'reponame': reponame} else: # List view if req.method == 'POST': # Add a repository if db_provider and req.args.get('add_repos'): name = req.args.get('name') pretty_name = name or '(default)' if name in all_repos: raise TracError( _('The repository "%(name)s" already ' 'exists.', name=pretty_name)) type_ = req.args.get('type') # Avoid errors when copy/pasting paths dir = normalize_whitespace(req.args.get('dir', '')) if name is None or type_ is None or not dir: add_warning( req, _('Missing arguments to add a ' 'repository.')) elif self._check_dir(req, dir): db_provider.add_repository(name, dir, type_) add_notice( req, _('The repository "%(name)s" has been ' 'added.', name=pretty_name)) resync = tag.code('trac-admin "%s" repository resync ' '"%s"' % (self.env.path, pretty_name)) msg = tag_( 'You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) cset_added = tag.code('trac-admin "%s" changeset ' 'added "%s" $REV' % (self.env.path, pretty_name)) doc = tag.a(_("documentation"), href=req.href.wiki('TracRepositoryAdmin') + '#Synchronization') msg = tag_( 'You should also set up a post-commit hook ' 'on the repository to call %(cset_added)s ' 'for each committed changeset. See the ' '%(doc)s for more information.', cset_added=cset_added, doc=doc) add_notice(req, msg) # Add a repository alias elif db_provider and req.args.get('add_alias'): name = req.args.get('name') pretty_name = name or '(default)' alias = req.args.get('alias') if name is not None and alias is not None: try: db_provider.add_alias(name, alias) except self.env.db_exc.IntegrityError: raise TracError( _('The alias "%(name)s" already ' 'exists.', name=pretty_name)) add_notice( req, _('The alias "%(name)s" has been ' 'added.', name=pretty_name)) else: add_warning(req, _('Missing arguments to add an ' 'alias.')) # Refresh the list of repositories elif req.args.get('refresh'): pass # Remove repositories elif db_provider and req.args.get('remove'): sel = req.args.getlist('sel') if sel: for name in sel: db_provider.remove_repository(name) add_notice( req, _('The selected repositories have ' 'been removed.')) else: add_warning(req, _('No repositories were selected.')) req.redirect(req.href.admin(category, page)) data = {'view': 'list'} # Find repositories that are editable db_repos = {} if db_provider is not None: db_repos = dict(db_provider.get_repositories()) # Prepare common rendering data repositories = { reponame: self._extend_info(reponame, info.copy(), reponame in db_repos) for (reponame, info) in all_repos.iteritems() } types = sorted([''] + rm.get_supported_types()) data.update({ 'types': types, 'default_type': rm.default_repository_type, 'repositories': repositories, 'can_add_alias': any('alias' not in info for info in repositories.itervalues()) }) return 'admin_repositories.html', data
def render_admin_panel(self, req, category, page, path_info): req.perm.require('VERSIONCONTROL_ADMIN') # Retrieve info for all repositories rm = RepositoryManager(self.env) all_repos = rm.get_all_repositories() db_provider = self.env[DbRepositoryProvider] if path_info: # Detail view reponame = not is_default(path_info) and path_info or '' info = all_repos.get(reponame) if info is None: raise TracError(_("Repository '%(repo)s' not found", repo=path_info)) if req.method == 'POST': if req.args.get('cancel'): req.redirect(req.href.admin(category, page)) elif db_provider and req.args.get('save'): # Modify repository changes = {} for field in db_provider.repository_attrs: value = normalize_whitespace(req.args.get(field)) if (value is not None or field == 'hidden') \ and value != info.get(field): changes[field] = value if 'dir' in changes \ and not self._check_dir(req, changes['dir']): changes = {} if changes: db_provider.modify_repository(reponame, changes) add_notice(req, _('Your changes have been saved.')) name = req.args.get('name') resync = tag.tt('trac-admin $ENV repository resync "%s"' % (name or '(default)')) if 'dir' in changes: msg = tag_('You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) elif 'type' in changes: msg = tag_('You may have to run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) if name and name != path_info and not 'alias' in info: cset_added = tag.tt('trac-admin $ENV changeset ' 'added "%s" $REV' % (name or '(default)')) msg = tag_('You will need to update your post-commit ' 'hook to call %(cset_added)s with the new ' 'repository name.', cset_added=cset_added) add_notice(req, msg) if changes: req.redirect(req.href.admin(category, page)) Chrome(self.env).add_wiki_toolbars(req) data = {'view': 'detail', 'reponame': reponame} else: # List view if req.method == 'POST': # Add a repository if db_provider and req.args.get('add_repos'): name = req.args.get('name') type_ = req.args.get('type') # Avoid errors when copy/pasting paths dir = normalize_whitespace(req.args.get('dir', '')) if name is None or type_ is None or not dir: add_warning(req, _('Missing arguments to add a ' 'repository.')) elif self._check_dir(req, dir): db_provider.add_repository(name, dir, type_) name = name or '(default)' add_notice(req, _('The repository "%(name)s" has been ' 'added.', name=name)) resync = tag.tt('trac-admin $ENV repository resync ' '"%s"' % name) msg = tag_('You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) cset_added = tag.tt('trac-admin $ENV changeset ' 'added "%s" $REV' % name) msg = tag_('You should also set up a post-commit hook ' 'on the repository to call %(cset_added)s ' 'for each committed changeset.', cset_added=cset_added) add_notice(req, msg) req.redirect(req.href.admin(category, page)) # Add a repository alias elif db_provider and req.args.get('add_alias'): name = req.args.get('name') alias = req.args.get('alias') if name is not None and alias is not None: db_provider.add_alias(name, alias) add_notice(req, _('The alias "%(name)s" has been ' 'added.', name=name or '(default)')) req.redirect(req.href.admin(category, page)) add_warning(req, _('Missing arguments to add an ' 'alias.')) # Refresh the list of repositories elif req.args.get('refresh'): req.redirect(req.href.admin(category, page)) # Remove repositories elif db_provider and req.args.get('remove'): sel = req.args.getlist('sel') if sel: for name in sel: db_provider.remove_repository(name) add_notice(req, _('The selected repositories have ' 'been removed.')) req.redirect(req.href.admin(category, page)) add_warning(req, _('No repositories were selected.')) data = {'view': 'list'} # Find repositories that are editable db_repos = {} if db_provider is not None: db_repos = dict(db_provider.get_repositories()) # Prepare common rendering data repositories = dict((reponame, self._extend_info(reponame, info.copy(), reponame in db_repos)) for (reponame, info) in all_repos.iteritems()) types = sorted([''] + rm.get_supported_types()) data.update({'types': types, 'default_type': rm.repository_type, 'repositories': repositories}) return 'admin_repositories.html', data
def render_admin_panel(self, req, category, page, path_info): req.perm.require('VERSIONCONTROL_ADMIN') # Retrieve info for all repositories rm = RepositoryManager(self.env) all_repos = rm.get_all_repositories() db_provider = self.env[DbRepositoryProvider] if path_info: # Detail view reponame = path_info if not is_default(path_info) else '' info = all_repos.get(reponame) if info is None: raise TracError( _("Repository '%(repo)s' not found", repo=path_info)) if req.method == 'POST': if req.args.get('cancel'): req.redirect(req.href.admin(category, page)) elif db_provider and req.args.get('save'): # Modify repository changes = {} for field in db_provider.repository_attrs: value = normalize_whitespace(req.args.get(field)) if (value is not None or field == 'hidden') \ and value != info.get(field): changes[field] = value if 'dir' in changes \ and not self._check_dir(req, changes['dir']): changes = {} if changes: db_provider.modify_repository(reponame, changes) add_notice(req, _('Your changes have been saved.')) name = req.args.get('name') resync = tag.tt('trac-admin $ENV repository resync "%s"' % (name or '(default)')) if 'dir' in changes: msg = tag_( 'You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) elif 'type' in changes: msg = tag_( 'You may have to run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) if name and name != path_info and not 'alias' in info: cset_added = tag.tt('trac-admin $ENV changeset ' 'added "%s" $REV' % (name or '(default)')) msg = tag_( 'You will need to update your post-commit ' 'hook to call %(cset_added)s with the new ' 'repository name.', cset_added=cset_added) add_notice(req, msg) if changes: req.redirect(req.href.admin(category, page)) Chrome(self.env).add_wiki_toolbars(req) data = {'view': 'detail', 'reponame': reponame} else: # List view if req.method == 'POST': # Add a repository if db_provider and req.args.get('add_repos'): name = req.args.get('name') type_ = req.args.get('type') # Avoid errors when copy/pasting paths dir = normalize_whitespace(req.args.get('dir', '')) if name is None or type_ is None or not dir: add_warning( req, _('Missing arguments to add a ' 'repository.')) elif self._check_dir(req, dir): db_provider.add_repository(name, dir, type_) name = name or '(default)' add_notice( req, _('The repository "%(name)s" has been ' 'added.', name=name)) resync = tag.tt('trac-admin $ENV repository resync ' '"%s"' % name) msg = tag_( 'You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) cset_added = tag.tt('trac-admin $ENV changeset ' 'added "%s" $REV' % name) msg = tag_( 'You should also set up a post-commit hook ' 'on the repository to call %(cset_added)s ' 'for each committed changeset.', cset_added=cset_added) add_notice(req, msg) req.redirect(req.href.admin(category, page)) # Add a repository alias elif db_provider and req.args.get('add_alias'): name = req.args.get('name') alias = req.args.get('alias') if name is not None and alias is not None: db_provider.add_alias(name, alias) add_notice( req, _('The alias "%(name)s" has been ' 'added.', name=name or '(default)')) req.redirect(req.href.admin(category, page)) add_warning(req, _('Missing arguments to add an ' 'alias.')) # Refresh the list of repositories elif req.args.get('refresh'): req.redirect(req.href.admin(category, page)) # Remove repositories elif db_provider and req.args.get('remove'): sel = req.args.getlist('sel') if sel: for name in sel: db_provider.remove_repository(name) add_notice( req, _('The selected repositories have ' 'been removed.')) req.redirect(req.href.admin(category, page)) add_warning(req, _('No repositories were selected.')) data = {'view': 'list'} # Find repositories that are editable db_repos = {} if db_provider is not None: db_repos = dict(db_provider.get_repositories()) # Prepare common rendering data repositories = dict( (reponame, self._extend_info(reponame, info.copy(), reponame in db_repos)) for (reponame, info) in all_repos.iteritems()) types = sorted([''] + rm.get_supported_types()) data.update({ 'types': types, 'default_type': rm.repository_type, 'repositories': repositories }) return 'admin_repositories.html', data
def render_admin_panel(self, req, category, page, path_info): req.perm.require("VERSIONCONTROL_ADMIN") # Retrieve info for all repositories rm = RepositoryManager(self.env) all_repos = rm.get_all_repositories() db_provider = self.env[DbRepositoryProvider] if path_info: # Detail view reponame = path_info if not is_default(path_info) else "" info = all_repos.get(reponame) if info is None: raise TracError(_("Repository '%(repo)s' not found", repo=path_info)) if req.method == "POST": if req.args.get("cancel"): req.redirect(req.href.admin(category, page)) elif db_provider and req.args.get("save"): # Modify repository changes = {} for field in db_provider.repository_attrs: value = normalize_whitespace(req.args.get(field)) if (value is not None or field == "hidden") and value != info.get(field): changes[field] = value if "dir" in changes and not self._check_dir(req, changes["dir"]): changes = {} if changes: db_provider.modify_repository(reponame, changes) add_notice(req, _("Your changes have been saved.")) name = req.args.get("name") resync = tag.tt('trac-admin $ENV repository resync "%s"' % (name or "(default)")) if "dir" in changes: msg = tag_( "You should now run %(resync)s to " "synchronize Trac with the repository.", resync=resync ) add_notice(req, msg) elif "type" in changes: msg = tag_( "You may have to run %(resync)s to " "synchronize Trac with the repository.", resync=resync ) add_notice(req, msg) if name and name != path_info and not "alias" in info: cset_added = tag.tt("trac-admin $ENV changeset " 'added "%s" $REV' % (name or "(default)")) msg = tag_( "You will need to update your post-commit " "hook to call %(cset_added)s with the new " "repository name.", cset_added=cset_added, ) add_notice(req, msg) if changes: req.redirect(req.href.admin(category, page)) Chrome(self.env).add_wiki_toolbars(req) data = {"view": "detail", "reponame": reponame} else: # List view if req.method == "POST": # Add a repository if db_provider and req.args.get("add_repos"): name = req.args.get("name") type_ = req.args.get("type") # Avoid errors when copy/pasting paths dir = normalize_whitespace(req.args.get("dir", "")) if name is None or type_ is None or not dir: add_warning(req, _("Missing arguments to add a " "repository.")) elif self._check_dir(req, dir): db_provider.add_repository(name, dir, type_) name = name or "(default)" add_notice(req, _('The repository "%(name)s" has been ' "added.", name=name)) resync = tag.tt("trac-admin $ENV repository resync " '"%s"' % name) msg = tag_( "You should now run %(resync)s to " "synchronize Trac with the repository.", resync=resync ) add_notice(req, msg) cset_added = tag.tt("trac-admin $ENV changeset " 'added "%s" $REV' % name) msg = tag_( "You should also set up a post-commit hook " "on the repository to call %(cset_added)s " "for each committed changeset.", cset_added=cset_added, ) add_notice(req, msg) req.redirect(req.href.admin(category, page)) # Add a repository alias elif db_provider and req.args.get("add_alias"): name = req.args.get("name") alias = req.args.get("alias") if name is not None and alias is not None: db_provider.add_alias(name, alias) add_notice(req, _('The alias "%(name)s" has been ' "added.", name=name or "(default)")) req.redirect(req.href.admin(category, page)) add_warning(req, _("Missing arguments to add an " "alias.")) # Refresh the list of repositories elif req.args.get("refresh"): req.redirect(req.href.admin(category, page)) # Remove repositories elif db_provider and req.args.get("remove"): sel = req.args.getlist("sel") if sel: for name in sel: db_provider.remove_repository(name) add_notice(req, _("The selected repositories have " "been removed.")) req.redirect(req.href.admin(category, page)) add_warning(req, _("No repositories were selected.")) data = {"view": "list"} # Find repositories that are editable db_repos = {} if db_provider is not None: db_repos = dict(db_provider.get_repositories()) # Prepare common rendering data repositories = dict( (reponame, self._extend_info(reponame, info.copy(), reponame in db_repos)) for (reponame, info) in all_repos.iteritems() ) types = sorted([""] + rm.get_supported_types()) data.update({"types": types, "default_type": rm.repository_type, "repositories": repositories}) return "admin_repositories.html", data