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:
@@ -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)
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user