changeset 1749:8ecc6b8229a5 beta

commit less models - models don't do any commits(with few exceptions) - all db transactions should be handled by higher level modules like controllers, celery tasks
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 02 Dec 2011 22:31:13 +0200
parents a3ee2611e6e8
children cbcae0c83eb0
files rhodecode/controllers/admin/permissions.py rhodecode/controllers/admin/repos.py rhodecode/controllers/admin/repos_groups.py rhodecode/controllers/admin/settings.py rhodecode/controllers/admin/users.py rhodecode/controllers/admin/users_groups.py rhodecode/controllers/api/api.py rhodecode/controllers/changeset.py rhodecode/controllers/journal.py rhodecode/controllers/login.py rhodecode/controllers/settings.py rhodecode/lib/auth.py rhodecode/lib/base.py rhodecode/lib/celerylib/tasks.py rhodecode/lib/db_manage.py rhodecode/lib/dbmigrate/schema/db_1_2_0.py rhodecode/lib/utils.py rhodecode/model/__init__.py rhodecode/model/db.py rhodecode/model/forms.py rhodecode/model/repo.py rhodecode/model/user.py rhodecode/model/users_group.py rhodecode/templates/files/files.html rhodecode/tests/_test_concurency.py rhodecode/tests/functional/test_admin_notifications.py rhodecode/tests/functional/test_admin_repos.py rhodecode/tests/functional/test_admin_settings.py rhodecode/tests/functional/test_admin_users.py rhodecode/tests/functional/test_admin_users_groups.py rhodecode/tests/functional/test_changeset_comments.py rhodecode/tests/functional/test_files.py rhodecode/tests/functional/test_forks.py rhodecode/tests/functional/test_journal.py rhodecode/tests/functional/test_login.py rhodecode/tests/functional/test_summary.py rhodecode/tests/test_models.py rhodecode/websetup.py
diffstat 38 files changed, 312 insertions(+), 339 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/permissions.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/admin/permissions.py	Fri Dec 02 22:31:13 2011 +0200
@@ -102,7 +102,7 @@
             form_result = _form.to_python(dict(request.POST))
             form_result.update({'perm_user_name': id})
             permission_model.update(form_result)
-            Session().commit()
+            Session.commit()
             h.flash(_('Default permissions updated successfully'),
                     category='success')
 
--- a/rhodecode/controllers/admin/repos.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/admin/repos.py	Fri Dec 02 22:31:13 2011 +0200
@@ -150,7 +150,7 @@
             else:
                 action_logger(self.rhodecode_user, 'admin_created_repo',
                               form_result['repo_name_full'], '', self.sa)
-            Session().commit()
+            Session.commit()
         except formencode.Invalid, errors:
 
             c.new_repo = errors.value['repo_name']
@@ -208,7 +208,7 @@
             changed_name = repo.repo_name
             action_logger(self.rhodecode_user, 'admin_updated_repo',
                               changed_name, '', self.sa)
-            Session().commit()
+            Session.commit()
         except formencode.Invalid, errors:
             defaults = self.__load_data(repo_name)
             defaults.update(errors.value)
@@ -252,7 +252,7 @@
             repo_model.delete(repo)
             invalidate_cache('get_repo_cached_%s' % repo_name)
             h.flash(_('deleted repository %s') % repo_name, category='success')
-            Session().commit()
+            Session.commit()
         except IntegrityError, e:
             if e.message.find('repositories_fork_id_fkey'):
                 log.error(traceback.format_exc())
--- a/rhodecode/controllers/admin/repos_groups.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/admin/repos_groups.py	Fri Dec 02 22:31:13 2011 +0200
@@ -71,7 +71,7 @@
         try:
             form_result = repos_group_form.to_python(dict(request.POST))
             ReposGroupModel().create(form_result)
-            Session().commit()
+            Session.commit()
             h.flash(_('created repos group %s') \
                     % form_result['group_name'], category='success')
             #TODO: in futureaction_logger(, '', '', '', self.sa)
@@ -118,7 +118,7 @@
         try:
             form_result = repos_group_form.to_python(dict(request.POST))
             ReposGroupModel().update(id, form_result)
-            Session().commit()
+            Session.commit()
             h.flash(_('updated repos group %s') \
                     % form_result['group_name'], category='success')
             #TODO: in futureaction_logger(, '', '', '', self.sa)
@@ -158,7 +158,7 @@
 
         try:
             ReposGroupModel().delete(id)
-            Session().commit()
+            Session.commit()
             h.flash(_('removed repos group %s' % gr.group_name), category='success')
             #TODO: in future action_logger(, '', '', '', self.sa)
         except IntegrityError, e:
--- a/rhodecode/controllers/admin/settings.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/admin/settings.py	Fri Dec 02 22:31:13 2011 +0200
@@ -48,6 +48,7 @@
 from rhodecode.model.user import UserModel
 from rhodecode.model.db import User
 from rhodecode.model.notification import EmailNotificationModel
+from rhodecode.model.meta import Session
 
 log = logging.getLogger(__name__)
 
@@ -247,7 +248,7 @@
 
                 if update:
                     h.flash(_('Updated hooks'), category='success')
