diff --git a/seahub/api2/endpoints/search_user.py b/seahub/api2/endpoints/search_user.py index 2d642dc57f..4c1497c806 100644 --- a/seahub/api2/endpoints/search_user.py +++ b/seahub/api2/endpoints/search_user.py @@ -8,19 +8,20 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.views import APIView from rest_framework import status +from django.conf import settings + import seaserv from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error -from seahub.utils import is_org_context +from seahub.utils import is_valid_email, is_org_context from seahub.base.accounts import User from seahub.base.templatetags.seahub_tags import email2nickname from seahub.profile.models import Profile from seahub.contacts.models import Contact from seahub.avatar.templatetags.avatar_tags import api_avatar_url -from seahub.settings import ENABLE_GLOBAL_ADDRESSBOOK, ENABLE_SEARCH_FROM_LDAP_DIRECTLY class SearchUser(APIView): @@ -50,7 +51,7 @@ class SearchUser(APIView): users_result = [] username = request.user.username - if request.cloud_mode: + if settings.CLOUD_MODE: if is_org_context(request): url_prefix = request.user.org.url_prefix users = seaserv.get_org_users_by_url_prefix(url_prefix, -1, -1) @@ -61,13 +62,14 @@ class SearchUser(APIView): # when search profile, only search users in org # 'nickname__icontains' for search by nickname # 'contact_email__icontains' for search by contact email - users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \ - (Q(nickname__icontains=q)) | \ - Q(contact_email__icontains=q)).values('user') - elif ENABLE_GLOBAL_ADDRESSBOOK: + users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) & + (Q(nickname__icontains=q)) | Q(contact_email__icontains=q)).values('user') + + elif settings.ENABLE_GLOBAL_ADDRESSBOOK: users_from_ccnet = search_user_from_ccnet(q) - users_from_profile = Profile.objects.filter(Q(contact_email__icontains=q) | \ + users_from_profile = Profile.objects.filter(Q(contact_email__icontains=q) | Q(nickname__icontains=q)).values('user') + else: # in cloud mode, user will be added to Contact when share repo users = [] @@ -83,16 +85,18 @@ class SearchUser(APIView): users.append(c) users_from_ccnet = filter(lambda u: q in u.email, users) + if is_valid_email(q): + users_from_ccnet += search_user_from_ccnet(q) + # 'user__in' for only get profile of contacts # 'nickname__icontains' for search by nickname # 'contact_email__icontains' for search by contact - users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \ - (Q(nickname__icontains=q)) | \ - Q(contact_email__icontains=q)).values('user') + users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) & + (Q(nickname__icontains=q)) | Q(contact_email__icontains=q)).values('user') else: users_from_ccnet = search_user_from_ccnet(q) - users_from_profile = Profile.objects.filter(Q(contact_email__icontains=q) | \ + users_from_profile = Profile.objects.filter(Q(contact_email__icontains=q) | Q(nickname__icontains=q)).values('user') # remove inactive users and add to result @@ -158,7 +162,7 @@ def search_user_from_ccnet(q): users.extend(ldap_imported_users) count = len(users) - if count < 10 and ENABLE_SEARCH_FROM_LDAP_DIRECTLY: + if count < 10 and settings.ENABLE_SEARCH_FROM_LDAP_DIRECTLY: all_ldap_users = seaserv.ccnet_threaded_rpc.search_ldapusers(q, 0, 10 - count) users.extend(all_ldap_users) diff --git a/tests/api/test_search_user.py b/tests/api/endpoints/test_search_user.py similarity index 85% rename from tests/api/test_search_user.py rename to tests/api/endpoints/test_search_user.py index 23fe57d45f..c7cca572af 100644 --- a/tests/api/test_search_user.py +++ b/tests/api/endpoints/test_search_user.py @@ -1,6 +1,8 @@ import json +from mock import patch from django.core.urlresolvers import reverse +from django.test import override_settings from seahub.profile.models import Profile from seahub.profile.utils import refresh_cache @@ -11,6 +13,7 @@ class SearchUserTest(BaseTestCase): self.login_as(self.user) self.endpoint = reverse('search-user') + @override_settings(CLOUD_MODE = False) def test_can_search(self): email = self.admin.email nickname = 'admin_test' @@ -29,6 +32,7 @@ class SearchUserTest(BaseTestCase): assert json_resp['users'][0]['name'] == nickname assert json_resp['users'][0]['contact_email'] == contact_email + @override_settings(CLOUD_MODE = False) def test_search_myself(self): email = self.user.email nickname = 'user_test' @@ -47,6 +51,7 @@ class SearchUserTest(BaseTestCase): assert json_resp['users'][0]['name'] == nickname assert json_resp['users'][0]['contact_email'] == contact_email + @override_settings(CLOUD_MODE = False) def test_search_without_myself(self): email = self.user.email resp = self.client.get(self.endpoint + '?include_self=0&q=' + email) @@ -55,6 +60,7 @@ class SearchUserTest(BaseTestCase): self.assertEqual(200, resp.status_code) assert len(json_resp['users']) == 0 + @override_settings(CLOUD_MODE = False) def test_search_unregistered_user(self): resp = self.client.get(self.endpoint + '?q=unregistered_user@seafile.com') json_resp = json.loads(resp.content) @@ -62,6 +68,7 @@ class SearchUserTest(BaseTestCase): self.assertEqual(200, resp.status_code) assert len(json_resp['users']) == 0 + @override_settings(CLOUD_MODE = False) def test_can_search_by_nickname(self): admin_email = self.admin.email @@ -81,6 +88,7 @@ class SearchUserTest(BaseTestCase): assert json_resp['users'][0]['name'] == 'Carl Smith' assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com' + @override_settings(CLOUD_MODE = False) def test_can_search_by_nickname_insensitive(self): admin_email = self.admin.email @@ -112,6 +120,7 @@ class SearchUserTest(BaseTestCase): assert json_resp['users'][0]['name'] == 'Carl Smith' assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com' + @override_settings(CLOUD_MODE = False) def test_can_search_by_contact_email(self): admin_email = self.admin.email nickname = 'admin_test' @@ -132,3 +141,16 @@ class SearchUserTest(BaseTestCase): assert json_resp['users'][0]['name'] == nickname assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com' + @override_settings(CLOUD_MODE = True) + @override_settings(ENABLE_GLOBAL_ADDRESSBOOK = False) + @patch('seahub.api2.endpoints.search_user.is_org_context') + def test_search_full_email(self, mock_is_org_context): + + mock_is_org_context.return_value = False + + resp = self.client.get(self.endpoint + '?q=%s' % self.admin.username) + json_resp = json.loads(resp.content) + + self.assertEqual(200, resp.status_code) + assert json_resp['users'][0]['email'] == self.admin.username +