1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-14 14:21:23 +00:00

update search user api

This commit is contained in:
lian
2016-07-12 15:04:36 +08:00
parent 6dee46f7d1
commit 8f1dbb7ea3
2 changed files with 39 additions and 13 deletions

View File

@@ -8,19 +8,20 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework import status from rest_framework import status
from django.conf import settings
import seaserv import seaserv
from seahub.api2.authentication import TokenAuthentication from seahub.api2.authentication import TokenAuthentication
from seahub.api2.throttling import UserRateThrottle from seahub.api2.throttling import UserRateThrottle
from seahub.api2.utils import api_error 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.accounts import User
from seahub.base.templatetags.seahub_tags import email2nickname from seahub.base.templatetags.seahub_tags import email2nickname
from seahub.profile.models import Profile from seahub.profile.models import Profile
from seahub.contacts.models import Contact from seahub.contacts.models import Contact
from seahub.avatar.templatetags.avatar_tags import api_avatar_url 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): class SearchUser(APIView):
@@ -50,7 +51,7 @@ class SearchUser(APIView):
users_result = [] users_result = []
username = request.user.username username = request.user.username
if request.cloud_mode: if settings.CLOUD_MODE:
if is_org_context(request): if is_org_context(request):
url_prefix = request.user.org.url_prefix url_prefix = request.user.org.url_prefix
users = seaserv.get_org_users_by_url_prefix(url_prefix, -1, -1) 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 # when search profile, only search users in org
# 'nickname__icontains' for search by nickname # 'nickname__icontains' for search by nickname
# 'contact_email__icontains' for search by contact email # 'contact_email__icontains' for search by contact email
users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \ users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) &
(Q(nickname__icontains=q)) | \ (Q(nickname__icontains=q)) | Q(contact_email__icontains=q)).values('user')
Q(contact_email__icontains=q)).values('user')
elif ENABLE_GLOBAL_ADDRESSBOOK: elif settings.ENABLE_GLOBAL_ADDRESSBOOK:
users_from_ccnet = search_user_from_ccnet(q) 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') Q(nickname__icontains=q)).values('user')
else: else:
# in cloud mode, user will be added to Contact when share repo # in cloud mode, user will be added to Contact when share repo
users = [] users = []
@@ -83,16 +85,18 @@ class SearchUser(APIView):
users.append(c) users.append(c)
users_from_ccnet = filter(lambda u: q in u.email, users) 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 # 'user__in' for only get profile of contacts
# 'nickname__icontains' for search by nickname # 'nickname__icontains' for search by nickname
# 'contact_email__icontains' for search by contact # 'contact_email__icontains' for search by contact
users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \ users_from_profile = Profile.objects.filter(Q(user__in=[u.email for u in users]) &
(Q(nickname__icontains=q)) | \ (Q(nickname__icontains=q)) | Q(contact_email__icontains=q)).values('user')
Q(contact_email__icontains=q)).values('user')
else: else:
users_from_ccnet = search_user_from_ccnet(q) 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') Q(nickname__icontains=q)).values('user')
# remove inactive users and add to result # remove inactive users and add to result
@@ -158,7 +162,7 @@ def search_user_from_ccnet(q):
users.extend(ldap_imported_users) users.extend(ldap_imported_users)
count = len(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) all_ldap_users = seaserv.ccnet_threaded_rpc.search_ldapusers(q, 0, 10 - count)
users.extend(all_ldap_users) users.extend(all_ldap_users)

View File

@@ -1,6 +1,8 @@
import json import json
from mock import patch
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import override_settings
from seahub.profile.models import Profile from seahub.profile.models import Profile
from seahub.profile.utils import refresh_cache from seahub.profile.utils import refresh_cache
@@ -11,6 +13,7 @@ class SearchUserTest(BaseTestCase):
self.login_as(self.user) self.login_as(self.user)
self.endpoint = reverse('search-user') self.endpoint = reverse('search-user')
@override_settings(CLOUD_MODE = False)
def test_can_search(self): def test_can_search(self):
email = self.admin.email email = self.admin.email
nickname = 'admin_test' nickname = 'admin_test'
@@ -29,6 +32,7 @@ class SearchUserTest(BaseTestCase):
assert json_resp['users'][0]['name'] == nickname assert json_resp['users'][0]['name'] == nickname
assert json_resp['users'][0]['contact_email'] == contact_email assert json_resp['users'][0]['contact_email'] == contact_email
@override_settings(CLOUD_MODE = False)
def test_search_myself(self): def test_search_myself(self):
email = self.user.email email = self.user.email
nickname = 'user_test' nickname = 'user_test'
@@ -47,6 +51,7 @@ class SearchUserTest(BaseTestCase):
assert json_resp['users'][0]['name'] == nickname assert json_resp['users'][0]['name'] == nickname
assert json_resp['users'][0]['contact_email'] == contact_email assert json_resp['users'][0]['contact_email'] == contact_email
@override_settings(CLOUD_MODE = False)
def test_search_without_myself(self): def test_search_without_myself(self):
email = self.user.email email = self.user.email
resp = self.client.get(self.endpoint + '?include_self=0&q=' + 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) self.assertEqual(200, resp.status_code)
assert len(json_resp['users']) == 0 assert len(json_resp['users']) == 0
@override_settings(CLOUD_MODE = False)
def test_search_unregistered_user(self): def test_search_unregistered_user(self):
resp = self.client.get(self.endpoint + '?q=unregistered_user@seafile.com') resp = self.client.get(self.endpoint + '?q=unregistered_user@seafile.com')
json_resp = json.loads(resp.content) json_resp = json.loads(resp.content)
@@ -62,6 +68,7 @@ class SearchUserTest(BaseTestCase):
self.assertEqual(200, resp.status_code) self.assertEqual(200, resp.status_code)
assert len(json_resp['users']) == 0 assert len(json_resp['users']) == 0
@override_settings(CLOUD_MODE = False)
def test_can_search_by_nickname(self): def test_can_search_by_nickname(self):
admin_email = self.admin.email 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]['name'] == 'Carl Smith'
assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com' assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com'
@override_settings(CLOUD_MODE = False)
def test_can_search_by_nickname_insensitive(self): def test_can_search_by_nickname_insensitive(self):
admin_email = self.admin.email 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]['name'] == 'Carl Smith'
assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com' assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com'
@override_settings(CLOUD_MODE = False)
def test_can_search_by_contact_email(self): def test_can_search_by_contact_email(self):
admin_email = self.admin.email admin_email = self.admin.email
nickname = 'admin_test' nickname = 'admin_test'
@@ -132,3 +141,16 @@ class SearchUserTest(BaseTestCase):
assert json_resp['users'][0]['name'] == nickname assert json_resp['users'][0]['name'] == nickname
assert json_resp['users'][0]['contact_email'] == 'new_mail@test.com' 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