-
+                Session.commit()
             except:
                 log.error(traceback.format_exc())
                 h.flash(_('error occurred during hook creation'),
@@ -353,7 +354,7 @@
             user_model.update_my_account(uid, form_result)
             h.flash(_('Your account was updated successfully'),
                     category='success')
-
+            Session.commit()
         except formencode.Invalid, errors:
             c.user = User.get(self.rhodecode_user.user_id)
             all_repos = self.sa.query(Repository)\
--- a/rhodecode/controllers/admin/users.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/admin/users.py	Fri Dec 02 22:31:13 2011 +0200
@@ -41,6 +41,7 @@
 from rhodecode.model.db import User, UserRepoToPerm, UserToPerm, Permission
 from rhodecode.model.forms import UserForm
 from rhodecode.model.user import UserModel
+from rhodecode.model.meta import Session
 
 log = logging.getLogger(__name__)
 
@@ -77,6 +78,7 @@
             user_model.create(form_result)
             h.flash(_('created user %s') % form_result['username'],
                     category='success')
+            Session.commit()
             #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
         except formencode.Invalid, errors:
             return htmlfill.render(
@@ -114,11 +116,11 @@
             form_result = _form.to_python(dict(request.POST))
             user_model.update(id, form_result)
             h.flash(_('User updated successfully'), category='success')
-
+            Session.commit()
         except formencode.Invalid, errors:
             e = errors.error_dict or {}
             perm = Permission.get_by_key('hg.create.repository')
-            e.update({'create_repo_perm': UserToPerm.has_perm(id, perm)})
+            e.update({'create_repo_perm': user_model.has_perm(id, perm)})
             return htmlfill.render(
                 render('admin/users/user_edit.html'),
                 defaults=errors.value,
@@ -144,6 +146,7 @@
         try:
             user_model.delete(id)
             h.flash(_('successfully deleted user'), category='success')
+            Session.commit()
         except (UserOwnsReposException, DefaultUserException), e:
             h.flash(str(e), category='warning')
         except Exception:
@@ -158,20 +161,19 @@
     def edit(self, id, format='html'):
         """GET /users/id/edit: Form to edit an existing item"""
         # url('edit_user', id=ID)
-        user_model = UserModel()
-        c.user = user_model.get(id)
+        c.user = User.get(id)
         if not c.user:
             return redirect(url('users'))
         if c.user.username == 'default':
             h.flash(_("You can't edit this user"), category='warning')
             return redirect(url('users'))
         c.user.permissions = {}
-        c.granted_permissions = user_model.fill_perms(c.user)\
+        c.granted_permissions = UserModel().fill_perms(c.user)\
             .permissions['global']
 
         defaults = c.user.get_dict()
         perm = Permission.get_by_key('hg.create.repository')
-        defaults.update({'create_repo_perm': UserToPerm.has_perm(id, perm)})
+        defaults.update({'create_repo_perm': UserModel().has_perm(id, perm)})
 
         return htmlfill.render(
             render('admin/users/user_edit.html'),
@@ -185,22 +187,23 @@
         # url('user_perm', id=ID, method='put')
 
         grant_perm = request.POST.get('create_repo_perm', False)
-
+        user_model = UserModel()
+        
         if grant_perm:
             perm = Permission.get_by_key('hg.create.none')
-            UserToPerm.revoke_perm(id, perm)
+            user_model.revoke_perm(id, perm)
 
             perm = Permission.get_by_key('hg.create.repository')
-            UserToPerm.grant_perm(id, perm)
+            user_model.grant_perm(id, perm)
             h.flash(_("Granted 'repository create' permission to user"),
                     category='success')
 
         else:
             perm = Permission.get_by_key('hg.create.repository')
-            UserToPerm.revoke_perm(id, perm)
+            user_model.revoke_perm(id, perm)
 
             perm = Permission.get_by_key('hg.create.none')
-            UserToPerm.grant_perm(id, perm)
+            user_model.grant_perm(id, perm)
             h.flash(_("Revoked 'repository create' permission to user"),
                     category='success')
 
--- a/rhodecode/controllers/admin/users_groups.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/admin/users_groups.py	Fri Dec 02 22:31:13 2011 +0200
@@ -33,12 +33,15 @@
 from pylons.i18n.translation import _
 
 from rhodecode.lib.exceptions import UsersGroupsAssignedException
-from rhodecode.lib import helpers as h
+from rhodecode.lib import helpers as h, safe_unicode
 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
 from rhodecode.lib.base import BaseController, render
 
+from rhodecode.model.users_group import UsersGroupModel
+
 from rhodecode.model.db import User, UsersGroup, Permission, UsersGroupToPerm
-from rhodecode.model.forms import UserForm, UsersGroupForm
+from rhodecode.model.forms import UsersGroupForm
+from rhodecode.model.meta import Session
 
 log = logging.getLogger(__name__)
 
@@ -70,10 +73,12 @@
         users_group_form = UsersGroupForm()()
         try:
             form_result = users_group_form.to_python(dict(request.POST))
-            UsersGroup.create(form_result)
+            UsersGroupModel().create(name=form_result['users_group_name'],
+                                     active=form_result['users_group_active'])
             h.flash(_('created users group %s') \
                     % form_result['users_group_name'], category='success')
             #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
+            Session.commit()
         except formencode.Invalid, errors:
             return htmlfill.render(
                 render('admin/users_groups/users_group_add.html'),
@@ -108,24 +113,27 @@
 
         c.available_members = [(x.user_id, x.username) for x in
                                self.sa.query(User).all()]
+        
+        available_members = [safe_unicode(x[0]) for x in c.available_members]
+        
         users_group_form = UsersGroupForm(edit=True,
                                           old_data=c.users_group.get_dict(),
-                                          available_members=[str(x[0]) for x
-                                                in c.available_members])()
+                                          available_members=available_members)()
 
         try:
             form_result = users_group_form.to_python(request.POST)
-            UsersGroup.update(id, form_result)
+            UsersGroupModel().update(c.users_group, form_result)
             h.flash(_('updated users group %s') \
                         % form_result['users_group_name'],
                     category='success')
             #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
+            Session.commit()
         except formencode.Invalid, errors:
             e = errors.error_dict or {}
 
             perm = Permission.get_by_key('hg.create.repository')
             e.update({'create_repo_perm':
-                         UsersGroupToPerm.has_perm(id, perm)})
+                         UsersGroupModel().has_perm(id, perm)})
 
             return htmlfill.render(
                 render('admin/users_groups/users_group_edit.html'),
@@ -150,8 +158,9 @@
         # url('users_group', id=ID)
 
         try:
-            UsersGroup.delete(id)
+            UsersGroupModel().delete(id)
             h.flash(_('successfully deleted users group'), category='success')
+            Session.commit()
         except UsersGroupsAssignedException, e:
             h.flash(e, category='error')
         except Exception:
@@ -179,7 +188,7 @@
         defaults = c.users_group.get_dict()
         perm = Permission.get_by_key('hg.create.repository')
         defaults.update({'create_repo_perm':
-                         UsersGroupToPerm.has_perm(id, perm)})
+                         UsersGroupModel().has_perm(c.users_group, perm)})
         return htmlfill.render(
             render('admin/users_groups/users_group_edit.html'),
             defaults=defaults,
@@ -195,20 +204,21 @@
 
         if grant_perm:
             perm = Permission.get_by_key('hg.create.none')
-            UsersGroupToPerm.revoke_perm(id, perm)
+            UsersGroupModel().revoke_perm(id, perm)
 
             perm = Permission.get_by_key('hg.create.repository')
-            UsersGroupToPerm.grant_perm(id, perm)
+            UsersGroupModel().grant_perm(id, perm)
             h.flash(_("Granted 'repository create' permission to user"),
                     category='success')
-
+            
+            Session.commit()
         else:
             perm = Permission.get_by_key('hg.create.repository')
-            UsersGroupToPerm.revoke_perm(id, perm)
+            UsersGroupModel().revoke_perm(id, perm)
 
             perm = Permission.get_by_key('hg.create.none')
-            UsersGroupToPerm.grant_perm(id, perm)
+            UsersGroupModel().grant_perm(id, perm)
             h.flash(_("Revoked 'repository create' permission to user"),
                     category='success')
-
+            Session.commit()
         return redirect(url('edit_users_group', id=id))
--- a/rhodecode/controllers/api/api.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/api/api.py	Fri Dec 02 22:31:13 2011 +0200
@@ -120,7 +120,7 @@
         try:
             UserModel().create_or_update(username, password, email, firstname,
                                          lastname, active, admin, ldap_dn)
-            Session().commit()
+            Session.commit()
             return dict(msg='created new user %s' % username)
         except Exception:
             log.error(traceback.format_exc())
@@ -198,7 +198,7 @@
 
         try:
             ug = UsersGroupModel().create(name=name, active=active)
-            Session().commit()
+            Session.commit()
             return dict(id=ug.users_group_id,
                         msg='created new users group %s' % name)
         except Exception:
@@ -226,7 +226,7 @@
                 raise JSONRPCError('unknown user %s' % user_name)
 
             ugm = UsersGroupModel().add_user_to_group(users_group, user)
-            Session().commit()
+            Session.commit()
             return dict(id=ugm.users_group_member_id,
                         msg='created new users group member')
         except Exception:
@@ -242,10 +242,9 @@
         :param repo_name
         """
 
-        try:
-            repo = Repository.get_by_repo_name(repo_name)
-        except NoResultFound:
-            return None
+        repo = Repository.get_by_repo_name(repo_name)
+        if repo is None:
+            raise JSONRPCError('unknown repository %s' % repo)
 
         members = []
         for user in repo.repo_to_perm:
@@ -334,7 +333,7 @@
                                      repo_type=repo_type,
                                      repo_group=parent_id,
                                      clone_uri=None), owner)
-            Session().commit()
+            Session.commit()
         except Exception:
             log.error(traceback.format_exc())
             raise JSONRPCError('failed to create repository %s' % name)
@@ -351,10 +350,9 @@
         """
 
         try:
-            try:
-                repo = Repository.get_by_repo_name(repo_name)
-            except NoResultFound:
-                raise JSONRPCError('unknown repository %s' % repo)
+            repo = Repository.get_by_repo_name(repo_name)
+            if repo is None:
+                raise JSONRPCError('unknown repository %s' % repo)            
 
             try:
                 user = User.get_by_username(user_name)
@@ -363,7 +361,7 @@
 
             RepositoryPermissionModel()\
                 .update_or_delete_user_permission(repo, user, perm)
-            Session().commit()
+            Session.commit()
         except Exception:
             log.error(traceback.format_exc())
             raise JSONRPCError('failed to edit permission %(repo)s for %(user)s'
--- a/rhodecode/controllers/changeset.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/changeset.py	Fri Dec 02 22:31:13 2011 +0200
@@ -280,7 +280,7 @@
                                         revision=revision,
                                         f_path=request.POST.get('f_path'),
                                         line_no=request.POST.get('line'))
-        Session().commit()
+        Session.commit()
         return redirect(h.url('changeset_home', repo_name=repo_name,
                               revision=revision))
 
@@ -290,7 +290,7 @@
         owner = lambda : co.author.user_id == c.rhodecode_user.user_id
         if h.HasPermissionAny('hg.admin', 'repository.admin')() or owner:
             ChangesetCommentsModel().delete(comment=co)
-            Session().commit()
+            Session.commit()
             return True
         else:
             raise HTTPForbidden()
--- a/rhodecode/controllers/journal.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/journal.py	Fri Dec 02 22:31:13 2011 +0200
@@ -134,7 +134,7 @@
                 try:
                     self.scm_model.toggle_following_user(user_id,
                                                 self.rhodecode_user.user_id)
-                    Session().commit()
+                    Session.commit()
                     return 'ok'
                 except:
                     raise HTTPBadRequest()
@@ -144,7 +144,7 @@
                 try:
                     self.scm_model.toggle_following_repo(repo_id,
                                                 self.rhodecode_user.user_id)
-                    Session().commit()
+                    Session.commit()
                     return 'ok'
                 except:
                     raise HTTPBadRequest()
--- a/rhodecode/controllers/login.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/login.py	Fri Dec 02 22:31:13 2011 +0200
@@ -75,7 +75,8 @@
                 log.info('user %s is now authenticated and stored in '
                          'session, session attrs %s' % (username, cs))
                 user.update_lastlogin()
-
+                Session.commit()
+                
                 if c.came_from:
                     return redirect(c.came_from)
                 else:
@@ -94,7 +95,6 @@
     @HasPermissionAnyDecorator('hg.admin', 'hg.register.auto_activate',
                                'hg.register.manual_activate')
     def register(self):
-        user_model = UserModel()
         c.auto_active = False
         for perm in User.get_by_username('default').user_perms:
             if perm.permission.permission_name == 'hg.register.auto_activate':
@@ -107,10 +107,10 @@
             try:
                 form_result = register_form.to_python(dict(request.POST))
                 form_result['active'] = c.auto_active
-                user_model.create_registration(form_result)
+                UserModel().create_registration(form_result)
                 h.flash(_('You have successfully registered into rhodecode'),
                             category='success')
-                Session().commit()
+                Session.commit()
                 return redirect(url('login_home'))
 
             except formencode.Invalid, errors:
@@ -124,13 +124,11 @@
         return render('/register.html')
 
     def password_reset(self):
-        user_model = UserModel()
         if request.POST:
-
             password_reset_form = PasswordResetForm()()
             try:
                 form_result = password_reset_form.to_python(dict(request.POST))
-                user_model.reset_password_link(form_result)
+                UserModel().reset_password_link(form_result)
                 h.flash(_('Your password reset link was sent'),
                             category='success')
                 return redirect(url('login_home'))
@@ -146,13 +144,11 @@
         return render('/password_reset.html')
 
     def password_reset_confirmation(self):
-
         if request.GET and request.GET.get('key'):
             try:
-                user_model = UserModel()
                 user = User.get_by_api_key(request.GET.get('key'))
                 data = dict(email=user.email)
-                user_model.reset_password(data)
+                UserModel().reset_password(data)
                 h.flash(_('Your password reset was successful, '
                           'new password has been sent to your email'),
                             category='success')
--- a/rhodecode/controllers/settings.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/controllers/settings.py	Fri Dec 02 22:31:13 2011 +0200
@@ -105,7 +105,7 @@
             changed_name = form_result['repo_name_full']
             action_logger(self.rhodecode_user, 'user_updated_repo',
                           changed_name, '', self.sa)
-            Session().commit()
+            Session.commit()
         except formencode.Invalid, errors:
             c.repo_info = repo_model.get_by_repo_name(repo_name)
             c.users_array = repo_model.get_users_js()
@@ -149,7 +149,7 @@
             repo_model.delete(repo)
             invalidate_cache('get_repo_cached_%s' % repo_name)
             h.flash(_('deleted repository %s') % repo_name, category='success')
-            Session().commit()
+            Session.commit()
         except Exception:
             log.error(traceback.format_exc())
             h.flash(_('An error occurred during deletion of %s') % repo_name,
--- a/rhodecode/lib/auth.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/lib/auth.py	Fri Dec 02 22:31:13 2011 +0200
@@ -35,6 +35,7 @@
 from pylons.i18n.translation import _
 
 from rhodecode import __platform__, PLATFORM_WIN, PLATFORM_OTHERS
+from rhodecode.model.meta import Session
 
 if __platform__ in PLATFORM_WIN:
     from hashlib import sha256
@@ -225,7 +226,8 @@
                 if user_model.create_ldap(username, password, user_dn,
                                           user_attrs):
                     log.info('created new ldap user %s', username)
-
+                    
+                Session.commit()    
                 return True
             except (LdapUsernameError, LdapPasswordError,):
                 pass
@@ -237,13 +239,12 @@
 def login_container_auth(username):
     user = User.get_by_username(username)
     if user is None:
-        user_model = UserModel()
         user_attrs = {
             'name': username,
             'lastname': None,
             'email': None,
         }
-        user = user_model.create_for_container_auth(username, user_attrs)
+        user = UserModel().create_for_container_auth(username, user_attrs)
         if not user:
             return None
         log.info('User %s was created by container authentication', username)
@@ -252,6 +253,8 @@
         return None
 
     user.update_lastlogin()
+    Session.commit()
+    
     log.debug('User %s is now logged in by container authentication',
               user.username)
     return user
@@ -380,7 +383,7 @@
     """
     log.info('getting information about all available permissions')
     try:
-        sa = meta.Session()
+        sa = meta.Session
         all_perms = sa.query(Permission).all()
     except:
         pass
--- a/rhodecode/lib/base.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/lib/base.py	Fri Dec 02 22:31:13 2011 +0200
@@ -35,7 +35,7 @@
                         .get_unread_cnt_for_user(c.rhodecode_user.user_id)
         self.cut_off_limit = int(config.get('cut_off_limit'))
 
-        self.sa = meta.Session()
+        self.sa = meta.Session
         self.scm_model = ScmModel(self.sa)
 
     def __call__(self, environ, start_response):
--- a/rhodecode/lib/celerylib/tasks.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/lib/celerylib/tasks.py	Fri Dec 02 22:31:13 2011 +0200
@@ -64,7 +64,7 @@
     if CELERY_ON:
         engine = engine_from_config(config, 'sqlalchemy.db1.')
         init_model(engine)
-    sa = meta.Session()
+    sa = meta.Session
     return sa
 
 def get_logger(cls):
@@ -109,7 +109,11 @@
 
         co_day_auth_aggr = {}
         commits_by_day_aggregate = {}
-        repo = Repository.get_by_repo_name(repo_name).scm_instance
+        repo = Repository.get_by_repo_name(repo_name)
+        if repo is None:
+            return True
+        
+        repo = repo.scm_instance
         repo_size = len(repo.revisions)
         #return if repo have no revisions
         if repo_size < 1:
--- a/rhodecode/lib/db_manage.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/lib/db_manage.py	Fri Dec 02 22:31:13 2011 +0200
@@ -57,7 +57,7 @@
     def init_db(self):
         engine = create_engine(self.dburi, echo=self.log_sql)
         init_model(engine)
-        self.sa = meta.Session()
+        self.sa = meta.Session
 
     def create_tables(self, override=False):
         """Create a auth database
--- a/rhodecode/lib/dbmigrate/schema/db_1_2_0.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/lib/dbmigrate/schema/db_1_2_0.py	Fri Dec 02 22:31:13 2011 +0200
@@ -1061,7 +1061,7 @@
         """
 
         log.debug('marking %s for invalidation' % key)
-        inv_obj = Session().query(cls)\
+        inv_obj = Session.query(cls)\
             .filter(cls.cache_key == key).scalar()
         if inv_obj:
             inv_obj.cache_active = False
@@ -1083,7 +1083,7 @@
         
         :param key:
         """
-        inv_obj = Session().query(CacheInvalidation)\
+        inv_obj = Session.query(CacheInvalidation)\
             .filter(CacheInvalidation.cache_key == key).scalar()
         inv_obj.cache_active = True
         Session.add(inv_obj)
--- a/rhodecode/lib/utils.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/lib/utils.py	Fri Dec 02 22:31:13 2011 +0200
@@ -110,7 +110,7 @@
     """
 
     if not sa:
-        sa = meta.Session()
+        sa = meta.Session
 
     try:
         if hasattr(user, 'user_id'):
@@ -271,7 +271,7 @@
                 baseui.setconfig(section, k, v)
 
     elif read_from == 'db':
-        sa = meta.Session()
+        sa = meta.Session
         ret = sa.query(RhodeCodeUi)\
             .options(FromCache("sql_cache_short",
                                "get_hg_ui_settings")).all()
@@ -362,7 +362,7 @@
 
     :param groups: list of groups structure
     """
-    sa = meta.Session()
+    sa = meta.Session
 
     parent = None
     group = None
@@ -392,7 +392,7 @@
     :param remove_obsolete: check for obsolete entries in database
     """
     from rhodecode.model.repo import RepoModel
-    sa = meta.Session()
+    sa = meta.Session
     rm = RepoModel()
     user = sa.query(User).filter(User.admin == True).first()
     if user is None:
@@ -510,7 +510,7 @@
     dbmanage.admin_prompt()
     dbmanage.create_permissions()
     dbmanage.populate_default_permissions()
-    Session().commit()
+    Session.commit()
     # PART TWO make test repo
     log.debug('making test vcs repositories')
 
--- a/rhodecode/model/__init__.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/model/__init__.py	Fri Dec 02 22:31:13 2011 +0200
@@ -71,7 +71,7 @@
         if sa is not None:
             self.sa = sa
         else:
-            self.sa = meta.Session()
+            self.sa = meta.Session
 
     def _get_instance(self, cls, instance):
         """
--- a/rhodecode/model/db.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/model/db.py	Fri Dec 02 22:31:13 2011 +0200
@@ -118,7 +118,7 @@
 
     @classmethod
     def query(cls):
-        return Session().query(cls)
+        return Session.query(cls)
 
     @classmethod
     def get(cls, id_):
@@ -132,7 +132,7 @@
     @classmethod
     def delete(cls, id_):
         obj = cls.query().get(id_)
-        Session().delete(obj)
+        Session.delete(obj)
 
 
 class RhodeCodeSetting(Base, BaseModel):
@@ -252,8 +252,7 @@
         new_ui.ui_key = key
         new_ui.ui_value = val
 
-        Session().add(new_ui)
-        Session().commit()
+        Session.add(new_ui)
 
 
 class User(Base, BaseModel):
@@ -335,10 +334,8 @@
 
     def update_lastlogin(self):
         """Update user lastlogin"""
-
         self.last_login = datetime.datetime.now()
-        Session().add(self)
-        Session().commit()
+        Session.add(self)
         log.debug('updated user %s lastlogin', self.username)
 
 
@@ -386,7 +383,6 @@
                                     "get_user_%s" % group_name))
         return q.scalar()
 
-
     @classmethod
     def get(cls, users_group_id, cache=False):
         users_group = cls.query()
@@ -395,68 +391,6 @@
                                     "get_users_group_%s" % users_group_id))
         return users_group.get(users_group_id)
 
