diff --git a/pylons_app/controllers/admin/repos.py b/pylons_app/controllers/admin/repos.py --- a/pylons_app/controllers/admin/repos.py +++ b/pylons_app/controllers/admin/repos.py @@ -16,11 +16,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. -""" -Created on April 7, 2010 -admin controller for pylons -@author: marcink -""" from formencode import htmlfill from operator import itemgetter from pylons import request, response, session, tmpl_context as c, url @@ -35,6 +30,12 @@ from pylons_app.model.hg_model import Hg from pylons_app.model.repo_model import RepoModel import formencode import logging +import traceback +""" +Created on April 7, 2010 +admin controller for pylons +@author: marcink +""" log = logging.getLogger(__name__) class ReposController(BaseController): @@ -62,6 +63,7 @@ class ReposController(BaseController): # url('repos') repo_model = RepoModel() _form = RepoForm()() + form_result = None try: form_result = _form.to_python(dict(request.POST)) repo_model.create(form_result, c.hg_app_user) @@ -70,16 +72,22 @@ class ReposController(BaseController): category='success') except formencode.Invalid as errors: - c.form_errors = errors.error_dict c.new_repo = errors.value['repo_name'] return htmlfill.render( - render('admin/repos/repo_add.html'), + render('admin/repos/repo_add.html'), defaults=errors.value, - encoding="UTF-8") + errors=errors.error_dict or {}, + prefix_error=False, + encoding="UTF-8") except Exception: - h.flash(_('error occured during creation of repository %s') \ - % form_result['repo_name'], category='error') + log.error(traceback.format_exc()) + if form_result: + msg = _('error occured during creation of repository %s') \ + % form_result['repo_name'] + else: + msg = _('error occured during creation of repository') + h.flash(msg, category='error') return redirect('repos') @@ -99,27 +107,34 @@ class ReposController(BaseController): # method='put') # url('repo', repo_name=ID) repo_model = RepoModel() - _form = RepoForm(edit=True)() + changed_name = repo_name + _form = RepoForm(edit=True, old_data={'repo_name':repo_name})() + try: form_result = _form.to_python(dict(request.POST)) repo_model.update(repo_name, form_result) invalidate_cache('cached_repo_list') h.flash(_('Repository %s updated succesfully' % repo_name), category='success') - + changed_name = form_result['repo_name'] except formencode.Invalid as errors: c.repo_info = repo_model.get(repo_name) c.users_array = repo_model.get_users_js() errors.value.update({'user':c.repo_info.user.username}) - c.form_errors = errors.error_dict return htmlfill.render( - render('admin/repos/repo_edit.html'), + render('admin/repos/repo_edit.html'), defaults=errors.value, + errors=errors.error_dict or {}, + prefix_error=False, encoding="UTF-8") + except Exception: + log.error(traceback.format_exc()) h.flash(_('error occured during update of repository %s') \ - % form_result['repo_name'], category='error') - return redirect(url('repos')) + % repo_name, category='error') + + + return redirect(url('edit_repo', repo_name=changed_name)) def delete(self, repo_name): """DELETE /repos/repo_name: Delete an existing item""" diff --git a/pylons_app/controllers/settings.py b/pylons_app/controllers/settings.py --- a/pylons_app/controllers/settings.py +++ b/pylons_app/controllers/settings.py @@ -2,7 +2,7 @@ # encoding: utf-8 # settings controller for pylons # Copyright (C) 2009-2010 Marcin Kuzminski - +# # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2 @@ -17,11 +17,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. -""" -Created on June 30, 2010 -settings controller for pylons -@author: marcink -""" from formencode import htmlfill from pylons import tmpl_context as c, request, url from pylons.controllers.util import redirect @@ -34,6 +29,12 @@ from pylons_app.model.repo_model import import formencode import logging import pylons_app.lib.helpers as h +import traceback +""" +Created on June 30, 2010 +settings controller for pylons +@author: marcink +""" log = logging.getLogger(__name__) class SettingsController(BaseController): @@ -71,7 +72,7 @@ class SettingsController(BaseController) def update(self, repo_name): repo_model = RepoModel() - _form = RepoSettingsForm(edit=True)() + _form = RepoSettingsForm(edit=True, old_data={'repo_name':repo_name})() try: form_result = _form.to_python(dict(request.POST)) repo_model.update(repo_name, form_result) @@ -83,13 +84,15 @@ class SettingsController(BaseController) c.repo_info = repo_model.get(repo_name) c.users_array = repo_model.get_users_js() errors.value.update({'user':c.repo_info.user.username}) - c.form_errors = errors.error_dict return htmlfill.render( - render('admin/repos/repo_edit.html'), + render('settings/repo_settings.html'), defaults=errors.value, - encoding="UTF-8") + errors=errors.error_dict or {}, + prefix_error=False, + encoding="UTF-8") except Exception: + log.error(traceback.format_exc()) h.flash(_('error occured during update of repository %s') \ % form_result['repo_name'], category='error') - return redirect(url('repo_settings_home', repo_name=repo_name)) + return redirect(url('repo_settings_home', repo_name=form_result['repo_name'])) diff --git a/pylons_app/model/forms.py b/pylons_app/model/forms.py --- a/pylons_app/model/forms.py +++ b/pylons_app/model/forms.py @@ -124,7 +124,9 @@ class ValidAuth(formencode.validators.Fa value, state, error_dict=self.e_dict_disable) - meta.Session.remove() + meta.Session.remove() + + class ValidRepoUser(formencode.validators.FancyValidator): def to_python(self, value, state): @@ -136,9 +138,10 @@ class ValidRepoUser(formencode.validator except Exception: raise formencode.Invalid(_('This username is not valid'), value, state) + meta.Session.remove() return self.user_db.user_id -def ValidRepoName(edit=False): +def ValidRepoName(edit, old_data): class _ValidRepoName(formencode.validators.FancyValidator): def to_python(self, value, state): @@ -146,12 +149,16 @@ def ValidRepoName(edit=False): if slug in ['_admin']: raise formencode.Invalid(_('This repository name is disallowed'), value, state) - sa = meta.Session - if sa.query(Repository).get(slug) and not edit: - raise formencode.Invalid(_('This repository already exists'), - value, state) - + + if old_data.get('repo_name') != value or not edit: + sa = meta.Session + if sa.query(Repository).get(slug): + raise formencode.Invalid(_('This repository already exists') , + value, state) + meta.Session.remove() return slug + + return _ValidRepoName class ValidPerms(formencode.validators.FancyValidator): @@ -243,11 +250,11 @@ def UserForm(edit=False): return _UserForm -def RepoForm(edit=False): +def RepoForm(edit=False, old_data={}): class _RepoForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = False - repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit)) + repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit, old_data)) description = UnicodeString(strip=True, min=3, not_empty=True) private = StringBoolean(if_missing=False) @@ -257,11 +264,11 @@ def RepoForm(edit=False): chained_validators = [ValidPerms] return _RepoForm -def RepoSettingsForm(edit=False): +def RepoSettingsForm(edit=False, old_data={}): class _RepoForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = False - repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit)) + repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit, old_data)) description = UnicodeString(strip=True, min=3, not_empty=True) private = StringBoolean(if_missing=False) diff --git a/pylons_app/model/repo_model.py b/pylons_app/model/repo_model.py --- a/pylons_app/model/repo_model.py +++ b/pylons_app/model/repo_model.py @@ -54,6 +54,7 @@ class RepoModel(object): def update(self, repo_id, form_data): try: if repo_id != form_data['repo_name']: + #rename our data self.__rename_repo(repo_id, form_data['repo_name']) cur_repo = self.sa.query(Repository).get(repo_id) for k, v in form_data.items(): @@ -150,9 +151,13 @@ class RepoModel(object): MercurialRepository(repo_path, create=True) def __rename_repo(self, old, new): - log.info('renaming repoo from %s to %s', old, new) + log.info('renaming repo from %s to %s', old, new) + old_path = os.path.join(g.base_path, old) new_path = os.path.join(g.base_path, new) + if os.path.isdir(new_path): + raise Exception('Was trying to rename to already existing dir %s', + new_path) shutil.move(old_path, new_path) def __delete_repo(self, name):