changeset 356:b0715a788432

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
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 24 Jul 2010 00:21:57 +0200
parents 5bbcc0cac389
children ebdd1a89cdd9
files pylons_app/controllers/admin/repos.py pylons_app/controllers/settings.py pylons_app/model/forms.py pylons_app/model/repo_model.py
diffstat 4 files changed, 69 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/controllers/admin/repos.py	Wed Jul 21 22:57:36 2010 +0200
+++ b/pylons_app/controllers/admin/repos.py	Sat Jul 24 00:21:57 2010 +0200
@@ -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.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 @@
         # 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 @@
                     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 @@
         #           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"""
--- a/pylons_app/controllers/settings.py	Wed Jul 21 22:57:36 2010 +0200
+++ b/pylons_app/controllers/settings.py	Sat Jul 24 00:21:57 2010 +0200
@@ -2,7 +2,7 @@
 # encoding: utf-8
 # settings controller for pylons
 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
- 
+# 
 # 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 @@
 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 @@
 
     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 @@
             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']))
--- a/pylons_app/model/forms.py	Wed Jul 21 22:57:36 2010 +0200
+++ b/pylons_app/model/forms.py	Sat Jul 24 00:21:57 2010 +0200
@@ -124,7 +124,9 @@
                                          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 @@
         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 @@
             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 @@
         
     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 @@
         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)
         
--- a/pylons_app/model/repo_model.py	Wed Jul 21 22:57:36 2010 +0200
+++ b/pylons_app/model/repo_model.py	Sat Jul 24 00:21:57 2010 +0200
@@ -54,6 +54,7 @@
     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 @@
             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):