-    @classmethod
-    def create(cls, form_data):
-        try:
-            new_users_group = cls()
-            for k, v in form_data.items():
-                setattr(new_users_group, k, v)
-
-            Session().add(new_users_group)
-            Session().commit()
-            return new_users_group
-        except:
-            log.error(traceback.format_exc())
-            Session().rollback()
-            raise
-
-    @classmethod
-    def update(cls, users_group_id, form_data):
-
-        try:
-            users_group = cls.get(users_group_id, cache=False)
-
-            for k, v in form_data.items():
-                if k == 'users_group_members':
-                    users_group.members = []
-                    Session().flush()
-                    members_list = []
-                    if v:
-                        v = [v] if isinstance(v, basestring) else v
-                        for u_id in set(v):
-                            member = UsersGroupMember(users_group_id, u_id)
-                            members_list.append(member)
-                    setattr(users_group, 'members', members_list)
-                setattr(users_group, k, v)
-
-            Session().add(users_group)
-            Session().commit()
-        except:
-            log.error(traceback.format_exc())
-            Session().rollback()
-            raise
-
-    @classmethod
-    def delete(cls, users_group_id):
-        try:
-
-            # check if this group is not assigned to repo
-            assigned_groups = UsersGroupRepoToPerm.query()\
-                .filter(UsersGroupRepoToPerm.users_group_id ==
-                        users_group_id).all()
-
-            if assigned_groups:
-                raise UsersGroupsAssignedException('RepoGroup assigned to %s' %
-                                                   assigned_groups)
-
-            users_group = cls.get(users_group_id, cache=False)
-            Session().delete(users_group)
-            Session().commit()
-        except:
-            log.error(traceback.format_exc())
-            Session().rollback()
-            raise
-
 class UsersGroupMember(Base, BaseModel):
     __tablename__ = 'users_groups_members'
     __table_args__ = {'extend_existing':True}
