mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-02 07:47:32 +00:00
update search user api
This commit is contained in:
parent
ce2648e646
commit
08bb474d11
@ -36,7 +36,6 @@ class SearchUser(APIView):
|
||||
|
||||
def get(self, request, format=None):
|
||||
|
||||
|
||||
if not self._can_use_global_address_book(request):
|
||||
return api_error(status.HTTP_403_FORBIDDEN,
|
||||
'Guest user can not use global address book.')
|
||||
@ -60,17 +59,17 @@ class SearchUser(APIView):
|
||||
users_from_ccnet = filter(lambda u: q in u.email, users)
|
||||
|
||||
# when search profile, only search users in org
|
||||
# 'nickname__contains' for search by nickname
|
||||
# 'contact_email__contains' for search by contact email
|
||||
# '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__contains=q)) | \
|
||||
Q(contact_email__contains=q)).values('user')
|
||||
(Q(nickname__icontains=q)) | \
|
||||
Q(contact_email__icontains=q)).values('user')
|
||||
elif ENABLE_GLOBAL_ADDRESSBOOK:
|
||||
users_from_ccnet = search_user_from_ccnet(q)
|
||||
users_from_profile = Profile.objects.filter(Q(contact_email__contains=q) | \
|
||||
Q(nickname__contains=q)).values('user')
|
||||
users_from_profile = Profile.objects.filter(Q(contact_email__icontains=q) | \
|
||||
Q(nickname__icontains=q)).values('user')
|
||||
else:
|
||||
# TODO delete this ?
|
||||
# in cloud mode, user will be added to Contact when share repo
|
||||
users = []
|
||||
contacts = Contact.objects.get_contacts_by_user(username)
|
||||
for c in contacts:
|
||||
@ -85,15 +84,16 @@ class SearchUser(APIView):
|
||||
|
||||
users_from_ccnet = filter(lambda u: q in u.email, users)
|
||||
# 'user__in' for only get profile of contacts
|
||||
# 'nickname__contains' for search by nickname
|
||||
# 'contact_email__contains' for search by contact
|
||||
# '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__contains=q)) | \
|
||||
Q(contact_email__contains=q)).values('user')
|
||||
(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__contains=q) | \
|
||||
Q(nickname__contains=q)).values('user')
|
||||
users_from_profile = Profile.objects.filter(Q(contact_email__icontains=q) | \
|
||||
Q(nickname__icontains=q)).values('user')
|
||||
|
||||
# remove inactive users and add to result
|
||||
for u in users_from_ccnet[:10]:
|
||||
|
@ -288,136 +288,6 @@ class RegDevice(APIView):
|
||||
token.save()
|
||||
return Response("success")
|
||||
|
||||
class SearchUser(APIView):
|
||||
""" Search user from contacts/all users
|
||||
"""
|
||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||
permission_classes = (IsAuthenticated,)
|
||||
throttle_classes = (UserRateThrottle, )
|
||||
|
||||
def get(self, request, format=None):
|
||||
|
||||
if not request.user.permissions.can_use_global_address_book():
|
||||
return api_error(status.HTTP_403_FORBIDDEN,
|
||||
'Guest user can not use global address book.')
|
||||
|
||||
q = request.GET.get('q', None)
|
||||
|
||||
if not q:
|
||||
return api_error(status.HTTP_400_BAD_REQUEST, 'Argument missing.')
|
||||
|
||||
username = request.user.username
|
||||
search_result = []
|
||||
searched_users = []
|
||||
searched_profiles = []
|
||||
|
||||
if request.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)
|
||||
|
||||
searched_users = filter(lambda u: q in u.email, users)
|
||||
# 'user__in' for only get profile of user in org
|
||||
# 'nickname__icontains' for search by nickname
|
||||
searched_profiles = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \
|
||||
Q(nickname__icontains=q)).values('user')
|
||||
elif ENABLE_GLOBAL_ADDRESSBOOK:
|
||||
searched_users = get_searched_users(q)
|
||||
searched_profiles = Profile.objects.filter(nickname__icontains=q).values('user')
|
||||
else:
|
||||
users = []
|
||||
contacts = Contact.objects.get_contacts_by_user(username)
|
||||
for c in contacts:
|
||||
try:
|
||||
user = User.objects.get(email = c.contact_email)
|
||||
c.is_active = user.is_active
|
||||
except User.DoesNotExist:
|
||||
continue
|
||||
|
||||
c.email = c.contact_email
|
||||
users.append(c)
|
||||
|
||||
searched_users = filter(lambda u: q in u.email, users)
|
||||
# 'user__in' for only get profile of contacts
|
||||
# 'nickname__icontains' for search by nickname
|
||||
searched_profiles = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \
|
||||
Q(nickname__icontains=q)).values('user')
|
||||
else:
|
||||
searched_users = get_searched_users(q)
|
||||
searched_profiles = Profile.objects.filter(nickname__icontains=q).values('user')
|
||||
|
||||
|
||||
# remove inactive users and add to result
|
||||
for u in searched_users[:10]:
|
||||
if u.is_active:
|
||||
search_result.append(u.email)
|
||||
|
||||
for p in searched_profiles[:10]:
|
||||
try:
|
||||
user = User.objects.get(email = p['user'])
|
||||
except User.DoesNotExist:
|
||||
continue
|
||||
|
||||
if not user.is_active:
|
||||
continue
|
||||
|
||||
search_result.append(p['user'])
|
||||
|
||||
# remove duplicate emails
|
||||
search_result = {}.fromkeys(search_result).keys()
|
||||
|
||||
# reomve myself
|
||||
if username in search_result:
|
||||
search_result.remove(username)
|
||||
|
||||
if is_valid_username(q) and q not in search_result:
|
||||
search_result.insert(0, q)
|
||||
|
||||
try:
|
||||
size = int(request.GET.get('avatar_size', 32))
|
||||
except ValueError:
|
||||
size = 32
|
||||
|
||||
formated_result = format_user_result(request, search_result, size)[:10]
|
||||
return HttpResponse(json.dumps({"users": formated_result}), status=200,
|
||||
content_type=json_content_type)
|
||||
|
||||
def format_user_result(request, users, size):
|
||||
results = []
|
||||
|
||||
# Get contact_emails from users' profiles
|
||||
profiles = Profile.objects.filter(user__in=users)
|
||||
contact_email_dict = {}
|
||||
for e in profiles:
|
||||
contact_email_dict[e.user] = e.contact_email
|
||||
|
||||
for email in users:
|
||||
url, is_default, date_uploaded = api_avatar_url(email, size)
|
||||
results.append({
|
||||
"email": email,
|
||||
"avatar": avatar(email, size),
|
||||
"avatar_url": request.build_absolute_uri(url),
|
||||
"name": email2nickname(email),
|
||||
"contact_email": contact_email_dict.get(email, ""),
|
||||
})
|
||||
return results
|
||||
|
||||
def get_searched_users(q):
|
||||
searched_users = []
|
||||
searched_db_users = []
|
||||
searched_ldap_users = []
|
||||
|
||||
searched_db_users = seaserv.ccnet_threaded_rpc.search_emailusers('DB', q, 0, 10)
|
||||
|
||||
count = len(searched_db_users)
|
||||
if count < 10:
|
||||
searched_ldap_users = seaserv.ccnet_threaded_rpc.search_emailusers('LDAP', q, 0, 10 - count)
|
||||
|
||||
searched_users.extend(searched_db_users)
|
||||
searched_users.extend(searched_ldap_users)
|
||||
|
||||
return searched_users
|
||||
|
||||
|
||||
class Search(APIView):
|
||||
""" Search all the repos
|
||||
|
Loading…
Reference in New Issue
Block a user