1
0
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:
lian
2015-06-16 10:39:49 +08:00
parent 9b903cbaf2
commit c60676d5dc
2 changed files with 85 additions and 54 deletions

View File

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

View File

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