@@ -477,8 +411,8 @@
         ugm = UsersGroupMember()
         ugm.users_group = group
         ugm.user = user
-        Session().add(ugm)
-        Session().commit()
+        Session.add(ugm)
+        Session.commit()
         return ugm
 
 class Repository(Base, BaseModel):
@@ -521,11 +455,11 @@
 
     @classmethod
     def get_by_repo_name(cls, repo_name):
-        q = Session().query(cls).filter(cls.repo_name == repo_name)
+        q = Session.query(cls).filter(cls.repo_name == repo_name)
         q = q.options(joinedload(Repository.fork))\
                 .options(joinedload(Repository.user))\
                 .options(joinedload(Repository.group))
-        return q.one()
+        return q.scalar()
 
     @classmethod
     def get_repo_forks(cls, repo_id):
@@ -538,7 +472,7 @@
 
         :param cls:
         """
-        q = Session().query(RhodeCodeUi)\
+        q = Session.query(RhodeCodeUi)\
             .filter(RhodeCodeUi.ui_key == cls.url_sep())
         q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
         return q.one().ui_value
@@ -574,7 +508,7 @@
         Returns base full path for that repository means where it actually
         exists on a filesystem
         """
-        q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
+        q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
                                               Repository.url_sep())
         q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
         return q.one().ui_value
@@ -851,7 +785,7 @@
 
     @classmethod
     def get_default_perms(cls, default_user_id):
-        q = Session().query(UserRepoToPerm, Repository, cls)\
+        q = Session.query(UserRepoToPerm, Repository, cls)\
             .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
             .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
             .filter(UserRepoToPerm.user_id == default_user_id)
@@ -877,7 +811,7 @@
         n.user = user
         n.repository = repository
         n.permission = permission
-        Session().add(n)
+        Session.add(n)
         return n
 
     def __repr__(self):
@@ -893,41 +827,6 @@
     user = relationship('User')
     permission = relationship('Permission', lazy='joined')
 
