diff --git a/rhodecode/apps/home/views.py b/rhodecode/apps/home/views.py --- a/rhodecode/apps/home/views.py +++ b/rhodecode/apps/home/views.py @@ -31,6 +31,7 @@ from rhodecode.lib.utils2 import safe_un from rhodecode.model.db import func, Repository, RepoGroup from rhodecode.model.repo import RepoModel from rhodecode.model.scm import ScmModel +from rhodecode.model.user import UserModel from rhodecode.model.user_group import UserGroupModel log = logging.getLogger(__name__) @@ -56,8 +57,7 @@ class HomeView(BaseAppView): log.debug('generating user list, query:%s, active:%s, with_groups:%s', query, active, include_groups) - repo_model = RepoModel() - _users = repo_model.get_users( + _users = UserModel().get_users( name_contains=query, only_active=active) if include_groups: diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py --- a/rhodecode/model/repo.py +++ b/rhodecode/model/repo.py @@ -30,7 +30,6 @@ import time import traceback from datetime import datetime, timedelta -from sqlalchemy.sql.expression import true, or_ from zope.cachedescriptors.property import Lazy as LazyProperty from rhodecode import events @@ -157,42 +156,6 @@ class RepoModel(BaseModel): return h.url('summary_home', repo_name=safe_str(repo.repo_name), qualified=True) - def get_users(self, name_contains=None, limit=20, only_active=True): - - # TODO: mikhail: move this method to the UserModel. - query = self.sa.query(User) - if only_active: - query = query.filter(User.active == true()) - - if name_contains: - ilike_expression = u'%{}%'.format(safe_unicode(name_contains)) - query = query.filter( - or_( - User.name.ilike(ilike_expression), - User.lastname.ilike(ilike_expression), - User.username.ilike(ilike_expression) - ) - ) - query = query.limit(limit) - users = query.all() - - _users = [ - { - 'id': user.user_id, - 'first_name': user.name, - 'last_name': user.lastname, - 'username': user.username, - 'email': user.email, - 'icon_link': h.gravatar_url(user.email, 30), - 'value_display': h.person(user), - 'value': user.username, - 'value_type': 'user', - 'active': user.active, - } - for user in users - ] - return _users - @classmethod def update_repoinfo(cls, repositories=None): if not repositories: diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -65,6 +65,42 @@ class UserModel(BaseModel): def get_user(self, user): return self._get_user(user) + def get_users(self, name_contains=None, limit=20, only_active=True): + import rhodecode.lib.helpers as h + + query = self.sa.query(User) + if only_active: + query = query.filter(User.active == true()) + + if name_contains: + ilike_expression = u'%{}%'.format(safe_unicode(name_contains)) + query = query.filter( + or_( + User.name.ilike(ilike_expression), + User.lastname.ilike(ilike_expression), + User.username.ilike(ilike_expression) + ) + ) + query = query.limit(limit) + users = query.all() + + _users = [ + { + 'id': user.user_id, + 'first_name': user.name, + 'last_name': user.lastname, + 'username': user.username, + 'email': user.email, + 'icon_link': h.gravatar_url(user.email, 30), + 'value_display': h.person(user), + 'value': user.username, + 'value_type': 'user', + 'active': user.active, + } + for user in users + ] + return _users + def get_by_username(self, username, cache=False, case_insensitive=False): if case_insensitive: diff --git a/rhodecode/tests/models/test_repos.py b/rhodecode/tests/models/test_repos.py --- a/rhodecode/tests/models/test_repos.py +++ b/rhodecode/tests/models/test_repos.py @@ -169,84 +169,3 @@ class TestRepoModel(object): repo.update_commit_cache(config=config) scm.assert_called_with( cache=False, config=config) - - -class TestGetUsers(object): - def test_returns_active_users(self, backend, user_util): - for i in range(4): - is_active = i % 2 == 0 - user_util.create_user(active=is_active, lastname='Fake user') - - with mock.patch('rhodecode.lib.helpers.gravatar_url'): - users = RepoModel().get_users() - fake_users = [u for u in users if u['last_name'] == 'Fake user'] - assert len(fake_users) == 2 - - expected_keys = ( - 'id', 'first_name', 'last_name', 'username', 'icon_link', - 'value_display', 'value', 'value_type') - for user in users: - assert user['value_type'] is 'user' - for key in expected_keys: - assert key in user - - def test_returns_user_filtered_by_last_name(self, backend, user_util): - keywords = ('aBc', u'ünicode') - for keyword in keywords: - for i in range(2): - user_util.create_user( - active=True, lastname=u'Fake {} user'.format(keyword)) - - with mock.patch('rhodecode.lib.helpers.gravatar_url'): - keyword = keywords[1].lower() - users = RepoModel().get_users(name_contains=keyword) - - fake_users = [u for u in users if u['last_name'].startswith('Fake')] - assert len(fake_users) == 2 - for user in fake_users: - assert user['last_name'] == safe_unicode('Fake ünicode user') - - def test_returns_user_filtered_by_first_name(self, backend, user_util): - created_users = [] - keywords = ('aBc', u'ünicode') - for keyword in keywords: - for i in range(2): - created_users.append(user_util.create_user( - active=True, lastname='Fake user', - firstname=u'Fake {} user'.format(keyword))) - - keyword = keywords[1].lower() - with mock.patch('rhodecode.lib.helpers.gravatar_url'): - users = RepoModel().get_users(name_contains=keyword) - - fake_users = [u for u in users if u['last_name'].startswith('Fake')] - assert len(fake_users) == 2 - for user in fake_users: - assert user['first_name'] == safe_unicode('Fake ünicode user') - - def test_returns_user_filtered_by_username(self, backend, user_util): - created_users = [] - for i in range(5): - created_users.append(user_util.create_user( - active=True, lastname='Fake user')) - - user_filter = created_users[-1].username[-2:] - with mock.patch('rhodecode.lib.helpers.gravatar_url'): - users = RepoModel().get_users(name_contains=user_filter) - - fake_users = [u for u in users if u['last_name'].startswith('Fake')] - assert len(fake_users) == 1 - assert fake_users[0]['username'] == created_users[-1].username - - def test_returns_limited_user_list(self, backend, user_util): - created_users = [] - for i in range(5): - created_users.append(user_util.create_user( - active=True, lastname='Fake user')) - - with mock.patch('rhodecode.lib.helpers.gravatar_url'): - users = RepoModel().get_users(name_contains='Fake', limit=3) - - fake_users = [u for u in users if u['last_name'].startswith('Fake')] - assert len(fake_users) == 3 - diff --git a/rhodecode/tests/models/test_users.py b/rhodecode/tests/models/test_users.py --- a/rhodecode/tests/models/test_users.py +++ b/rhodecode/tests/models/test_users.py @@ -19,10 +19,11 @@ # and proprietary license terms, please see https://rhodecode.com/licenses/ import pytest -from sqlalchemy.sql.expression import true +import mock -from rhodecode.model.db import User, UserGroup, UserGroupMember, UserEmailMap,\ - Permission, UserIpMap +from rhodecode.lib.utils2 import safe_unicode +from rhodecode.model.db import ( + true, User, UserGroup, UserGroupMember, UserEmailMap, Permission, UserIpMap) from rhodecode.model.meta import Session from rhodecode.model.user import UserModel from rhodecode.model.user_group import UserGroupModel @@ -33,6 +34,86 @@ from rhodecode.tests.fixture import Fixt fixture = Fixture() +class TestGetUsers(object): + def test_returns_active_users(self, backend, user_util): + for i in range(4): + is_active = i % 2 == 0 + user_util.create_user(active=is_active, lastname='Fake user') + + with mock.patch('rhodecode.lib.helpers.gravatar_url'): + users = UserModel().get_users() + fake_users = [u for u in users if u['last_name'] == 'Fake user'] + assert len(fake_users) == 2 + + expected_keys = ( + 'id', 'first_name', 'last_name', 'username', 'icon_link', + 'value_display', 'value', 'value_type') + for user in users: + assert user['value_type'] is 'user' + for key in expected_keys: + assert key in user + + def test_returns_user_filtered_by_last_name(self, backend, user_util): + keywords = ('aBc', u'ünicode') + for keyword in keywords: + for i in range(2): + user_util.create_user( + active=True, lastname=u'Fake {} user'.format(keyword)) + + with mock.patch('rhodecode.lib.helpers.gravatar_url'): + keyword = keywords[1].lower() + users = UserModel().get_users(name_contains=keyword) + + fake_users = [u for u in users if u['last_name'].startswith('Fake')] + assert len(fake_users) == 2 + for user in fake_users: + assert user['last_name'] == safe_unicode('Fake ünicode user') + + def test_returns_user_filtered_by_first_name(self, backend, user_util): + created_users = [] + keywords = ('aBc', u'ünicode') + for keyword in keywords: + for i in range(2): + created_users.append(user_util.create_user( + active=True, lastname='Fake user', + firstname=u'Fake {} user'.format(keyword))) + + keyword = keywords[1].lower() + with mock.patch('rhodecode.lib.helpers.gravatar_url'): + users = UserModel().get_users(name_contains=keyword) + + fake_users = [u for u in users if u['last_name'].startswith('Fake')] + assert len(fake_users) == 2 + for user in fake_users: + assert user['first_name'] == safe_unicode('Fake ünicode user') + + def test_returns_user_filtered_by_username(self, backend, user_util): + created_users = [] + for i in range(5): + created_users.append(user_util.create_user( + active=True, lastname='Fake user')) + + user_filter = created_users[-1].username[-2:] + with mock.patch('rhodecode.lib.helpers.gravatar_url'): + users = UserModel().get_users(name_contains=user_filter) + + fake_users = [u for u in users if u['last_name'].startswith('Fake')] + assert len(fake_users) == 1 + assert fake_users[0]['username'] == created_users[-1].username + + def test_returns_limited_user_list(self, backend, user_util): + created_users = [] + for i in range(5): + created_users.append(user_util.create_user( + active=True, lastname='Fake user')) + + with mock.patch('rhodecode.lib.helpers.gravatar_url'): + users = UserModel().get_users(name_contains='Fake', limit=3) + + fake_users = [u for u in users if u['last_name'].startswith('Fake')] + assert len(fake_users) == 3 + + @pytest.fixture def test_user(request, pylonsapp): usr = UserModel().create_or_update(