user-groups: moved get_user_groups from RepoModel to UserGroupModel.
This commit is contained in:
parent
80f19b6a7e
commit
b595153ea8
6 changed files with 113 additions and 112 deletions
|
|
@ -242,7 +242,8 @@ class AdminUsersView(BaseAppView, DataGridAppView):
|
|||
c.user = User.get_or_404(user_id, pyramid_exc=True)
|
||||
c.data = c.user.group_member
|
||||
self._redirect_for_default_user(c.user.username)
|
||||
groups = [UserGroupModel.get_user_groups_as_dict(group.users_group) for group in c.user.group_member]
|
||||
groups = [UserGroupModel.get_user_groups_as_dict(group.users_group)
|
||||
for group in c.user.group_member]
|
||||
c.groups = json.dumps(groups)
|
||||
c.active = 'groups'
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ from rhodecode.lib.utils2 import safe_unicode, str2bool
|
|||
from rhodecode.model.db import func, Repository, RepoGroup
|
||||
from rhodecode.model.repo import RepoModel
|
||||
from rhodecode.model.scm import ScmModel
|
||||
|
||||
from rhodecode.model.user_group import UserGroupModel
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ class HomeView(BaseAppView):
|
|||
|
||||
if include_groups:
|
||||
# extend with user groups
|
||||
_user_groups = repo_model.get_user_groups(
|
||||
_user_groups = UserGroupModel().get_user_groups(
|
||||
name_contains=query, only_active=active)
|
||||
_users = _users + _user_groups
|
||||
|
||||
|
|
@ -79,8 +79,7 @@ class HomeView(BaseAppView):
|
|||
log.debug('generating user group list, query:%s, active:%s',
|
||||
query, active)
|
||||
|
||||
repo_model = RepoModel()
|
||||
_user_groups = repo_model.get_user_groups(
|
||||
_user_groups = UserGroupModel().get_user_groups(
|
||||
name_contains=query, only_active=active)
|
||||
_user_groups = _user_groups
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ import time
|
|||
import traceback
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from sqlalchemy.sql import func
|
||||
from sqlalchemy.sql.expression import true, or_
|
||||
from zope.cachedescriptors.property import Lazy as LazyProperty
|
||||
|
||||
|
|
@ -40,19 +39,17 @@ from rhodecode.lib.auth import HasUserGroupPermissionAny
|
|||
from rhodecode.lib.caching_query import FromCache
|
||||
from rhodecode.lib.exceptions import AttachedForksError
|
||||
from rhodecode.lib.hooks_base import log_delete_repository
|
||||
from rhodecode.lib.markup_renderer import MarkupRenderer
|
||||
from rhodecode.lib.utils import make_db_config
|
||||
from rhodecode.lib.utils2 import (
|
||||
safe_str, safe_unicode, remove_prefix, obfuscate_url_pw,
|
||||
get_current_rhodecode_user, safe_int, datetime_to_time, action_logger_generic)
|
||||
from rhodecode.lib.vcs.backends import get_backend
|
||||
from rhodecode.lib.vcs.exceptions import NodeDoesNotExistError
|
||||
from rhodecode.model import BaseModel
|
||||
from rhodecode.model.db import (
|
||||
Repository, UserRepoToPerm, UserGroupRepoToPerm, UserRepoGroupToPerm,
|
||||
UserGroupRepoGroupToPerm, User, Permission, Statistics, UserGroup,
|
||||
RepoGroup, RepositoryField)
|
||||
from rhodecode.model.scm import UserGroupList
|
||||
|
||||
from rhodecode.model.settings import VcsSettingsModel
|
||||
|
||||
|
||||
|
|
@ -196,47 +193,6 @@ class RepoModel(BaseModel):
|
|||
]
|
||||
return _users
|
||||
|
||||
def get_user_groups(self, name_contains=None, limit=20, only_active=True):
|
||||
|
||||
# TODO: mikhail: move this method to the UserGroupModel.
|
||||
query = self.sa.query(UserGroup)
|
||||
if only_active:
|
||||
query = query.filter(UserGroup.users_group_active == true())
|
||||
|
||||
if name_contains:
|
||||
ilike_expression = u'%{}%'.format(safe_unicode(name_contains))
|
||||
query = query.filter(
|
||||
UserGroup.users_group_name.ilike(ilike_expression))\
|
||||
.order_by(func.length(UserGroup.users_group_name))\
|
||||
.order_by(UserGroup.users_group_name)
|
||||
|
||||
query = query.limit(limit)
|
||||
user_groups = query.all()
|
||||
perm_set = ['usergroup.read', 'usergroup.write', 'usergroup.admin']
|
||||
user_groups = UserGroupList(user_groups, perm_set=perm_set)
|
||||
|
||||
_groups = [
|
||||
{
|
||||
'id': group.users_group_id,
|
||||
# TODO: marcink figure out a way to generate the url for the
|
||||
# icon
|
||||
'icon_link': '',
|
||||
'value_display': 'Group: %s (%d members)' % (
|
||||
group.users_group_name, len(group.members),),
|
||||
'value': group.users_group_name,
|
||||
'description': group.user_group_description,
|
||||
'owner': group.user.username,
|
||||
|
||||
'owner_icon': h.gravatar_url(group.user.email, 30),
|
||||
'value_display_owner': h.person(group.user.email),
|
||||
|
||||
'value_type': 'user_group',
|
||||
'active': group.users_group_active,
|
||||
}
|
||||
for group in user_groups
|
||||
]
|
||||
return _groups
|
||||
|
||||
@classmethod
|
||||
def update_repoinfo(cls, repositories=None):
|
||||
if not repositories:
|
||||
|
|
|
|||
|
|
@ -27,9 +27,10 @@ user group model for RhodeCode
|
|||
import logging
|
||||
import traceback
|
||||
|
||||
from rhodecode.lib.utils2 import safe_str
|
||||
from rhodecode.lib.utils2 import safe_str, safe_unicode
|
||||
from rhodecode.model import BaseModel
|
||||
from rhodecode.model.db import UserGroupMember, UserGroup,\
|
||||
from rhodecode.model.scm import UserGroupList
|
||||
from rhodecode.model.db import true, func, UserGroupMember, UserGroup,\
|
||||
UserGroupRepoToPerm, Permission, UserGroupToPerm, User, UserUserGroupToPerm,\
|
||||
UserGroupUserGroupToPerm, UserGroupRepoGroupToPerm
|
||||
from rhodecode.lib.exceptions import UserGroupAssignedException,\
|
||||
|
|
@ -539,6 +540,48 @@ class UserGroupModel(BaseModel):
|
|||
log.debug('Adding user %s to user group %s', user.username, gr.users_group_name)
|
||||
UserGroupModel().add_user_to_group(gr.users_group_name, user.username)
|
||||
|
||||
def get_user_groups(self, name_contains=None, limit=20, only_active=True,
|
||||
expand_groups=False):
|
||||
import rhodecode.lib.helpers as h
|
||||
|
||||
query = self.sa.query(UserGroup)
|
||||
if only_active:
|
||||
query = query.filter(UserGroup.users_group_active == true())
|
||||
|
||||
if name_contains:
|
||||
ilike_expression = u'%{}%'.format(safe_unicode(name_contains))
|
||||
query = query.filter(
|
||||
UserGroup.users_group_name.ilike(ilike_expression))\
|
||||
.order_by(func.length(UserGroup.users_group_name))\
|
||||
.order_by(UserGroup.users_group_name)
|
||||
|
||||
query = query.limit(limit)
|
||||
user_groups = query.all()
|
||||
perm_set = ['usergroup.read', 'usergroup.write', 'usergroup.admin']
|
||||
user_groups = UserGroupList(user_groups, perm_set=perm_set)
|
||||
|
||||
_groups = [
|
||||
{
|
||||
'id': group.users_group_id,
|
||||
# TODO: marcink figure out a way to generate the url for the
|
||||
# icon
|
||||
'icon_link': '',
|
||||
'value_display': 'Group: %s (%d members)' % (
|
||||
group.users_group_name, len(group.members),),
|
||||
'value': group.users_group_name,
|
||||
'description': group.user_group_description,
|
||||
'owner': group.user.username,
|
||||
|
||||
'owner_icon': h.gravatar_url(group.user.email, 30),
|
||||
'value_display_owner': h.person(group.user.email),
|
||||
|
||||
'value_type': 'user_group',
|
||||
'active': group.users_group_active,
|
||||
}
|
||||
for group in user_groups
|
||||
]
|
||||
return _groups
|
||||
|
||||
@staticmethod
|
||||
def get_user_groups_as_dict(user_group):
|
||||
import rhodecode.lib.helpers as h
|
||||
|
|
@ -550,7 +593,9 @@ class UserGroupModel(BaseModel):
|
|||
'active': user_group.users_group_active,
|
||||
"owner": user_group.user.username,
|
||||
'owner_icon': h.gravatar_url(user_group.user.email, 30),
|
||||
"owner_data": {'owner': user_group.user.username, 'owner_icon': h.gravatar_url(user_group.user.email, 30)}
|
||||
"owner_data": {
|
||||
'owner': user_group.user.username,
|
||||
'owner_icon': h.gravatar_url(user_group.user.email, 30)}
|
||||
}
|
||||
return data
|
||||
|
||||
|
|
|
|||
|
|
@ -29,10 +29,9 @@ from rhodecode.model.db import Repository
|
|||
from rhodecode.model.meta import Session
|
||||
from rhodecode.model.repo import RepoModel
|
||||
from rhodecode.model.scm import ScmModel
|
||||
from rhodecode.lib.utils2 import safe_unicode
|
||||
|
||||
|
||||
class TestRepoModel:
|
||||
class TestRepoModel(object):
|
||||
|
||||
def test_remove_repo(self, backend):
|
||||
repo = backend.create_repo()
|
||||
|
|
@ -251,60 +250,3 @@ class TestGetUsers(object):
|
|||
fake_users = [u for u in users if u['last_name'].startswith('Fake')]
|
||||
assert len(fake_users) == 3
|
||||
|
||||
|
||||
class TestGetUserGroups(object):
|
||||
def test_returns_filtered_list(self, backend, user_util):
|
||||
created_groups = []
|
||||
for i in range(4):
|
||||
created_groups.append(
|
||||
user_util.create_user_group(users_group_active=True))
|
||||
|
||||
group_filter = created_groups[-1].users_group_name[-2:]
|
||||
with mock.patch('rhodecode.lib.helpers.gravatar_url'):
|
||||
with self._patch_user_group_list():
|
||||
groups = RepoModel().get_user_groups(group_filter)
|
||||
|
||||
fake_groups = [
|
||||
u for u in groups if u['value'].startswith('test_returns')]
|
||||
assert len(fake_groups) == 1
|
||||
assert fake_groups[0]['value'] == created_groups[-1].users_group_name
|
||||
assert fake_groups[0]['value_display'].startswith(
|
||||
'Group: test_returns')
|
||||
|
||||
def test_returns_limited_list(self, backend, user_util):
|
||||
created_groups = []
|
||||
for i in range(3):
|
||||
created_groups.append(
|
||||
user_util.create_user_group(users_group_active=True))
|
||||
with mock.patch('rhodecode.lib.helpers.gravatar_url'):
|
||||
with self._patch_user_group_list():
|
||||
groups = RepoModel().get_user_groups('test_returns')
|
||||
|
||||
fake_groups = [
|
||||
u for u in groups if u['value'].startswith('test_returns')]
|
||||
assert len(fake_groups) == 3
|
||||
|
||||
def test_returns_active_user_groups(self, backend, user_util):
|
||||
for i in range(4):
|
||||
is_active = i % 2 == 0
|
||||
user_util.create_user_group(users_group_active=is_active)
|
||||
with mock.patch('rhodecode.lib.helpers.gravatar_url'):
|
||||
with self._patch_user_group_list():
|
||||
groups = RepoModel().get_user_groups()
|
||||
expected = ('id', 'icon_link', 'value_display', 'value', 'value_type')
|
||||
for group in groups:
|
||||
assert group['value_type'] is 'user_group'
|
||||
for key in expected:
|
||||
assert key in group
|
||||
|
||||
fake_groups = [
|
||||
u for u in groups if u['value'].startswith('test_returns')]
|
||||
assert len(fake_groups) == 2
|
||||
for user in fake_groups:
|
||||
assert user['value_display'].startswith('Group: test_returns')
|
||||
|
||||
def _patch_user_group_list(self):
|
||||
def side_effect(group_list, perm_set):
|
||||
return group_list
|
||||
return mock.patch(
|
||||
'rhodecode.model.repo.UserGroupList', side_effect=side_effect)
|
||||
|
|
|
|||
|
|
@ -35,6 +35,64 @@ def teardown_module(self):
|
|||
_delete_all_user_groups()
|
||||
|
||||
|
||||
class TestGetUserGroups(object):
|
||||
def test_returns_filtered_list(self, backend, user_util):
|
||||
created_groups = []
|
||||
for i in range(4):
|
||||
created_groups.append(
|
||||
user_util.create_user_group(users_group_active=True))
|
||||
|
||||
group_filter = created_groups[-1].users_group_name[-2:]
|
||||
with mock.patch('rhodecode.lib.helpers.gravatar_url'):
|
||||
with self._patch_user_group_list():
|
||||
groups = UserGroupModel().get_user_groups(group_filter)
|
||||
|
||||
fake_groups = [
|
||||
u for u in groups if u['value'].startswith('test_returns')]
|
||||
assert len(fake_groups) == 1
|
||||
assert fake_groups[0]['value'] == created_groups[-1].users_group_name
|
||||
assert fake_groups[0]['value_display'].startswith(
|
||||
'Group: test_returns')
|
||||
|
||||
def test_returns_limited_list(self, backend, user_util):
|
||||
created_groups = []
|
||||
for i in range(3):
|
||||
created_groups.append(
|
||||
user_util.create_user_group(users_group_active=True))
|
||||
with mock.patch('rhodecode.lib.helpers.gravatar_url'):
|
||||
with self._patch_user_group_list():
|
||||
groups = UserGroupModel().get_user_groups('test_returns')
|
||||
|
||||
fake_groups = [
|
||||
u for u in groups if u['value'].startswith('test_returns')]
|
||||
assert len(fake_groups) == 3
|
||||
|
||||
def test_returns_active_user_groups(self, backend, user_util):
|
||||
for i in range(4):
|
||||
is_active = i % 2 == 0
|
||||
user_util.create_user_group(users_group_active=is_active)
|
||||
with mock.patch('rhodecode.lib.helpers.gravatar_url'):
|
||||
with self._patch_user_group_list():
|
||||
groups = UserGroupModel().get_user_groups()
|
||||
expected = ('id', 'icon_link', 'value_display', 'value', 'value_type')
|
||||
for group in groups:
|
||||
assert group['value_type'] is 'user_group'
|
||||
for key in expected:
|
||||
assert key in group
|
||||
|
||||
fake_groups = [
|
||||
u for u in groups if u['value'].startswith('test_returns')]
|
||||
assert len(fake_groups) == 2
|
||||
for user in fake_groups:
|
||||
assert user['value_display'].startswith('Group: test_returns')
|
||||
|
||||
def _patch_user_group_list(self):
|
||||
def side_effect(group_list, perm_set):
|
||||
return group_list
|
||||
return mock.patch(
|
||||
'rhodecode.model.user_group.UserGroupList', side_effect=side_effect)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"pre_existing, regular_should_be, external_should_be, groups, "
|
||||
"expected", [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue