コード例 #1
0
ファイル: repos_group.py プロジェクト: adamscieszko/rhodecode
    def create(self, group_name, group_description, owner, parent=None, just_db=False):
        try:
            user = self._get_user(owner)
            new_repos_group = RepoGroup()
            new_repos_group.user = user
            new_repos_group.group_description = group_description or group_name
            new_repos_group.parent_group = self._get_repo_group(parent)
            new_repos_group.group_name = new_repos_group.get_new_name(group_name)

            self.sa.add(new_repos_group)
            perm_obj = self._create_default_perms(new_repos_group)
            self.sa.add(perm_obj)

            #create an ADMIN permission for owner except if we're super admin,
            #later owner should go into the owner field of groups
            if not user.is_admin:
                self.grant_user_permission(repos_group=new_repos_group,
                                           user=owner, perm='group.admin')

            if not just_db:
                # we need to flush here, in order to check if database won't
                # throw any exceptions, create filesystem dirs at the very end
                self.sa.flush()
                self.__create_group(new_repos_group.group_name)

            return new_repos_group
        except Exception:
            log.error(traceback.format_exc())
            raise
コード例 #2
0
def map_groups(path):
    """
    Given a full path to a repository, create all nested groups that this
    repo is inside. This function creates parent-child relationships between
    groups and creates default perms for all new groups.

    :param paths: full path to repository
    """
    from rhodecode.model.repo_group import RepoGroupModel
    sa = meta.Session()
    groups = path.split(Repository.NAME_SEP)
    parent = None
    group = None

    # last element is repo in nested groups structure
    groups = groups[:-1]
    rgm = RepoGroupModel(sa)
    owner = User.get_first_super_admin()
    for lvl, group_name in enumerate(groups):
        group_name = '/'.join(groups[:lvl] + [group_name])
        group = RepoGroup.get_by_group_name(group_name)
        desc = '%s group' % group_name

        # skip folders that are now removed repos
        if REMOVED_REPO_PAT.match(group_name):
            break

        if group is None:
            log.debug('creating group level: %s group_name: %s', lvl,
                      group_name)
            group = RepoGroup(group_name, parent)
            group.group_description = desc
            group.user = owner
            sa.add(group)
            perm_obj = rgm._create_default_perms(group)
            sa.add(perm_obj)
            sa.flush()

        parent = group
    return group
コード例 #3
0
ファイル: utils.py プロジェクト: adamscieszko/rhodecode
def map_groups(path):
    """
    Given a full path to a repository, create all nested groups that this
    repo is inside. This function creates parent-child relationships between
    groups and creates default perms for all new groups.

    :param paths: full path to repository
    """
    sa = meta.Session()
    groups = path.split(Repository.url_sep())
    parent = None
    group = None

    # last element is repo in nested groups structure
    groups = groups[:-1]
    rgm = ReposGroupModel(sa)
    owner = User.get_first_admin()
    for lvl, group_name in enumerate(groups):
        group_name = '/'.join(groups[:lvl] + [group_name])
        group = RepoGroup.get_by_group_name(group_name)
        desc = '%s group' % group_name

        # skip folders that are now removed repos
        if REMOVED_REPO_PAT.match(group_name):
            break

        if group is None:
            log.debug('creating group level: %s group_name: %s'
                      % (lvl, group_name))
            group = RepoGroup(group_name, parent)
            group.group_description = desc
            group.user = owner
            sa.add(group)
            perm_obj = rgm._create_default_perms(group)
            sa.add(perm_obj)
            sa.flush()

        parent = group
    return group
コード例 #4
0
    def create(self,
               group_name,
               group_description,
               owner,
               parent=None,
               just_db=False):
        try:
            user = self._get_user(owner)
            new_repos_group = RepoGroup()
            new_repos_group.user = user
            new_repos_group.group_description = group_description or group_name
            new_repos_group.parent_group = self._get_repo_group(parent)
            new_repos_group.group_name = new_repos_group.get_new_name(
                group_name)

            self.sa.add(new_repos_group)
            perm_obj = self._create_default_perms(new_repos_group)
            self.sa.add(perm_obj)

            #create an ADMIN permission for owner except if we're super admin,
            #later owner should go into the owner field of groups
            if not user.is_admin:
                self.grant_user_permission(repos_group=new_repos_group,
                                           user=owner,
                                           perm='group.admin')

            if not just_db:
                # we need to flush here, in order to check if database won't
                # throw any exceptions, create filesystem dirs at the very end
                self.sa.flush()
                self.__create_group(new_repos_group.group_name)

            return new_repos_group
        except Exception:
            log.error(traceback.format_exc())
            raise
コード例 #5
0
    def create(self, group_name, group_description, owner, just_db=False,
               copy_permissions=False, commit_early=True):

        (group_name_cleaned,
         parent_group_name) = RepoGroupModel()._get_group_name_and_parent(group_name)

        parent_group = None
        if parent_group_name:
            parent_group = self._get_repo_group(parent_group_name)

        # becase we are doing a cleanup, we need to check if such directory
        # already exists. If we don't do that we can accidentally delete existing
        # directory via cleanup that can cause data issues, since delete does a
        # folder rename to special syntax later cleanup functions can delete this
        cleanup_group = self.check_exist_filesystem(group_name,
                                                    exc_on_failure=False)
        try:
            user = self._get_user(owner)
            new_repo_group = RepoGroup()
            new_repo_group.user = user
            new_repo_group.group_description = group_description or group_name
            new_repo_group.parent_group = parent_group
            new_repo_group.group_name = group_name

            self.sa.add(new_repo_group)

            # create an ADMIN permission for owner except if we're super admin,
            # later owner should go into the owner field of groups
            if not user.is_admin:
                self.grant_user_permission(repo_group=new_repo_group,
                                           user=owner, perm='group.admin')

            if parent_group and copy_permissions:
                # copy permissions from parent
                user_perms = UserRepoGroupToPerm.query() \
                    .filter(UserRepoGroupToPerm.group == parent_group).all()

                group_perms = UserGroupRepoGroupToPerm.query() \
                    .filter(UserGroupRepoGroupToPerm.group == parent_group).all()

                for perm in user_perms:
                    # don't copy over the permission for user who is creating
                    # this group, if he is not super admin he get's admin
                    # permission set above
                    if perm.user != user or user.is_admin:
                        UserRepoGroupToPerm.create(
                            perm.user, new_repo_group, perm.permission)

                for perm in group_perms:
                    UserGroupRepoGroupToPerm.create(
                        perm.users_group, new_repo_group, perm.permission)
            else:
                perm_obj = self._create_default_perms(new_repo_group)
                self.sa.add(perm_obj)

            # now commit the changes, earlier so we are sure everything is in
            # the database.
            if commit_early:
                self.sa.commit()
            if not just_db:
                self._create_group(new_repo_group.group_name)

            # trigger the post hook
            from rhodecode.lib.hooks_base import log_create_repository_group
            repo_group = RepoGroup.get_by_group_name(group_name)
            log_create_repository_group(
                created_by=user.username, **repo_group.get_dict())

            return new_repo_group
        except Exception:
            self.sa.rollback()
            log.exception('Exception occurred when creating repository group, '
                          'doing cleanup...')
            # rollback things manually !
            repo_group = RepoGroup.get_by_group_name(group_name)
            if repo_group:
                RepoGroup.delete(repo_group.group_id)
                self.sa.commit()
                if cleanup_group:
                    RepoGroupModel()._delete_filesystem_group(repo_group)
            raise