diff --git a/rhodecode/apps/repository/__init__.py b/rhodecode/apps/repository/__init__.py
--- a/rhodecode/apps/repository/__init__.py
+++ b/rhodecode/apps/repository/__init__.py
@@ -26,6 +26,12 @@ def includeme(config):
name='edit_repo',
pattern='/{repo_name:.*?[^/]}/settings', repo_route=True)
+ # Caches
+ config.add_route(
+ name='edit_repo_caches',
+ pattern='/{repo_name:.*?[^/]}/settings/caches', repo_route=True)
+
+ # Maintenance
config.add_route(
name='repo_maintenance',
pattern='/{repo_name:.*?[^/]}/maintenance', repo_route=True)
diff --git a/rhodecode/apps/repository/tests/test_repo_settings.py b/rhodecode/apps/repository/tests/test_repo_settings.py
--- a/rhodecode/apps/repository/tests/test_repo_settings.py
+++ b/rhodecode/apps/repository/tests/test_repo_settings.py
@@ -38,6 +38,7 @@ def route_path(name, params=None, **kwar
base_url = {
'edit_repo': '/{repo_name}/settings',
+ 'edit_repo_caches': '/{repo_name}/settings/caches',
}[name].format(**kwargs)
if params:
@@ -58,6 +59,7 @@ def _get_permission_for_user(user, repo)
class TestAdminRepoSettings(object):
@pytest.mark.parametrize('urlname', [
'edit_repo',
+ 'edit_repo_caches'
])
def test_show_page(self, urlname, app, backend):
app.get(route_path(urlname, repo_name=backend.repo_name), status=200)
@@ -75,7 +77,6 @@ class TestAdminRepoSettings(object):
'repo_vcs_settings',
'edit_repo_fields',
'repo_settings_issuetracker',
- 'edit_repo_caches',
'edit_repo_remote',
'edit_repo_statistics',
])
diff --git a/rhodecode/apps/repository/views/repo_caches.py b/rhodecode/apps/repository/views/repo_caches.py
new file mode 100644
--- /dev/null
+++ b/rhodecode/apps/repository/views/repo_caches.py
@@ -0,0 +1,76 @@
+# -*- 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 .
+#
+# 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
+
+from pyramid.httpexceptions import HTTPFound
+from pyramid.view import view_config
+
+from rhodecode.apps._base import RepoAppView
+from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
+from rhodecode.lib import helpers as h
+from rhodecode.model.meta import Session
+from rhodecode.model.scm import ScmModel
+
+log = logging.getLogger(__name__)
+
+
+class RepoCachesView(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
+
+ self._register_global_c(c)
+ return c
+
+ @LoginRequired()
+ @HasRepoPermissionAnyDecorator('repository.admin')
+ @view_config(
+ route_name='edit_repo_caches', request_method='GET',
+ renderer='rhodecode:templates/admin/repos/repo_edit.mako')
+ def repo_caches(self):
+ c = self.load_default_context()
+ c.active = 'caches'
+
+ return self._get_template_context(c)
+
+ @LoginRequired()
+ @HasRepoPermissionAnyDecorator('repository.admin')
+ @view_config(
+ route_name='edit_repo_caches', request_method='POST')
+ def repo_caches_purge(self):
+ _ = self.request.translate
+ c = self.load_default_context()
+ c.active = 'caches'
+
+ try:
+ ScmModel().mark_for_invalidation(self.db_repo_name, delete=True)
+ Session().commit()
+ h.flash(_('Cache invalidation successful'),
+ category='success')
+ except Exception:
+ log.exception("Exception during cache invalidation")
+ h.flash(_('An error occurred during cache invalidation'),
+ category='error')
+
+ raise HTTPFound(h.route_path(
+ 'edit_repo_caches', repo_name=self.db_repo_name))
\ No newline at end of file
diff --git a/rhodecode/config/routing.py b/rhodecode/config/routing.py
--- a/rhodecode/config/routing.py
+++ b/rhodecode/config/routing.py
@@ -708,15 +708,6 @@ def make_map(config):
conditions={'method': ['PUT'], 'function': check_repo},
requirements=URL_NAME_REQUIREMENTS)
- rmap.connect('edit_repo_caches', '/{repo_name}/settings/caches',
- controller='admin/repos', action='edit_caches_form',
- conditions={'method': ['GET'], 'function': check_repo},
- requirements=URL_NAME_REQUIREMENTS)
- rmap.connect('edit_repo_caches', '/{repo_name}/settings/caches',
- controller='admin/repos', action='edit_caches',
- conditions={'method': ['PUT'], 'function': check_repo},
- requirements=URL_NAME_REQUIREMENTS)
-
rmap.connect('edit_repo_remote', '/{repo_name}/settings/remote',
controller='admin/repos', action='edit_remote_form',
conditions={'method': ['GET'], 'function': check_repo},
diff --git a/rhodecode/controllers/admin/repos.py b/rhodecode/controllers/admin/repos.py
--- a/rhodecode/controllers/admin/repos.py
+++ b/rhodecode/controllers/admin/repos.py
@@ -541,30 +541,6 @@ class ReposController(BaseRepoController
@HasRepoPermissionAllDecorator('repository.admin')
@auth.CSRFRequired()
- def edit_caches(self, repo_name):
- """PUT /{repo_name}/settings/caches: invalidate the repo caches."""
- try:
- ScmModel().mark_for_invalidation(repo_name, delete=True)
- Session().commit()
- h.flash(_('Cache invalidation successful'),
- category='success')
- except Exception:
- log.exception("Exception during cache invalidation")
- h.flash(_('An error occurred during cache invalidation'),
- category='error')
-
- return redirect(url('edit_repo_caches', repo_name=c.repo_name))
-
- @HasRepoPermissionAllDecorator('repository.admin')
- def edit_caches_form(self, repo_name):
- """GET /repo_name/settings: Form to edit an existing item"""
- c.repo_info = self._load_repo(repo_name)
- c.active = 'caches'
-
- return render('admin/repos/repo_edit.mako')
-
- @HasRepoPermissionAllDecorator('repository.admin')
- @auth.CSRFRequired()
def edit_remote(self, repo_name):
"""PUT /{repo_name}/settings/remote: edit the repo remote."""
try:
diff --git a/rhodecode/public/js/rhodecode/routes.js b/rhodecode/public/js/rhodecode/routes.js
--- a/rhodecode/public/js/rhodecode/routes.js
+++ b/rhodecode/public/js/rhodecode/routes.js
@@ -98,6 +98,7 @@ function registerRCRoutes() {
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('edit_repo_caches', '/%(repo_name)s/settings/caches', ['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']);
diff --git a/rhodecode/templates/admin/repos/repo_edit.mako b/rhodecode/templates/admin/repos/repo_edit.mako
--- a/rhodecode/templates/admin/repos/repo_edit.mako
+++ b/rhodecode/templates/admin/repos/repo_edit.mako
@@ -58,7 +58,7 @@
${_('Issue Tracker')}
- ${_('Caches')}
+ ${_('Caches')}
%if c.repo_info.repo_type != 'svn':
diff --git a/rhodecode/templates/admin/repos/repo_edit_caches.mako b/rhodecode/templates/admin/repos/repo_edit_caches.mako
--- a/rhodecode/templates/admin/repos/repo_edit_caches.mako
+++ b/rhodecode/templates/admin/repos/repo_edit_caches.mako
@@ -3,21 +3,25 @@
${_('Invalidate Cache for Repository')}
- ${h.secure_form(url('edit_repo_caches', repo_name=c.repo_name), method='put')}
-
+
+
${_('Manually invalidate the repository cache. On the next access a repository cache will be recreated.')}
+
+
+ ${_('Cache purge can be automated by such api call called periodically (in crontab etc)')}
+
+
+ curl ${h.route_url('apiv2')} -X POST -H 'content-type:text/plain' --data-binary '{"id":1, "auth_token":"SECRET", "method":"invalidate_cache", "args":{"repoid":"${c.repo_info.repo_name}"}}'
+
+
+
+ ${h.secure_form(h.route_path('edit_repo_caches', repo_name=c.repo_name), method='POST')}
+
${h.end_form()}
+
@@ -25,7 +29,7 @@
- ${(ungettext('List of repository caches (%(count)s entry)', 'List of repository caches (%(count)s entries)' ,len(c.repo_info.cache_keys)) % {'count': len(c.repo_info.cache_keys)})}
+ ${(_ungettext('List of repository caches (%(count)s entry)', 'List of repository caches (%(count)s entries)' ,len(c.repo_info.cache_keys)) % {'count': len(c.repo_info.cache_keys)})}