repo-settings: converted repo settings to pyramid
- switched to pyramid views - switched to deform - validation shares the similar schema as API - added new audit-log
This commit is contained in:
parent
8bf9c820c0
commit
b26439b549
15 changed files with 268 additions and 175 deletions
|
|
@ -21,6 +21,11 @@
|
|||
|
||||
def includeme(config):
|
||||
|
||||
# Settings
|
||||
config.add_route(
|
||||
name='edit_repo',
|
||||
pattern='/{repo_name:.*?[^/]}/settings', repo_route=True)
|
||||
|
||||
config.add_route(
|
||||
name='repo_maintenance',
|
||||
pattern='/{repo_name:.*?[^/]}/maintenance', repo_route=True)
|
||||
|
|
@ -29,7 +34,6 @@ def includeme(config):
|
|||
name='repo_maintenance_execute',
|
||||
pattern='/{repo_name:.*?[^/]}/maintenance/execute', repo_route=True)
|
||||
|
||||
|
||||
# Strip
|
||||
config.add_route(
|
||||
name='strip',
|
||||
|
|
|
|||
178
rhodecode/apps/repository/views/repo_settings.py
Normal file
178
rhodecode/apps/repository/views/repo_settings.py
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2011-2017 RhodeCode GmbH
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License, version 3
|
||||
# (only), as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# This program is dual-licensed. If you wish to learn more about the
|
||||
# RhodeCode Enterprise Edition, including its added features, Support services,
|
||||
# and proprietary license terms, please see https://rhodecode.com/licenses/
|
||||
|
||||
import logging
|
||||
|
||||
import deform
|
||||
from pyramid.httpexceptions import HTTPFound
|
||||
from pyramid.view import view_config
|
||||
|
||||
from rhodecode.apps._base import RepoAppView
|
||||
from rhodecode.forms import RcForm
|
||||
from rhodecode.lib import helpers as h
|
||||
from rhodecode.lib import audit_logger
|
||||
from rhodecode.lib.auth import (
|
||||
LoginRequired, HasRepoPermissionAnyDecorator,
|
||||
HasRepoPermissionAllDecorator, CSRFRequired)
|
||||
from rhodecode.model.db import RepositoryField, RepoGroup
|
||||
from rhodecode.model.meta import Session
|
||||
from rhodecode.model.repo import RepoModel
|
||||
from rhodecode.model.scm import RepoGroupList, ScmModel
|
||||
from rhodecode.model.validation_schema.schemas import repo_schema
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RepoSettingsView(RepoAppView):
|
||||
|
||||
def load_default_context(self):
|
||||
c = self._get_local_tmpl_context()
|
||||
|
||||
# TODO(marcink): remove repo_info and use c.rhodecode_db_repo instead
|
||||
c.repo_info = self.db_repo
|
||||
|
||||
acl_groups = RepoGroupList(
|
||||
RepoGroup.query().all(),
|
||||
perm_set=['group.write', 'group.admin'])
|
||||
c.repo_groups = RepoGroup.groups_choices(groups=acl_groups)
|
||||
c.repo_groups_choices = map(lambda k: k[0], c.repo_groups)
|
||||
|
||||
# in case someone no longer have a group.write access to a repository
|
||||
# pre fill the list with this entry, we don't care if this is the same
|
||||
# but it will allow saving repo data properly.
|
||||
repo_group = self.db_repo.group
|
||||
if repo_group and repo_group.group_id not in c.repo_groups_choices:
|
||||
c.repo_groups_choices.append(repo_group.group_id)
|
||||
c.repo_groups.append(RepoGroup._generate_choice(repo_group))
|
||||
|
||||
if c.repository_requirements_missing or self.rhodecode_vcs_repo is None:
|
||||
# we might be in missing requirement state, so we load things
|
||||
# without touching scm_instance()
|
||||
c.landing_revs_choices, c.landing_revs = \
|
||||
ScmModel().get_repo_landing_revs()
|
||||
else:
|
||||
c.landing_revs_choices, c.landing_revs = \
|
||||
ScmModel().get_repo_landing_revs(self.db_repo)
|
||||
|
||||
c.personal_repo_group = c.auth_user.personal_repo_group
|
||||
c.repo_fields = RepositoryField.query()\
|
||||
.filter(RepositoryField.repository == self.db_repo).all()
|
||||
|
||||
self._register_global_c(c)
|
||||
return c
|
||||
|
||||
def _get_schema(self, c, old_values=None):
|
||||
return repo_schema.RepoSettingsSchema().bind(
|
||||
repo_type_options=[self.db_repo.repo_type],
|
||||
repo_ref_options=c.landing_revs_choices,
|
||||
repo_ref_items=c.landing_revs,
|
||||
repo_repo_group_options=c.repo_groups_choices,
|
||||
repo_repo_group_items=c.repo_groups,
|
||||
# user caller
|
||||
user=self._rhodecode_user,
|
||||
old_values=old_values
|
||||
)
|
||||
|
||||
@LoginRequired()
|
||||
@HasRepoPermissionAnyDecorator('repository.admin')
|
||||
@view_config(
|
||||
route_name='edit_repo', request_method='GET',
|
||||
renderer='rhodecode:templates/admin/repos/repo_edit.mako')
|
||||
def edit_settings(self):
|
||||
c = self.load_default_context()
|
||||
c.active = 'settings'
|
||||
|
||||
defaults = RepoModel()._get_defaults(self.db_repo_name)
|
||||
defaults['repo_owner'] = defaults['user']
|
||||
defaults['repo_landing_commit_ref'] = defaults['repo_landing_rev']
|
||||
|
||||
schema = self._get_schema(c)
|
||||
c.form = RcForm(schema, appstruct=defaults)
|
||||
return self._get_template_context(c)
|
||||
|
||||
@LoginRequired()
|
||||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
@CSRFRequired()
|
||||
@view_config(
|
||||
route_name='edit_repo', request_method='POST',
|
||||
renderer='rhodecode:templates/admin/repos/repo_edit.mako')
|
||||
def edit_settings_update(self):
|
||||
_ = self.request.translate
|
||||
c = self.load_default_context()
|
||||
c.active = 'settings'
|
||||
old_repo_name = self.db_repo_name
|
||||
|
||||
old_values = self.db_repo.get_api_data()
|
||||
schema = self._get_schema(c, old_values=old_values)
|
||||
|
||||
c.form = RcForm(schema)
|
||||
pstruct = self.request.POST.items()
|
||||
pstruct.append(('repo_type', self.db_repo.repo_type))
|
||||
try:
|
||||
schema_data = c.form.validate(pstruct)
|
||||
except deform.ValidationFailure as err_form:
|
||||
return self._get_template_context(c)
|
||||
|
||||
# data is now VALID, proceed with updates
|
||||
# save validated data back into the updates dict
|
||||
validated_updates = dict(
|
||||
repo_name=schema_data['repo_group']['repo_name_without_group'],
|
||||
repo_group=schema_data['repo_group']['repo_group_id'],
|
||||
|
||||
user=schema_data['repo_owner'],
|
||||
repo_description=schema_data['repo_description'],
|
||||
repo_private=schema_data['repo_private'],
|
||||
clone_uri=schema_data['repo_clone_uri'],
|
||||
repo_landing_rev=schema_data['repo_landing_commit_ref'],
|
||||
repo_enable_statistics=schema_data['repo_enable_statistics'],
|
||||
repo_enable_locking=schema_data['repo_enable_locking'],
|
||||
repo_enable_downloads=schema_data['repo_enable_downloads'],
|
||||
)
|
||||
# detect if CLONE URI changed, if we get OLD means we keep old values
|
||||
if schema_data['repo_clone_uri_change'] == 'OLD':
|
||||
validated_updates['clone_uri'] = self.db_repo.clone_uri
|
||||
|
||||
# use the new full name for redirect
|
||||
new_repo_name = schema_data['repo_group']['repo_name_with_group']
|
||||
|
||||
# save extra fields into our validated data
|
||||
for key, value in pstruct:
|
||||
if key.startswith(RepositoryField.PREFIX):
|
||||
validated_updates[key] = value
|
||||
|
||||
try:
|
||||
RepoModel().update(self.db_repo, **validated_updates)
|
||||
ScmModel().mark_for_invalidation(new_repo_name)
|
||||
|
||||
audit_logger.store(
|
||||
'repo.edit', action_data={'old_data': old_values},
|
||||
user=self._rhodecode_user, repo=self.db_repo)
|
||||
|
||||
Session().commit()
|
||||
|
||||
h.flash(_('Repository {} updated successfully').format(
|
||||
old_repo_name), category='success')
|
||||
except Exception:
|
||||
log.exception("Exception during update of repository")
|
||||
h.flash(_('Error occurred during update of repository {}').format(
|
||||
old_repo_name), category='error')
|
||||
|
||||
raise HTTPFound(
|
||||
self.request.route_path('edit_repo', repo_name=new_repo_name))
|
||||
|
|
@ -200,10 +200,6 @@ def make_map(config):
|
|||
action='index', conditions={'method': ['GET']})
|
||||
m.connect('new_repo', '/create_repository', jsroute=True,
|
||||
action='create_repository', conditions={'method': ['GET']})
|
||||
m.connect('/repos/{repo_name}',
|
||||
action='update', conditions={'method': ['PUT'],
|
||||
'function': check_repo},
|
||||
requirements=URL_NAME_REQUIREMENTS)
|
||||
m.connect('delete_repo', '/repos/{repo_name}',
|
||||
action='delete', conditions={'method': ['DELETE']},
|
||||
requirements=URL_NAME_REQUIREMENTS)
|
||||
|
|
@ -665,11 +661,6 @@ def make_map(config):
|
|||
requirements=URL_NAME_REQUIREMENTS)
|
||||
|
||||
# repo edit options
|
||||
rmap.connect('edit_repo', '/{repo_name}/settings', jsroute=True,
|
||||
controller='admin/repos', action='edit',
|
||||
conditions={'method': ['GET'], 'function': check_repo},
|
||||
requirements=URL_NAME_REQUIREMENTS)
|
||||
|
||||
rmap.connect('edit_repo_perms', '/{repo_name}/settings/permissions',
|
||||
jsroute=True,
|
||||
controller='admin/repos', action='edit_permissions',
|
||||
|
|
|
|||
|
|
@ -288,65 +288,6 @@ class ReposController(BaseRepoController):
|
|||
return {'result': True}
|
||||
return {'result': False}
|
||||
|
||||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
@auth.CSRFRequired()
|
||||
def update(self, repo_name):
|
||||
"""
|
||||
PUT /repos/repo_name: Update an existing item"""
|
||||
# Forms posted to this method should contain a hidden field:
|
||||
# <input type="hidden" name="_method" value="PUT" />
|
||||
# Or using helpers:
|
||||
# h.form(url('repo', repo_name=ID),
|
||||
# method='put')
|
||||
# url('repo', repo_name=ID)
|
||||
|
||||
self.__load_data(repo_name)
|
||||
c.active = 'settings'
|
||||
c.repo_fields = RepositoryField.query()\
|
||||
.filter(RepositoryField.repository == c.repo_info).all()
|
||||
|
||||
repo_model = RepoModel()
|
||||
changed_name = repo_name
|
||||
|
||||
c.personal_repo_group = c.rhodecode_user.personal_repo_group
|
||||
# override the choices with extracted revisions !
|
||||
repo = Repository.get_by_repo_name(repo_name)
|
||||
old_data = {
|
||||
'repo_name': repo_name,
|
||||
'repo_group': repo.group.get_dict() if repo.group else {},
|
||||
'repo_type': repo.repo_type,
|
||||
}
|
||||
_form = RepoForm(
|
||||
edit=True, old_data=old_data, repo_groups=c.repo_groups_choices,
|
||||
landing_revs=c.landing_revs_choices, allow_disabled=True)()
|
||||
|
||||
try:
|
||||
form_result = _form.to_python(dict(request.POST))
|
||||
repo = repo_model.update(repo_name, **form_result)
|
||||
ScmModel().mark_for_invalidation(repo_name)
|
||||
h.flash(_('Repository %s updated successfully') % repo_name,
|
||||
category='success')
|
||||
changed_name = repo.repo_name
|
||||
action_logger(c.rhodecode_user, 'admin_updated_repo',
|
||||
changed_name, self.ip_addr, self.sa)
|
||||
Session().commit()
|
||||
except formencode.Invalid as errors:
|
||||
defaults = self.__load_data(repo_name)
|
||||
defaults.update(errors.value)
|
||||
return htmlfill.render(
|
||||
render('admin/repos/repo_edit.mako'),
|
||||
defaults=defaults,
|
||||
errors=errors.error_dict or {},
|
||||
prefix_error=False,
|
||||
encoding="UTF-8",
|
||||
force_defaults=False)
|
||||
|
||||
except Exception:
|
||||
log.exception("Exception during update of repository")
|
||||
h.flash(_('Error occurred during update of repository %s') \
|
||||
% repo_name, category='error')
|
||||
return redirect(url('edit_repo', repo_name=changed_name))
|
||||
|
||||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
@auth.CSRFRequired()
|
||||
def delete(self, repo_name):
|
||||
|
|
@ -397,28 +338,9 @@ class ReposController(BaseRepoController):
|
|||
"""GET /repos/repo_name: Show a specific item"""
|
||||
# url('repo', repo_name=ID)
|
||||
|
||||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
defaults = self.__load_data(repo_name)
|
||||
if 'clone_uri' in defaults:
|
||||
del defaults['clone_uri']
|
||||
|
||||
c.repo_fields = RepositoryField.query()\
|
||||
.filter(RepositoryField.repository == c.repo_info).all()
|
||||
c.personal_repo_group = c.rhodecode_user.personal_repo_group
|
||||
c.active = 'settings'
|
||||
return htmlfill.render(
|
||||
render('admin/repos/repo_edit.mako'),
|
||||
defaults=defaults,
|
||||
encoding="UTF-8",
|
||||
force_defaults=False)
|
||||
|
||||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit_permissions(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
c.repo_info = self._load_repo(repo_name)
|
||||
c.active = 'permissions'
|
||||
defaults = RepoModel()._get_defaults(repo_name)
|
||||
|
|
@ -446,7 +368,6 @@ class ReposController(BaseRepoController):
|
|||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit_fields(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
c.repo_info = self._load_repo(repo_name)
|
||||
c.repo_fields = RepositoryField.query()\
|
||||
.filter(RepositoryField.repository == c.repo_info).all()
|
||||
|
|
@ -493,7 +414,6 @@ class ReposController(BaseRepoController):
|
|||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit_advanced(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
c.repo_info = self._load_repo(repo_name)
|
||||
c.default_user_id = User.get_default_user().user_id
|
||||
c.in_public_journal = UserFollowing.query()\
|
||||
|
|
@ -638,7 +558,6 @@ class ReposController(BaseRepoController):
|
|||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit_caches_form(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
c.repo_info = self._load_repo(repo_name)
|
||||
c.active = 'caches'
|
||||
|
||||
|
|
@ -660,7 +579,6 @@ class ReposController(BaseRepoController):
|
|||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit_remote_form(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
c.repo_info = self._load_repo(repo_name)
|
||||
c.active = 'remote'
|
||||
|
||||
|
|
@ -682,7 +600,6 @@ class ReposController(BaseRepoController):
|
|||
@HasRepoPermissionAllDecorator('repository.admin')
|
||||
def edit_statistics_form(self, repo_name):
|
||||
"""GET /repo_name/settings: Form to edit an existing item"""
|
||||
# url('edit_repo', repo_name=ID)
|
||||
c.repo_info = self._load_repo(repo_name)
|
||||
repo = c.repo_info.scm_instance()
|
||||
|
||||
|
|
|
|||
|
|
@ -2184,7 +2184,7 @@ class RepoGroup(Base, BaseModel):
|
|||
|
||||
repo_groups = []
|
||||
if show_empty_group:
|
||||
repo_groups = [('-1', u'-- %s --' % _('No parent'))]
|
||||
repo_groups = [(-1, u'-- %s --' % _('No parent'))]
|
||||
|
||||
repo_groups.extend([cls._generate_choice(x) for x in groups])
|
||||
|
||||
|
|
|
|||
|
|
@ -333,12 +333,6 @@ class RepoModel(BaseModel):
|
|||
val = kwargs[k]
|
||||
if strip:
|
||||
k = remove_prefix(k, 'repo_')
|
||||
if k == 'clone_uri':
|
||||
from rhodecode.model.validators import Missing
|
||||
_change = kwargs.get('clone_uri_change')
|
||||
if _change in [Missing, 'OLD']:
|
||||
# we don't change the value, so use original one
|
||||
val = cur_repo.clone_uri
|
||||
|
||||
setattr(cur_repo, k, val)
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ function registerRCRoutes() {
|
|||
pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']);
|
||||
pyroutes.register('repo_default_reviewers_data', '/%(repo_name)s/default-reviewers', ['repo_name']);
|
||||
pyroutes.register('changeset_home', '/%(repo_name)s/changeset/%(revision)s', ['repo_name', 'revision']);
|
||||
pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
|
||||
pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']);
|
||||
pyroutes.register('changeset_comment', '/%(repo_name)s/changeset/%(revision)s/comment', ['repo_name', 'revision']);
|
||||
pyroutes.register('changeset_comment_preview', '/%(repo_name)s/changeset/comment/preview', ['repo_name']);
|
||||
|
|
@ -98,6 +97,7 @@ function registerRCRoutes() {
|
|||
pyroutes.register('user_group_autocomplete_data', '/_user_groups', []);
|
||||
pyroutes.register('repo_list_data', '/_repos', []);
|
||||
pyroutes.register('goto_switcher_data', '/_goto_data', []);
|
||||
pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
|
||||
pyroutes.register('repo_maintenance', '/%(repo_name)s/maintenance', ['repo_name']);
|
||||
pyroutes.register('repo_maintenance_execute', '/%(repo_name)s/maintenance/execute', ['repo_name']);
|
||||
pyroutes.register('strip', '/%(repo_name)s/strip', ['repo_name']);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
<%def name="breadcrumbs_links()">
|
||||
%if c.repo:
|
||||
${h.link_to('Settings',h.url('edit_repo', repo_name=c.repo.repo_name))}
|
||||
${h.link_to('Settings',h.route_path('edit_repo', repo_name=c.repo.repo_name))}
|
||||
»
|
||||
${h.link_to(_('Integrations'),request.route_url(route_name='repo_integrations_home', repo_name=c.repo.repo_name))}
|
||||
»
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
<%def name="breadcrumbs_links()">
|
||||
%if c.repo:
|
||||
${h.link_to('Settings',h.url('edit_repo', repo_name=c.repo.repo_name))}
|
||||
${h.link_to('Settings',h.route_path('edit_repo', repo_name=c.repo.repo_name))}
|
||||
%elif c.repo_group:
|
||||
${h.link_to(_('Admin'),h.url('admin_home'))}
|
||||
»
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
<%def name="breadcrumbs_links()">
|
||||
%if c.repo:
|
||||
${h.link_to('Settings',h.url('edit_repo', repo_name=c.repo.repo_name))}
|
||||
${h.link_to('Settings',h.route_path('edit_repo', repo_name=c.repo.repo_name))}
|
||||
»
|
||||
${h.link_to(_('Integrations'),request.route_url(route_name='repo_integrations_home', repo_name=c.repo.repo_name))}
|
||||
%elif c.repo_group:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
<div class="sidebar">
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
<li class="${'active' if c.active=='settings' else ''}">
|
||||
<a href="${h.url('edit_repo', repo_name=c.repo_name)}">${_('Settings')}</a>
|
||||
<a href="${h.route_path('edit_repo', repo_name=c.repo_name)}">${_('Settings')}</a>
|
||||
</li>
|
||||
<li class="${'active' if c.active=='permissions' else ''}">
|
||||
<a href="${h.url('edit_repo_perms', repo_name=c.repo_name)}">${_('Permissions')}</a>
|
||||
|
|
|
|||
|
|
@ -3,92 +3,110 @@
|
|||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">${_('Settings for Repository: %s') % c.repo_info.repo_name}</h3>
|
||||
<h3 class="panel-title">${_('Settings for Repository: %s') % c.rhodecode_db_repo.repo_name}</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
${h.secure_form(url('repo', repo_name=c.repo_info.repo_name),method='put')}
|
||||
${h.secure_form(h.route_path('edit_repo', repo_name=c.rhodecode_db_repo.repo_name), method='POST')}
|
||||
<div class="form">
|
||||
<!-- fields -->
|
||||
<div class="fields">
|
||||
|
||||
<div class="field">
|
||||
<div class="label">
|
||||
<label for="repo_name">${_('Name')}:</label>
|
||||
</div>
|
||||
<div class="input">
|
||||
${h.text('repo_name',class_="medium")}
|
||||
<p class="help-block">${_('Non-changeable id')}: `_${c.repo_info.repo_id}` <span><a id="show_more_clone_id" href="#">${_('what is that ?')}</a></span></p>
|
||||
${c.form['repo_name'].render(css_class='medium', oid='repo_name')|n}
|
||||
${c.form.render_error(request, c.form['repo_name'])|n}
|
||||
|
||||
<p class="help-block">${_('Non-changeable id')}: `_${c.rhodecode_db_repo.repo_id}` <span><a href="#" onclick="$('#clone_id').toggle();return false">${_('what is that ?')}</a></span></p>
|
||||
<p id="clone_id" style="display:none;">
|
||||
${_('URL by id')}: `${c.repo_info.clone_url(with_id=True)}` </br>
|
||||
${_('URL by id')}: `${c.rhodecode_db_repo.clone_url(with_id=True)}` <br/>
|
||||
${_('''In case this repository is renamed or moved into another group the repository url changes.
|
||||
Using above url guarantees that this repository will always be accessible under such url.
|
||||
Useful for CI systems, or any other cases that you need to hardcode the url into 3rd party service.''')}</p>
|
||||
</div>
|
||||
</div>
|
||||
% if c.repo_info.repo_type != 'svn':
|
||||
|
||||
<div class="field">
|
||||
<div class="label">
|
||||
<label for="repo_group">${_('Repository group')}:</label>
|
||||
</div>
|
||||
<div class="select">
|
||||
${c.form['repo_group'].render(css_class='medium', oid='repo_group')|n}
|
||||
${c.form.render_error(request, c.form['repo_group'])|n}
|
||||
|
||||
% if c.personal_repo_group:
|
||||
<a class="btn" href="#" data-personal-group-name="${c.personal_repo_group.group_name}" data-personal-group-id="${c.personal_repo_group.group_id}" onclick="selectMyGroup(this); return false">
|
||||
${_('Select my personal group (`%(repo_group_name)s`)') % {'repo_group_name': c.personal_repo_group.group_name}}
|
||||
</a>
|
||||
% endif
|
||||
<p class="help-block">${_('Optional select a group to put this repository into.')}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
% if c.rhodecode_db_repo.repo_type != 'svn':
|
||||
<div class="field">
|
||||
<div class="label">
|
||||
<label for="clone_uri">${_('Remote uri')}:</label>
|
||||
</div>
|
||||
<div class="input">
|
||||
%if c.repo_info.clone_uri:
|
||||
%if c.rhodecode_db_repo.clone_uri:
|
||||
## display
|
||||
<div id="clone_uri_hidden" class='text-as-placeholder'>
|
||||
<span id="clone_uri_hidden_value">${c.repo_info.clone_uri_hidden}</span>
|
||||
<span id="clone_uri_hidden_value">${c.rhodecode_db_repo.clone_uri_hidden}</span>
|
||||
<span class="link" id="edit_clone_uri"><i class="icon-edit"></i>${_('edit')}</span>
|
||||
</div>
|
||||
## alter field
|
||||
<div id="alter_clone_uri" style="display: none">
|
||||
${h.text('clone_uri',class_="medium", placeholder=_('new value, leave empty to remove'))}
|
||||
${h.hidden('clone_uri_change', 'OLD')}
|
||||
${c.form['repo_clone_uri'].render(css_class='medium', oid='clone_uri', placeholder=_('enter new value, or leave empty to remove'))|n}
|
||||
${c.form.render_error(request, c.form['repo_clone_uri'])|n}
|
||||
${h.hidden('repo_clone_uri_change', 'OLD')}
|
||||
|
||||
<span class="link" id="cancel_edit_clone_uri">${_('cancel')}</span>
|
||||
</div>
|
||||
%else:
|
||||
## not set yet, display form to set it
|
||||
${h.text('clone_uri',class_="medium")}
|
||||
${h.hidden('clone_uri_change', 'NEW')}
|
||||
${c.form['repo_clone_uri'].render(css_class='medium', oid='clone_uri')|n}
|
||||
${c.form.render_error(request, c.form['repo_clone_uri'])|n}
|
||||
${h.hidden('repo_clone_uri_change', 'NEW')}
|
||||
%endif
|
||||
<p id="alter_clone_uri_help_block" class="help-block">${_('http[s] url where from repository was imported, also used for doing remote pulls.')}</p>
|
||||
<p id="alter_clone_uri_help_block" class="help-block">
|
||||
<% pull_link = h.literal(h.link_to('remote sync', h.url('edit_repo_remote', repo_name=c.repo_name))) %>
|
||||
${_('http[s] url where from repository was imported, this field can used for doing {pull_link}.').format(pull_link=pull_link)|n} <br/>
|
||||
${_('This field is stored encrypted inside Database, a format of http://user:password@server.com/repo_name can be used and will be hidden from display.')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
% else:
|
||||
${h.hidden('clone_uri', '')}
|
||||
% endif
|
||||
% else:
|
||||
${h.hidden('repo_clone_uri', '')}
|
||||
% endif
|
||||
|
||||
<div class="field">
|
||||
<div class="label">
|
||||
<label for="repo_group">${_('Repository group')}:</label>
|
||||
<label for="repo_landing_commit_ref">${_('Landing commit')}:</label>
|
||||
</div>
|
||||
<div class="select">
|
||||
${h.select('repo_group','',c.repo_groups,class_="medium")}
|
||||
% if c.personal_repo_group:
|
||||
<a class="btn" href="#" id="select_my_group" data-personal-group-id="${c.personal_repo_group.group_id}">
|
||||
${_('Select my personal group (%(repo_group_name)s)') % {'repo_group_name': c.personal_repo_group.group_name}}
|
||||
</a>
|
||||
% endif
|
||||
<p class="help-block">${_('Optional select a group to put this repository into.')}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="label">
|
||||
<label for="repo_landing_rev">${_('Landing commit')}:</label>
|
||||
</div>
|
||||
<div class="select">
|
||||
${h.select('repo_landing_rev','',c.landing_revs,class_="medium")}
|
||||
<p class="help-block">${_('Default commit for files page, downloads, whoosh and readme')}</p>
|
||||
${c.form['repo_landing_commit_ref'].render(css_class='medium', oid='repo_landing_commit_ref')|n}
|
||||
${c.form.render_error(request, c.form['repo_landing_commit_ref'])|n}
|
||||
<p class="help-block">${_('Default commit for files page, downloads, full text search index and readme')}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field badged-field">
|
||||
<div class="label">
|
||||
<label for="user">${_('Owner')}:</label>
|
||||
<label for="repo_owner">${_('Owner')}:</label>
|
||||
</div>
|
||||
<div class="input">
|
||||
<div class="badge-input-container">
|
||||
<div class="user-badge">
|
||||
${base.gravatar_with_user(c.repo_info.user.email, show_disabled=not c.repo_info.user.active)}
|
||||
${base.gravatar_with_user(c.rhodecode_db_repo.user.email, show_disabled=not c.rhodecode_db_repo.user.active)}
|
||||
</div>
|
||||
<div class="badge-input-wrap">
|
||||
${h.text('user', class_="medium", autocomplete="off")}
|
||||
${c.form['repo_owner'].render(css_class='medium', oid='repo_owner')|n}
|
||||
</div>
|
||||
</div>
|
||||
<form:error name="user"/>
|
||||
${c.form.render_error(request, c.form['repo_owner'])|n}
|
||||
<p class="help-block">${_('Change owner of this repository.')}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -98,44 +116,49 @@
|
|||
<label for="repo_description">${_('Description')}:</label>
|
||||
</div>
|
||||
<div class="textarea text-area editor">
|
||||
${h.textarea('repo_description', )}
|
||||
${c.form['repo_description'].render(css_class='medium', oid='repo_description')|n}
|
||||
${c.form.render_error(request, c.form['repo_description'])|n}
|
||||
<p class="help-block">${_('Keep it short and to the point. Use a README file for longer descriptions.')}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="label label-checkbox">
|
||||
<label for="repo_private">${_('Private repository')}:</label>
|
||||
<label for="${c.form['repo_private'].oid}">${_('Private repository')}:</label>
|
||||
</div>
|
||||
<div class="checkboxes">
|
||||
${h.checkbox('repo_private',value="True")}
|
||||
${c.form['repo_private'].render(css_class='medium')|n}
|
||||
${c.form.render_error(request, c.form['repo_private'])|n}
|
||||
<span class="help-block">${_('Private repositories are only visible to people explicitly added as collaborators.')}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="label label-checkbox">
|
||||
<label for="repo_enable_statistics">${_('Enable statistics')}:</label>
|
||||
<label for="${c.form['repo_enable_statistics'].oid}">${_('Enable statistics')}:</label>
|
||||
</div>
|
||||
<div class="checkboxes">
|
||||
${h.checkbox('repo_enable_statistics',value="True")}
|
||||
${c.form['repo_enable_statistics'].render(css_class='medium')|n}
|
||||
${c.form.render_error(request, c.form['repo_enable_statistics'])|n}
|
||||
<span class="help-block">${_('Enable statistics window on summary page.')}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="label label-checkbox">
|
||||
<label for="repo_enable_downloads">${_('Enable downloads')}:</label>
|
||||
<label for="${c.form['repo_enable_downloads'].oid}">${_('Enable downloads')}:</label>
|
||||
</div>
|
||||
<div class="checkboxes">
|
||||
${h.checkbox('repo_enable_downloads',value="True")}
|
||||
${c.form['repo_enable_downloads'].render(css_class='medium')|n}
|
||||
${c.form.render_error(request, c.form['repo_enable_downloads'])|n}
|
||||
<span class="help-block">${_('Enable download menu on summary page.')}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="label label-checkbox">
|
||||
<label for="repo_enable_locking">${_('Enable automatic locking')}:</label>
|
||||
<label for="${c.form['repo_enable_locking'].oid}">${_('Enable automatic locking')}:</label>
|
||||
</div>
|
||||
<div class="checkboxes">
|
||||
${h.checkbox('repo_enable_locking',value="True")}
|
||||
${c.form['repo_enable_locking'].render(css_class='medium')|n}
|
||||
${c.form.render_error(request, c.form['repo_enable_locking'])|n}
|
||||
<span class="help-block">${_('Enable automatic locking on repository. Pulling from this repository creates a lock that can be released by pushing back by the same user')}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -168,12 +191,6 @@
|
|||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
var select2Options = {
|
||||
'containerCssClass': "drop-menu",
|
||||
'dropdownCssClass': "drop-menu-dropdown",
|
||||
'dropdownAutoWidth': true
|
||||
};
|
||||
|
||||
var cloneUrl = function() {
|
||||
var alterButton = $('#alter_clone_uri');
|
||||
var editButton = $('#edit_clone_uri');
|
||||
|
|
@ -182,7 +199,7 @@
|
|||
var hiddenUrlValue = $('#clone_uri_hidden_value');
|
||||
var input = $('#clone_uri');
|
||||
var helpBlock = $('#alter_clone_uri_help_block');
|
||||
var changedFlag = $('#clone_uri_change');
|
||||
var changedFlag = $('#repo_clone_uri_change');
|
||||
var originalText = helpBlock.html();
|
||||
var obfuscatedUrl = hiddenUrlValue.html();
|
||||
|
||||
|
|
@ -223,18 +240,10 @@
|
|||
initEvents();
|
||||
}();
|
||||
|
||||
$('#show_more_clone_id').on('click', function(e){
|
||||
$('#clone_id').show();
|
||||
e.preventDefault();
|
||||
});
|
||||
selectMyGroup = function(element) {
|
||||
$("#repo_group").val($(element).data('personalGroupId')).trigger("change");
|
||||
};
|
||||
|
||||
$('#repo_landing_rev').select2(select2Options);
|
||||
$('#repo_group').select2(select2Options);
|
||||
|
||||
UsersAutoComplete('user', '${c.rhodecode_user.user_id}');
|
||||
$('#select_my_group').on('click', function(e){
|
||||
e.preventDefault();
|
||||
$("#repo_group").val($(this).data('personalGroupId')).trigger("change");
|
||||
});
|
||||
UsersAutoComplete('repo_owner', '${c.rhodecode_user.user_id}');
|
||||
});
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -246,7 +246,7 @@
|
|||
<a class="menulink" href="#" class="dropdown"><div class="menulabel">${_('Options')} <div class="show_more"></div></div></a>
|
||||
<ul class="submenu">
|
||||
%if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
|
||||
<li><a href="${h.url('edit_repo',repo_name=c.repo_name)}">${_('Settings')}</a></li>
|
||||
<li><a href="${h.route_path('edit_repo',repo_name=c.repo_name)}">${_('Settings')}</a></li>
|
||||
%endif
|
||||
%if c.rhodecode_db_repo.fork:
|
||||
<li><a href="${h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,source_ref_type=c.rhodecode_db_repo.landing_rev[0],source_ref=c.rhodecode_db_repo.landing_rev[1], target_repo=c.repo_name,target_ref_type='branch' if request.GET.get('branch') else c.rhodecode_db_repo.landing_rev[0],target_ref=request.GET.get('branch') or c.rhodecode_db_repo.landing_rev[1], merge=1)}">
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
%>
|
||||
<div class="${'repo_state_pending' if rstate == 'repo_state_pending' else ''} truncate">
|
||||
##NAME
|
||||
<a href="${h.url('edit_repo' if admin else 'summary_home',repo_name=name)}">
|
||||
<a href="${h.route_path('edit_repo',repo_name=name) if admin else h.url('summary_home',repo_name=name)}">
|
||||
|
||||
##TYPE OF REPO
|
||||
%if h.is_hg(rtype):
|
||||
|
|
@ -115,7 +115,7 @@
|
|||
<%def name="repo_actions(repo_name, super_user=True)">
|
||||
<div>
|
||||
<div class="grid_edit">
|
||||
<a href="${h.url('edit_repo',repo_name=repo_name)}" title="${_('Edit')}">
|
||||
<a href="${h.route_path('edit_repo',repo_name=repo_name)}" title="${_('Edit')}">
|
||||
<i class="icon-pencil"></i>Edit</a>
|
||||
</div>
|
||||
<div class="grid_delete">
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@
|
|||
${_('Statistics are disabled for this repository')}
|
||||
</span>
|
||||
% if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
|
||||
, ${h.link_to(_('enable statistics'),h.url('edit_repo',repo_name=c.repo_name, anchor='repo_enable_statistics'))}
|
||||
, ${h.link_to(_('enable statistics'),h.route_path('edit_repo',repo_name=c.repo_name, anchor='repo_enable_statistics'))}
|
||||
% endif
|
||||
% endif
|
||||
</div>
|
||||
|
|
@ -169,7 +169,7 @@
|
|||
${_('Downloads are disabled for this repository')}
|
||||
</span>
|
||||
% if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
|
||||
, ${h.link_to(_('enable downloads'),h.url('edit_repo',repo_name=c.repo_name, anchor='repo_enable_downloads'))}
|
||||
, ${h.link_to(_('enable downloads'),h.route_path('edit_repo',repo_name=c.repo_name, anchor='repo_enable_downloads'))}
|
||||
% endif
|
||||
% else:
|
||||
<span class="enabled">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue