1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-13 22:01:06 +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 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)

View File

@@ -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