-    @classmethod
-    def has_perm(cls, user_id, perm):
-        if not isinstance(perm, Permission):
-            raise Exception('perm needs to be an instance of Permission class')
-
-        return cls.query().filter(cls.user_id == user_id)\
-            .filter(cls.permission == perm).scalar() is not None
-
-    @classmethod
-    def grant_perm(cls, user_id, perm):
-        if not isinstance(perm, Permission):
-            raise Exception('perm needs to be an instance of Permission class')
-
-        new = cls()
-        new.user_id = user_id
-        new.permission = perm
-        try:
-            Session().add(new)
-            Session().commit()
-        except:
-            Session().rollback()
-
-
-    @classmethod
-    def revoke_perm(cls, user_id, perm):
-        if not isinstance(perm, Permission):
-            raise Exception('perm needs to be an instance of Permission class')
-
-        try:
-            obj = cls.query().filter(cls.user_id == user_id)\
-                    .filter(cls.permission == perm).one()
-            Session().delete(obj)
-            Session().commit()
-        except:
-            Session().rollback()
 
 class UsersGroupRepoToPerm(Base, BaseModel):
     __tablename__ = 'users_group_repo_to_perm'
@@ -947,7 +846,7 @@
         n.users_group = users_group
         n.repository = repository
         n.permission = permission
-        Session().add(n)
+        Session.add(n)
         return n
 
     def __repr__(self):
@@ -963,45 +862,6 @@
     permission = relationship('Permission')
 
 
-    @classmethod
-    def has_perm(cls, users_group_id, perm):
-        if not isinstance(perm, Permission):
-            raise Exception('perm needs to be an instance of Permission class')
-
-        return cls.query().filter(cls.users_group_id ==
-                                         users_group_id)\
-                                         .filter(cls.permission == perm)\
-                                         .scalar() is not None
-
-    @classmethod
-    def grant_perm(cls, users_group_id, perm):
-        if not isinstance(perm, Permission):
-            raise Exception('perm needs to be an instance of Permission class')
-
-        new = cls()
-        new.users_group_id = users_group_id
-        new.permission = perm
-        try:
-            Session().add(new)
-            Session().commit()
-        except:
-            Session().rollback()
-
-
-    @classmethod
-    def revoke_perm(cls, users_group_id, perm):
-        if not isinstance(perm, Permission):
-            raise Exception('perm needs to be an instance of Permission class')
-
-        try:
-            obj = cls.query().filter(cls.users_group_id == users_group_id)\
-                .filter(cls.permission == perm).one()
-            Session().delete(obj)
-            Session().commit()
-        except:
-            Session().rollback()
-
-
 class UserRepoGroupToPerm(Base, BaseModel):
     __tablename__ = 'group_to_perm'
     __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'extend_existing':True})
@@ -1103,7 +963,7 @@
         """
 
         log.debug('marking %s for invalidation' % key)
-        inv_obj = Session().query(cls)\
+        inv_obj = Session.query(cls)\
             .filter(cls.cache_key == key).scalar()
         if inv_obj:
             inv_obj.cache_active = False
@@ -1112,11 +972,11 @@
             inv_obj = CacheInvalidation(key)
 
         try:
-            Session().add(inv_obj)
-            Session().commit()
+            Session.add(inv_obj)
+            Session.commit()
         except Exception:
             log.error(traceback.format_exc())
-            Session().rollback()
+            Session.rollback()
 
     @classmethod
     def set_valid(cls, key):
@@ -1128,8 +988,8 @@
         inv_obj = CacheInvalidation.query()\
             .filter(CacheInvalidation.cache_key == key).scalar()
         inv_obj.cache_active = True
-        Session().add(inv_obj)
-        Session().commit()
+        Session.add(inv_obj)
+        Session.commit()
 
 
 class ChangesetComment(Base, BaseModel):
@@ -1157,7 +1017,7 @@
         :param cls:
         :param revision:
         """
-        return Session().query(User)\
+        return Session.query(User)\
                 .filter(cls.revision == revision)\
                 .join(ChangesetComment.author).all()
 
@@ -1203,7 +1063,7 @@
             assoc = UserNotification()
             assoc.notification = notification
             u.notifications.append(assoc)
-        Session().add(notification)
+        Session.add(notification)
         return notification
 
     @property
@@ -1226,7 +1086,7 @@
 
     def mark_as_read(self):
         self.read = True
-        Session().add(self)
+        Session.add(self)
 
 class DbMigrateVersion(Base, BaseModel):
     __tablename__ = 'db_migrate_version'
--- a/rhodecode/model/forms.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/model/forms.py	Fri Dec 02 22:31:13 2011 +0200
@@ -36,9 +36,7 @@
 from rhodecode.lib.utils import repo_name_slug
 from rhodecode.lib.auth import authenticate, get_crypt_password
 from rhodecode.lib.exceptions import LdapImportError
-from rhodecode.model.user import UserModel
-from rhodecode.model.repo import RepoModel
-from rhodecode.model.db import User, UsersGroup, RepoGroup
+from rhodecode.model.db import User, UsersGroup, RepoGroup, Repository
 from rhodecode import BACKENDS
 
 log = logging.getLogger(__name__)
@@ -68,7 +66,7 @@
             #check if user is unique
             old_un = None
             if edit:
-                old_un = UserModel().get(old_data.get('user_id')).username
+                old_un = User.get(old_data.get('user_id')).username
 
             if old_un != value or not edit:
                 if User.get_by_username(value, case_insensitive=True):
@@ -268,7 +266,7 @@
             if  rename or create:
 
                 if group_path != '':
-                    if RepoModel().get_by_repo_name(repo_name_full,):
+                    if Repository.get_by_repo_name(repo_name_full):
                         e_dict = {'repo_name':_('This repository already '
                                                 'exists in a group "%s"') %
                                   gr.group_name}
@@ -281,7 +279,7 @@
                         raise formencode.Invalid('', value, state,
                                                  error_dict=e_dict)
 
-                elif RepoModel().get_by_repo_name(repo_name_full):
+                elif Repository.get_by_repo_name(repo_name_full):
                         e_dict = {'repo_name':_('This repository '
                                                 'already exists')}
                         raise formencode.Invalid('', value, state,
--- a/rhodecode/model/repo.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/model/repo.py	Fri Dec 02 22:31:13 2011 +0200
@@ -204,11 +204,9 @@
                 # rename repository
                 self.__rename_repo(old=repo_name, new=new_name)
 
-            self.sa.commit()
             return cur_repo
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def create(self, form_data, cur_user, just_db=False, fork=False):
@@ -312,10 +310,8 @@
         try:
             self.sa.delete(repo)
             self.__delete_repo(repo)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def delete_perm_user(self, form_data, repo_name):
@@ -325,10 +321,8 @@
                         == self.get_by_repo_name(repo_name))\
                 .filter(UserRepoToPerm.user_id == form_data['user_id']).one()
             self.sa.delete(obj)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def delete_perm_users_group(self, form_data, repo_name):
@@ -339,10 +333,8 @@
                 .filter(UsersGroupRepoToPerm.users_group_id
                         == form_data['users_group_id']).one()
             self.sa.delete(obj)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def delete_stats(self, repo_name):
@@ -356,10 +348,8 @@
                     .filter(Statistics.repository == \
                         self.get_by_repo_name(repo_name)).one()
             self.sa.delete(obj)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def __create_repo(self, repo_name, alias, new_parent_id, clone_uri=False):
