Changeset - d534aff5e82a
[Not reviewed]
beta
0 1 0
Marcin Kuzminski - 15 years ago 2011-04-18 20:55:37
marcin@python-works.com
user defined permission will update the global permissions, and overwrite default settings.
1 file changed with 23 insertions and 12 deletions:
0 comments (0 inline, 0 general)
rhodecode/model/user.py
Show inline comments
 
@@ -30,29 +30,33 @@ from pylons.i18n.translation import _
 

	
 
from rhodecode.model import BaseModel
 
from rhodecode.model.caching_query import FromCache
 
from rhodecode.model.db import User, RepoToPerm, Repository, Permission, \
 
    UserToPerm, UsersGroupToPerm, UsersGroupMember
 
from rhodecode.lib.exceptions import DefaultUserException, UserOwnsReposException
 

	
 
from sqlalchemy.exc import DatabaseError
 
from rhodecode.lib import generate_api_key
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
PERM_ = ''
 

	
 
PERM_WEIGHTS = {'repository.none':0,
 
                'repository.read':1,
 
                'repository.write':3,
 
                'repository.admin':3}
 

	
 

	
 
class UserModel(BaseModel):
 

	
 
    def get(self, user_id, cache=False):
 
        user = self.sa.query(User)
 
        if cache:
 
            user = user.options(FromCache("sql_cache_short",
 
                                          "get_user_%s" % user_id))
 
        return user.get(user_id)
 

	
 

	
 
    def get_by_username(self, username, cache=False, case_insensitive=False):
 

	
 
@@ -251,79 +255,86 @@ class UserModel(BaseModel):
 

	
 
    def fill_perms(self, user):
 
        """Fills user permission attribute with permissions taken from database
 
        works for permissions given for repositories, and for permissions that
 
        as part of beeing group member
 

	
 
        :param user: user instance to fill his perms
 
        """
 

	
 
        user.permissions['repositories'] = {}
 
        user.permissions['global'] = set()
 

	
 
        #===========================================================================
 
        #======================================================================
 
        # fetch default permissions
 
        #===========================================================================
 
        #======================================================================
 
        default_user = self.get_by_username('default', cache=True)
 

	
 
        default_perms = self.sa.query(RepoToPerm, Repository, Permission)\
 
            .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
 
            .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
 
            .filter(RepoToPerm.user == default_user).all()
 

	
 
        if user.is_admin:
 
            #=======================================================================
 
            #==================================================================
 
            # #admin have all default rights set to admin
 
            #=======================================================================
 
            #==================================================================
 
            user.permissions['global'].add('hg.admin')
 

	
 
            for perm in default_perms:
 
                p = 'repository.admin'
 
                user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
 

	
 
        else:
 
            #=======================================================================
 
            #==================================================================
 
            # set default permissions
 
            #=======================================================================
 
            #==================================================================
 

	
 
            #default global
 
            default_global_perms = self.sa.query(UserToPerm)\
 
                .filter(UserToPerm.user == self.sa.query(User)\
 
                       .filter(User.username == 'default').one())
 
                .filter(UserToPerm.user == User.by_username('default'))
 

	
 
            for perm in default_global_perms:
 
                user.permissions['global'].add(perm.permission.permission_name)
 

	
 
            #default for repositories
 
            for perm in default_perms:
 
                if perm.Repository.private and not perm.Repository.user_id == user.user_id:
 
                    #diself.sable defaults for private repos,
 
                    p = 'repository.none'
 
                elif perm.Repository.user_id == user.user_id:
 
                    #set admin if owner
 
                    p = 'repository.admin'
 
                else:
 
                    p = perm.Permission.permission_name
 

	
 
                user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
 

	
 
            #=======================================================================
 
            #==================================================================
 
            # overwrite default with user permissions if any
 
            #=======================================================================
 
            user_perms = self.sa.query(RepoToPerm, Permission, Repository)\
 
            #==================================================================
 

	
 
            user_perms = self.sa.query(UserToPerm)\
 
                        .filter(UserToPerm.user ==
 
                                User.get(user.user_id)).all()
 

	
 
            for perm in user_perms:
 
                user.permissions['global'].add(perm.permission.permission_name)
 

	
 
            user_repo_perms = self.sa.query(RepoToPerm, Permission, Repository)\
 
                .join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
 
                .join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
 
                .filter(RepoToPerm.user_id == user.user_id).all()
 

	
 
            for perm in user_perms:
 
            for perm in user_repo_perms:
 
                if perm.Repository.user_id == user.user_id:#set admin if owner
 
                    p = 'repository.admin'
 
                else:
 
                    p = perm.Permission.permission_name
 
                user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
 

	
 

	
 
            #=======================================================================
 
            # check if user is part of groups for this repository and fill in
 
            # (or replace with higher) permissions
 
            #=======================================================================
 
            user_perms_from_users_groups = self.sa.query(UsersGroupToPerm, Permission, Repository,)\
0 comments (0 inline, 0 general)