mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-20 19:08:21 +00:00
Seperate DB and LDAP when search users
This commit is contained in:
@@ -431,59 +431,76 @@ class SearchUser(APIView):
|
|||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
|
|
||||||
username = request.user.username
|
q = request.GET.get('q', None)
|
||||||
q = request.GET.get('q', '')
|
|
||||||
search_result = []
|
|
||||||
|
|
||||||
if not q:
|
if not q:
|
||||||
contacts = Contact.objects.get_contacts_by_user(username)
|
return api_error(status.HTTP_400_BAD_REQUEST, 'Argument missing.')
|
||||||
for c in contacts:
|
|
||||||
search_result.append(c.contact_email)
|
|
||||||
else:
|
|
||||||
searched_users = []
|
|
||||||
searched_profiles = []
|
|
||||||
|
|
||||||
if request.cloud_mode:
|
username = request.user.username
|
||||||
if is_org_context(request):
|
search_result = []
|
||||||
url_prefix = request.user.org.url_prefix
|
searched_users = []
|
||||||
users = seaserv.get_org_users_by_url_prefix(url_prefix, -1, -1)
|
searched_profiles = []
|
||||||
|
|
||||||
searched_users = filter(lambda u: q in u.email, users)
|
if request.cloud_mode:
|
||||||
# 'user__in' for only get profile of user in org
|
if is_org_context(request):
|
||||||
# 'nickname__contains' for search by nickname
|
url_prefix = request.user.org.url_prefix
|
||||||
searched_profiles = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \
|
users = seaserv.get_org_users_by_url_prefix(url_prefix, -1, -1)
|
||||||
Q(nickname__contains=q)).values('user')
|
|
||||||
elif ENABLE_GLOBAL_ADDRESSBOOK:
|
|
||||||
searched_users = seaserv.ccnet_threaded_rpc.search_emailusers(q, 0, 10)
|
|
||||||
searched_profiles = Profile.objects.filter(nickname__contains=q).values('user')
|
|
||||||
else:
|
|
||||||
users = []
|
|
||||||
contacts = Contact.objects.get_contacts_by_user(username)
|
|
||||||
for c in contacts:
|
|
||||||
c.email = c.contact_email
|
|
||||||
users.append(c)
|
|
||||||
|
|
||||||
searched_users = filter(lambda u: q in u.email, users)
|
searched_users = filter(lambda u: q in u.email, users)
|
||||||
# 'user__in' for only get profile of contacts
|
# 'user__in' for only get profile of user in org
|
||||||
# 'nickname__contains' for search by nickname
|
# 'nickname__contains' for search by nickname
|
||||||
searched_profiles = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \
|
searched_profiles = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \
|
||||||
Q(nickname__contains=q)).values('user')
|
Q(nickname__contains=q)).values('user')
|
||||||
else:
|
elif ENABLE_GLOBAL_ADDRESSBOOK:
|
||||||
searched_users = seaserv.ccnet_threaded_rpc.search_emailusers(q, 0, 10)
|
searched_users = get_searched_users(q)
|
||||||
searched_profiles = Profile.objects.filter(nickname__contains=q).values('user')
|
searched_profiles = Profile.objects.filter(nickname__contains=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
|
||||||
|
|
||||||
for u in searched_users[:10]:
|
c.email = c.contact_email
|
||||||
search_result.append(u.email)
|
users.append(c)
|
||||||
|
|
||||||
for p in searched_profiles[:10]:
|
searched_users = filter(lambda u: q in u.email, users)
|
||||||
search_result.append(p['user'])
|
# 'user__in' for only get profile of contacts
|
||||||
|
# 'nickname__contains' for search by nickname
|
||||||
|
searched_profiles = Profile.objects.filter(Q(user__in=[u.email for u in users]) & \
|
||||||
|
Q(nickname__contains=q)).values('user')
|
||||||
|
else:
|
||||||
|
searched_users = get_searched_users(q)
|
||||||
|
searched_profiles = Profile.objects.filter(nickname__contains=q).values('user')
|
||||||
|
|
||||||
# remove duplicate emails
|
# remove inactive users
|
||||||
search_result = {}.fromkeys(search_result).keys()
|
searched_users = filter(lambda u: u.is_active, searched_users)
|
||||||
|
for p in searched_profiles:
|
||||||
|
try:
|
||||||
|
user = User.objects.get(email = p['user'])
|
||||||
|
except User.DoesNotExist:
|
||||||
|
searched_profiles.remove(p)
|
||||||
|
continue
|
||||||
|
|
||||||
# reomve myself
|
if not user.is_active:
|
||||||
if username in search_result:
|
searched_profiles.remove(p)
|
||||||
search_result.remove(username)
|
|
||||||
|
# add to result
|
||||||
|
for u in searched_users[:10]:
|
||||||
|
search_result.append(u.email)
|
||||||
|
|
||||||
|
for p in searched_profiles[:10]:
|
||||||
|
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)
|
||||||
|
|
||||||
formated_result = format_user_result(search_result)[:10]
|
formated_result = format_user_result(search_result)[:10]
|
||||||
return HttpResponse(json.dumps({"users": formated_result}), status=200,
|
return HttpResponse(json.dumps({"users": formated_result}), status=200,
|
||||||
@@ -492,18 +509,29 @@ class SearchUser(APIView):
|
|||||||
def format_user_result(users):
|
def format_user_result(users):
|
||||||
results = []
|
results = []
|
||||||
for email in users:
|
for email in users:
|
||||||
try:
|
results.append({
|
||||||
user = User.objects.get(email = email)
|
"email": email,
|
||||||
if user.is_active:
|
"avatar": avatar(email, 32),
|
||||||
results.append({
|
"name": email2nickname(email),
|
||||||
"email": email,
|
})
|
||||||
"avatar": avatar(email, 32),
|
|
||||||
"name": email2nickname(email),
|
|
||||||
})
|
|
||||||
except User.DoesNotExist:
|
|
||||||
continue
|
|
||||||
return results
|
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):
|
class Search(APIView):
|
||||||
""" Search all the repos
|
""" Search all the repos
|
||||||
"""
|
"""
|
||||||
|
@@ -1279,7 +1279,10 @@ def user_search(request):
|
|||||||
"""
|
"""
|
||||||
email = request.GET.get('email', '')
|
email = request.GET.get('email', '')
|
||||||
|
|
||||||
users = ccnet_threaded_rpc.search_emailusers(email, -1, -1)
|
users = ccnet_threaded_rpc.search_emailusers('DB', email, -1, -1)
|
||||||
|
ldap_users = ccnet_threaded_rpc.search_emailusers('LDAP', email, -1, -1)
|
||||||
|
users.extend(ldap_users)
|
||||||
|
|
||||||
last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users])
|
last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users])
|
||||||
if ENABLE_TRIAL_ACCOUNT:
|
if ENABLE_TRIAL_ACCOUNT:
|
||||||
trial_users = TrialAccount.objects.filter(user_or_org__in=[x.email for x in users])
|
trial_users = TrialAccount.objects.filter(user_or_org__in=[x.email for x in users])
|
||||||
|
Reference in New Issue
Block a user