@@ -428,11 +418,11 @@
         """
         rm_path = os.path.join(self.repos_path, repo.repo_name)
         log.info("Removing %s", rm_path)
-        #disable hg/git
+        # disable hg/git
         alias = repo.repo_type
         shutil.move(os.path.join(rm_path, '.%s' % alias),
                     os.path.join(rm_path, 'rm__.%s' % alias))
-        #disable repo
+        # disable repo
         shutil.move(rm_path, os.path.join(self.repos_path, 'rm__%s__%s' \
                                           % (datetime.today()\
                                              .strftime('%Y%m%d_%H%M%S_%f'),
--- a/rhodecode/model/user.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/model/user.py	Fri Dec 02 22:31:13 2011 +0200
@@ -54,6 +54,9 @@
 
 class UserModel(BaseModel):
 
+    def __get_user(self, user):
+        return self._get_instance(User, user)
+
     def get(self, user_id, cache=False):
         user = self.sa.query(User)
         if cache:
@@ -84,11 +87,9 @@
 
             new_user.api_key = generate_api_key(form_data['username'])
             self.sa.add(new_user)
-            self.sa.commit()
             return new_user
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
 
@@ -159,7 +160,6 @@
                 new_user.lastname = attrs['lastname']
 
                 self.sa.add(new_user)
-                self.sa.commit()
                 return new_user
             except (DatabaseError,):
                 log.error(traceback.format_exc())
@@ -200,7 +200,6 @@
                 new_user.lastname = attrs['lastname']
 
                 self.sa.add(new_user)
-                self.sa.commit()
                 return new_user
             except (DatabaseError,):
                 log.error(traceback.format_exc())
@@ -258,10 +257,8 @@
                     setattr(user, k, v)
 
             self.sa.add(user)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def update_my_account(self, user_id, form_data):
@@ -280,10 +277,8 @@
                         setattr(user, k, v)
 
             self.sa.add(user)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def delete(self, user_id):
@@ -300,10 +295,8 @@
                                                'remove those repositories') \
                                                % user.repositories)
             self.sa.delete(user)
-            self.sa.commit()
         except:
             log.error(traceback.format_exc())
-            self.sa.rollback()
             raise
 
     def reset_password_link(self, data):
@@ -477,3 +470,35 @@
 
         return user
 
+
+
+    def has_perm(self, user, perm):
+        if not isinstance(perm, Permission):
+            raise Exception('perm needs to be an instance of Permission class')
+
+        user = self.__get_user(user)
+
+        return UserToPerm.query().filter(UserToPerm.user == user.user)\
+            .filter(UserToPerm.permission == perm).scalar() is not None
+
+    def grant_perm(self, user, perm):
+        if not isinstance(perm, Permission):
+            raise Exception('perm needs to be an instance of Permission class')
+
+        user = self.__get_user(user)
+
+        new = UserToPerm()
+        new.user = user.user
+        new.permission = perm
+        self.sa.add(new)
+
+
+    def revoke_perm(self, user, perm):
+        if not isinstance(perm, Permission):
+            raise Exception('perm needs to be an instance of Permission class')
+        
+        user = self.__get_user(user)
+        
+        obj = UserToPerm.query().filter(UserToPerm.user == user.user)\
+                .filter(UserToPerm.permission == perm).one()
+        self.sa.delete(obj)
--- a/rhodecode/model/users_group.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/model/users_group.py	Fri Dec 02 22:31:13 2011 +0200
@@ -27,7 +27,9 @@
 import traceback
 
 from rhodecode.model import BaseModel
-from rhodecode.model.db import UsersGroupMember, UsersGroup
+from rhodecode.model.db import UsersGroupMember, UsersGroup,\
+    UsersGroupRepoToPerm, Permission, UsersGroupToPerm
+from rhodecode.lib.exceptions import UsersGroupsAssignedException
 
 log = logging.getLogger(__name__)
 
@@ -44,15 +46,55 @@
         return UsersGroup.get_by_group_name(name, cache, case_insensitive)
 
     def create(self, name, active=True):
-        new = UsersGroup()
-        new.users_group_name = name
-        new.users_group_active = active
-        self.sa.add(new)
-        return new
+        try:
+            new = UsersGroup()
+            new.users_group_name = name
+            new.users_group_active = active
+            self.sa.add(new)
+            return new
+        except:
+            log.error(traceback.format_exc())
+            raise
+
+    def update(self, users_group, form_data):
+
+        try:
+            users_group = self.__get_users_group(users_group)
+
+            for k, v in form_data.items():
+                if k == 'users_group_members':
+                    users_group.members = []
+                    self.sa.flush()
+                    members_list = []
+                    if v:
+                        v = [v] if isinstance(v, basestring) else v
+                        for u_id in set(v):
+                            member = UsersGroupMember(users_group.users_group_id, u_id)
+                            members_list.append(member)
+                    setattr(users_group, 'members', members_list)
+                setattr(users_group, k, v)
+
+            self.sa.add(users_group)
+        except:
+            log.error(traceback.format_exc())
+            raise
 
     def delete(self, users_group):
-        obj = self.__get_users_group(users_group)
-        self.sa.delete(obj)
+        try:
+            users_group = self.__get_users_group(users_group)
+            
+            # check if this group is not assigned to repo
+            assigned_groups = UsersGroupRepoToPerm.query()\
+                .filter(UsersGroupRepoToPerm.users_group == users_group).all()
+
+            if assigned_groups:
+                raise UsersGroupsAssignedException('RepoGroup assigned to %s' %
+                                                   assigned_groups)
+            
+            self.sa.delete(users_group)
+        except:
+            log.error(traceback.format_exc())
+            raise
 
     def add_user_to_group(self, users_group, user):
         for m in users_group.members:
@@ -73,3 +115,38 @@
         except:
             log.error(traceback.format_exc())
             raise
+
+    def has_perm(self, users_group, perm):
+        if not isinstance(perm, Permission):
+            raise Exception('perm needs to be an instance of Permission class')
+
+        users_group = self.__get_users_group(users_group)
+
+        return UsersGroupToPerm.query()\
+            .filter(UsersGroupToPerm.users_group == users_group)\
+            .filter(UsersGroupToPerm.permission == perm).scalar() is not None
+
+    def grant_perm(self, users_group, perm):
+        if not isinstance(perm, Permission):
+            raise Exception('perm needs to be an instance of Permission class')
+
+        users_group = self.__get_users_group(users_group)
+
+        new = UsersGroupToPerm()
+        new.users_group = users_group
+        new.permission = perm
+        self.sa.add(new)
+
+
+    def revoke_perm(self, users_group, perm):
+        if not isinstance(perm, Permission):
+            raise Exception('perm needs to be an instance of Permission class')
+        
+        users_group = self.__get_users_group(users_group)
+        
+        obj = UsersGroupToPerm.query()\
+            .filter(UsersGroupToPerm.users_group == users_group)\
+            .filter(UsersGroupToPerm.permission == perm).one()
+        self.sa.delete(obj)
+
+
--- a/rhodecode/templates/files/files.html	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/templates/files/files.html	Fri Dec 02 22:31:13 2011 +0200
@@ -39,7 +39,7 @@
 <script type="text/javascript">
 var YPJAX_TITLE = "${c.repo_name} ${_('Files')} - ${c.rhodecode_name}";
 var current_url = "${h.url.current()}";
-var node_list_url = '${h.url("files_home",repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=c.file.path)}';
+var node_list_url = '${h.url("files_home",repo_name=c.repo_name,revision=c.changeset.raw_id,f_path='__FPATH__')}';
 var url_base = '${h.url("files_nodelist_home",repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=c.file.path)}';
 var truncated_lbl = "${_('search truncated')}";
 var nomatch_lbl = "${_('no matching files')}";
--- a/rhodecode/tests/_test_concurency.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/_test_concurency.py	Fri Dec 02 22:31:13 2011 +0200
@@ -81,7 +81,7 @@
 def get_session():
     engine = engine_from_config(conf, 'sqlalchemy.db1.')
     init_model(engine)
-    sa = meta.Session()
+    sa = meta.Session
     return sa
 
 
--- a/rhodecode/tests/functional/test_admin_notifications.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_admin_notifications.py	Fri Dec 02 22:31:13 2011 +0200
@@ -11,8 +11,8 @@
     def tearDown(self):
         for n in Notification.query().all():
             inst = Notification.get(n.notification_id)
-            Session().delete(inst)
-        Session().commit()
+            Session.delete(inst)
+        Session.commit()
 
     def test_index(self):
         self.log_user()
@@ -30,7 +30,7 @@
         NotificationModel().create(created_by=u1, subject=u'test_notification_1',
                                    body=u'notification_1',
                                    recipients=[cur_user])
-        Session().commit()
+        Session.commit()
         response = self.app.get(url('notifications'))
         self.assertTrue(u'test_notification_1' in response.body)
 
@@ -68,7 +68,7 @@
                                                   subject=u'test',
                                                   body=u'hi there',
                                                   recipients=[cur_user, u1, u2])
-        Session().commit()
+        Session.commit()
         u1 = User.get(u1.user_id)
         u2 = User.get(u2.user_id)
 
--- a/rhodecode/tests/functional/test_admin_repos.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_admin_repos.py	Fri Dec 02 22:31:13 2011 +0200
@@ -32,11 +32,10 @@
                                                 'repo_group':'',
                                                 'description':description,
                                                 'private':private})
-
         self.checkSessionFlash(response, 'created repository %s' % (repo_name))
 
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository).filter(Repository.repo_name ==
+        new_repo = self.Session.query(Repository).filter(Repository.repo_name ==
                                                     repo_name).one()
 
         self.assertEqual(new_repo.repo_name, repo_name)
@@ -73,7 +72,7 @@
                                'created repository %s' % (repo_name_unicode))
 
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository).filter(Repository.repo_name ==
+        new_repo = self.Session.query(Repository).filter(Repository.repo_name ==
                                                 repo_name_unicode).one()
 
         self.assertEqual(new_repo.repo_name, repo_name_unicode)
@@ -113,7 +112,7 @@
         assert '''created repository %s''' % (repo_name) in response.session['flash'][0], 'No flash message about new repo'
 
         #test if the fork was created in the database
-        new_repo = self.Session().query(Repository).filter(Repository.repo_name == repo_name).one()
+        new_repo = self.Session.query(Repository).filter(Repository.repo_name == repo_name).one()
 
         assert new_repo.repo_name == repo_name, 'wrong name of repo name in db'
         assert new_repo.description == description, 'wrong description'
@@ -162,7 +161,7 @@
                         response.session['flash'][0])
 
         #test if the repo was created in the database
-        new_repo = self.Session().query(Repository).filter(Repository.repo_name ==
+        new_repo = self.Session.query(Repository).filter(Repository.repo_name ==
                                                     repo_name).one()
 
         self.assertEqual(new_repo.repo_name, repo_name)
@@ -182,7 +181,7 @@
         response.follow()
 
         #check if repo was deleted from db
-        deleted_repo = self.Session().query(Repository).filter(Repository.repo_name
+        deleted_repo = self.Session.query(Repository).filter(Repository.repo_name
                                                         == repo_name).scalar()
 
         self.assertEqual(deleted_repo, None)
--- a/rhodecode/tests/functional/test_admin_settings.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_admin_settings.py	Fri Dec 02 22:31:13 2011 +0200
@@ -145,7 +145,7 @@
         response.follow()
 
         assert 'Your account was updated successfully' in response.session['flash'][0][1], 'no flash message about success of change'
-        user = self.Session().query(User).filter(User.username == 'test_admin').one()
+        user = self.Session.query(User).filter(User.username == 'test_admin').one()
         assert user.email == new_email , 'incorrect user email after update got %s vs %s' % (user.email, new_email)
         assert user.name == new_name, 'updated field mismatch %s vs %s' % (user.name, new_name)
         assert user.lastname == new_lastname, 'updated field mismatch %s vs %s' % (user.lastname, new_lastname)
@@ -171,7 +171,7 @@
         self.checkSessionFlash(response,
                                'Your account was updated successfully')
 
-        user = self.Session().query(User).filter(User.username == 'test_admin').one()
+        user = self.Session.query(User).filter(User.username == 'test_admin').one()
         assert user.email == old_email , 'incorrect user email after update got %s vs %s' % (user.email, old_email)
 
         assert user.email == old_email , 'incorrect user email after update got %s vs %s' % (user.email, old_email)
--- a/rhodecode/tests/functional/test_admin_users.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_admin_users.py	Fri Dec 02 22:31:13 2011 +0200
@@ -32,7 +32,7 @@
 
         assert '''created user %s''' % (username) in response.session['flash'][0], 'No flash message about new user'
 
-        new_user = self.Session().query(User).filter(User.username == username).one()
+        new_user = self.Session.query(User).filter(User.username == username).one()
 
 
         assert new_user.username == username, 'wrong info about username'
@@ -66,7 +66,7 @@
         assert """<span class="error-message">An email address must contain a single @</span>""" in response.body
 
         def get_user():
-            self.Session().query(User).filter(User.username == username).one()
+            self.Session.query(User).filter(User.username == username).one()
 
         self.assertRaises(NoResultFound, get_user), 'found user in database'
 
@@ -100,7 +100,7 @@
 
         response = response.follow()
 
-        new_user = self.Session().query(User).filter(User.username == username).one()
+        new_user = self.Session.query(User).filter(User.username == username).one()
         response = self.app.delete(url('user', id=new_user.user_id))
 
         assert """successfully deleted user""" in response.session['flash'][0], 'No info about user deletion'
--- a/rhodecode/tests/functional/test_admin_users_groups.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_admin_users_groups.py	Fri Dec 02 22:31:13 2011 +0200
@@ -23,10 +23,6 @@
         self.checkSessionFlash(response,
                                'created users group %s' % TEST_USERS_GROUP)
 
-
-
-
-
     def test_new(self):
         response = self.app.get(url('new_users_group'))
 
@@ -52,13 +48,13 @@
                                'created users group %s' % users_group_name)
 
 
-        gr = self.Session().query(UsersGroup)\
+        gr = self.Session.query(UsersGroup)\
                            .filter(UsersGroup.users_group_name ==
                                    users_group_name).one()
 
         response = self.app.delete(url('users_group', id=gr.users_group_id))
 
-        gr = self.Session().query(UsersGroup)\
+        gr = self.Session.query(UsersGroup)\
                            .filter(UsersGroup.users_group_name ==
                                    users_group_name).scalar()
 
--- a/rhodecode/tests/functional/test_changeset_comments.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_changeset_comments.py	Fri Dec 02 22:31:13 2011 +0200
@@ -6,21 +6,21 @@
 
     def setUp(self):
         for x in ChangesetComment.query().all():
-            self.Session().delete(x)
-        self.Session().commit()
+            self.Session.delete(x)
+        self.Session.commit()
 
         for x in Notification.query().all():
-            self.Session().delete(x)
-        self.Session().commit()
+            self.Session.delete(x)
+        self.Session.commit()
 
     def tearDown(self):
         for x in ChangesetComment.query().all():
-            self.Session().delete(x)
-        self.Session().commit()
+            self.Session.delete(x)
+        self.Session.commit()
 
         for x in Notification.query().all():
-            self.Session().delete(x)
-        self.Session().commit()
+            self.Session.delete(x)
+        self.Session.commit()
 
     def test_create(self):
         self.log_user()
--- a/rhodecode/tests/functional/test_files.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_files.py	Fri Dec 02 22:31:13 2011 +0200
@@ -311,3 +311,16 @@
                                     f_path=f_path))
 
         assert "There is no file nor directory at the given path: %r at revision %r" % (f_path, rev[:12]) in response.session['flash'][0][1], 'No flash message'
+
+    def test_ajaxed_files_list(self):
+        self.log_user()
+        rev = '27cd5cce30c96924232dffcd24178a07ffeb5dfc' 
+        response = self.app.get(url('files_nodelist_home',repo_name=HG_REPO,
+                                    f_path='/',
+                                    revision=rev),
+                                extra_environ={'HTTP_X_PARTIAL_XHR':'1'},
+                                )
+        self.assertTrue("vcs/web/simplevcs/views/repository.py" in response.body)
+
+
+
--- a/rhodecode/tests/functional/test_forks.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_forks.py	Fri Dec 02 22:31:13 2011 +0200
@@ -65,7 +65,7 @@
                       % (repo_name, fork_name) in response.session['flash'][0])
 
         #test if the fork was created in the database
-        fork_repo = self.Session().query(Repository)\
+        fork_repo = self.Session.query(Repository)\
             .filter(Repository.repo_name == fork_name).one()
 
         self.assertEqual(fork_repo.repo_name, fork_name)
--- a/rhodecode/tests/functional/test_journal.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_journal.py	Fri Dec 02 22:31:13 2011 +0200
@@ -16,10 +16,10 @@
 
     def test_stop_following_repository(self):
         session = self.log_user()
-#        usr = self.Session().query(User).filter(User.username == 'test_admin').one()
-#        repo = self.Session().query(Repository).filter(Repository.repo_name == HG_REPO).one()
+#        usr = self.Session.query(User).filter(User.username == 'test_admin').one()
+#        repo = self.Session.query(Repository).filter(Repository.repo_name == HG_REPO).one()
 #
-#        followings = self.Session().query(UserFollowing)\
+#        followings = self.Session.query(UserFollowing)\
 #            .filter(UserFollowing.user == usr)\
 #            .filter(UserFollowing.follows_repository == repo).all()
 #
--- a/rhodecode/tests/functional/test_login.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_login.py	Fri Dec 02 22:31:13 2011 +0200
@@ -9,9 +9,9 @@
 
     def tearDown(self):
         for n in Notification.query().all():
-            Session().delete(n)
+            Session.delete(n)
 
-        Session().commit()
+        Session.commit()
         self.assertEqual(Notification.query().all(), [])
 
     def test_index(self):
@@ -199,7 +199,7 @@
         self.assertEqual(response.status , '302 Found')
         assert 'You have successfully registered into rhodecode' in response.session['flash'][0], 'No flash message about user registration'
 
-        ret = self.Session().query(User).filter(User.username == 'test_regular4').one()
+        ret = self.Session.query(User).filter(User.username == 'test_regular4').one()
         assert ret.username == username , 'field mismatch %s %s' % (ret.username, username)
         assert check_password(password, ret.password) == True , 'password mismatch'
         assert ret.email == email , 'field mismatch %s %s' % (ret.email, email)
@@ -231,8 +231,8 @@
         new.name = name
         new.lastname = lastname
         new.api_key = generate_api_key(username)
-        self.Session().add(new)
-        self.Session().commit()
+        self.Session.add(new)
+        self.Session.commit()
 
         response = self.app.post(url(controller='login',
                                      action='password_reset'),
--- a/rhodecode/tests/functional/test_summary.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/functional/test_summary.py	Fri Dec 02 22:31:13 2011 +0200
@@ -37,11 +37,11 @@
                         in response.body)
 
         # clone url...
-        self.assertTrue("""<input type="text" id="clone_url" readonly="readonly" value="hg clone http://test_admin@localhost:80/%s" size="70"/>""" % HG_REPO in response.body)
+        self.assertTrue("""<input type="text" id="clone_url" readonly="readonly" value="http://test_admin@localhost:80/%s" size="70"/>""" % HG_REPO in response.body)
 
 
     def _enable_stats(self):
         r = Repository.get_by_repo_name(HG_REPO)
         r.enable_statistics = True
-        self.Session().add(r)
-        self.Session().commit()
+        self.Session.add(r)
+        self.Session.commit()
--- a/rhodecode/tests/test_models.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/tests/test_models.py	Fri Dec 02 22:31:13 2011 +0200
@@ -66,7 +66,7 @@
 
     def test_create_same_name_group(self):
         self.assertRaises(IntegrityError, lambda:self.__make_group('newGroup'))
-        Session().rollback()
+        Session.rollback()
 
     def test_same_subgroup(self):
         sg1 = self.__make_group('sub1', parent_id=self.g1.group_id)
@@ -163,20 +163,20 @@
         usr = UserModel().create_or_update(username=u'test_user', password=u'qweqwe',
                                      email=u'u232@rhodecode.org',
                                      name=u'u1', lastname=u'u1')
-        Session().commit()
+        Session.commit()
         self.assertEqual(User.get_by_username(u'test_user'), usr)
 
         # make users group
         users_group = UsersGroupModel().create('some_example_group')
-        Session().commit()
+        Session.commit()
 
         UsersGroupModel().add_user_to_group(users_group, usr)
-        Session().commit()
+        Session.commit()
 
         self.assertEqual(UsersGroup.get(users_group.users_group_id), users_group)
         self.assertEqual(UsersGroupMember.query().count(), 1)
         UserModel().delete(usr.user_id)
-        Session().commit()
+        Session.commit()
 
         self.assertEqual(UsersGroupMember.query().all(), [])
 
@@ -209,9 +209,9 @@
 
     def _clean_notifications(self):
         for n in Notification.query().all():
-            Session().delete(n)
+            Session.delete(n)
 
-        Session().commit()
+        Session.commit()
         self.assertEqual(Notification.query().all(), [])
 
 
@@ -223,7 +223,7 @@
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'subj', body=u'hi there',
                                            recipients=usrs)
-        Session().commit()
+        Session.commit()
         u1 = User.get(self.u1)
         u2 = User.get(self.u2)
         u3 = User.get(self.u3)
@@ -248,12 +248,12 @@
         notification1 = NotificationModel().create(created_by=self.u1,
                                             subject=u'subj', body=u'hi there1',
                                             recipients=[self.u3])
-        Session().commit()
+        Session.commit()
         notification2 = NotificationModel().create(created_by=self.u1,
                                             subject=u'subj', body=u'hi there2',
                                             recipients=[self.u3])
-        Session().commit()
-        u3 = Session().query(User).get(self.u3)
+        Session.commit()
+        u3 = Session.query(User).get(self.u3)
 
         self.assertEqual(sorted([x.notification for x in u3.notifications]),
                          sorted([notification2, notification1]))
@@ -266,12 +266,12 @@
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'title', body=u'hi there3',
                                     recipients=[self.u3, self.u1, self.u2])
-        Session().commit()
+        Session.commit()
         notifications = Notification.query().all()
         self.assertTrue(notification in notifications)
 
         Notification.delete(notification.notification_id)
-        Session().commit()
+        Session.commit()
 
         notifications = Notification.query().all()
         self.assertFalse(notification in notifications)
@@ -290,7 +290,7 @@
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'title', body=u'hi there3',
                                     recipients=[self.u3, self.u1, self.u2])
-        Session().commit()
+        Session.commit()
 
         unotification = UserNotification.query()\
                             .filter(UserNotification.notification ==
@@ -302,7 +302,7 @@
 
         NotificationModel().delete(self.u3,
                                    notification.notification_id)
-        Session().commit()
+        Session.commit()
 
         u3notification = UserNotification.query()\
                             .filter(UserNotification.notification ==
@@ -339,7 +339,7 @@
         NotificationModel().create(created_by=self.u1,
                             subject=u'title', body=u'hi there_delete',
                             recipients=[self.u3, self.u1])
-        Session().commit()
+        Session.commit()
 
         self.assertEqual(NotificationModel()
                          .get_unread_cnt_for_user(self.u1), 1)
@@ -351,7 +351,7 @@
         notification = NotificationModel().create(created_by=self.u1,
                                            subject=u'title', body=u'hi there3',
                                     recipients=[self.u3, self.u1, self.u2])
-        Session().commit()
+        Session.commit()
 
         self.assertEqual(NotificationModel()
                          .get_unread_cnt_for_user(self.u1), 2)
--- a/rhodecode/websetup.py	Fri Dec 02 00:15:26 2011 +0200
+++ b/rhodecode/websetup.py	Fri Dec 02 22:31:13 2011 +0200
@@ -46,5 +46,5 @@
     dbmanage.admin_prompt()
     dbmanage.create_permissions()
     dbmanage.populate_default_permissions()
-    Session().commit()
+    Session.commit()
     load_environment(conf.global_conf, conf.local_conf, initial=True)