# HG changeset patch # User Marcin Kuzminski # Date 2010-07-23 22:21:57 # Node ID b0715a788432a65b4e0115a749ffad4a7eb755f7 # Parent 5bbcc0cac38936b499293f77210a9920b1bbc2c6 Added new style error display, fixed changing repo name to existing one some sa session remove added rename repo BIG bug, when renaming to existing name was fixed 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):