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:
Marcin Kuzminski 2017-04-28 12:39:24 +02:00
parent 8bf9c820c0
commit b26439b549
15 changed files with 268 additions and 175 deletions

View file

@ -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',

View 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))

View file

@ -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',

View file

@ -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()

View file

@ -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])

View file

@ -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)

View file

@ -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']);

View file

@ -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))}
&raquo;
${h.link_to(_('Integrations'),request.route_url(route_name='repo_integrations_home', repo_name=c.repo.repo_name))}
&raquo;

View file

@ -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'))}
&raquo;

View file

@ -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))}
&raquo;
${h.link_to(_('Integrations'),request.route_url(route_name='repo_integrations_home', repo_name=c.repo.repo_name))}
%elif c.repo_group:

View file

@ -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>

View file

@ -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>

View file

@ -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)}">

View file

@ -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">

View file

@ -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">