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