def search_user_from_org(request, q): # get all org users url_prefix = request.user.org.url_prefix all_org_users = seaserv.get_org_users_by_url_prefix(url_prefix, -1, -1) # search user from org users email_list = [] for org_user in all_org_users: if q in org_user.email: email_list.append(org_user.email) return email_list
def org_pubinfo(request, url_prefix): """ Show org public information. """ org = get_user_current_org(request.user.username, url_prefix) if not org: return HttpResponseRedirect(reverse(myhome)) groups = get_org_groups(org.org_id, -1, -1) org_members = get_org_users_by_url_prefix(url_prefix, 0, MAX_INT) return render_to_response( "organizations/org_pubinfo.html", {"org": org, "groups": groups, "org_members": org_members}, context_instance=RequestContext(request), )
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.') q = request.GET.get('q', None) if not q: return api_error(status.HTTP_400_BAD_REQUEST, 'Argument missing.') users_from_ccnet = [] users_from_profile = [] users_result = [] username = request.user.username 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) # search user from ccnet users_from_ccnet = filter(lambda u: q in u.email, users) # 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_ccnet = search_user_from_ccnet(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 = [] 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) users_from_ccnet = filter(lambda u: q in u.email, users) # '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') else: users_from_ccnet = search_user_from_ccnet(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 for u in users_from_ccnet[:10]: if u.is_active: users_result.append(u.email) for p in users_from_profile[:10]: try: user = User.objects.get(email = p['user']) except User.DoesNotExist: continue if not user.is_active: continue users_result.append(p['user']) # remove duplicate emails users_result = {}.fromkeys(users_result).keys() try: include_self = int(request.GET.get('include_self', 1)) except ValueError: include_self = 1 if include_self == 0 and username in users_result: # reomve myself users_result.remove(username) try: size = int(request.GET.get('avatar_size', 32)) except ValueError: size = 32 formated_result = format_searched_user_result(request, users_result, size)[:10] return HttpResponse(json.dumps({"users": formated_result}), status=200, content_type='application/json; charset=utf-8')
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.') q = request.GET.get('q', None) if not q: return api_error(status.HTTP_400_BAD_REQUEST, 'Argument missing.') users_from_ccnet = [] users_from_profile = [] users_result = [] username = request.user.username 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) # search user from ccnet 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 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') 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') else: # TODO delete this ? 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) 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 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') 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') # remove inactive users and add to result for u in users_from_ccnet[:10]: if u.is_active: users_result.append(u.email) for p in users_from_profile[:10]: try: user = User.objects.get(email = p['user']) except User.DoesNotExist: continue if not user.is_active: continue users_result.append(p['user']) # remove duplicate emails users_result = {}.fromkeys(users_result).keys() try: include_self = int(request.GET.get('include_self', 1)) except ValueError: include_self = 1 if include_self == 0 and username in users_result: # reomve myself users_result.remove(username) try: size = int(request.GET.get('avatar_size', 32)) except ValueError: size = 32 formated_result = format_searched_user_result(request, users_result, size)[:10] return HttpResponse(json.dumps({"users": formated_result}), status=200, content_type='application/json; charset=utf-8')
def get(self, request, format=None): q = request.GET.get('q', None) if not q: return api_error(status.HTTP_400_BAD_REQUEST, 'q invalid.') email_list = [] username = request.user.username if self._can_use_global_address_book(request): # check user permission according to user's role(default, guest, etc.) # if current user can use global address book if CLOUD_MODE: if is_org_context(request): # search from org email_list += search_user_from_org(request, q) # search from profile, limit search range in all org users limited_emails = [] url_prefix = request.user.org.url_prefix all_org_users = seaserv.get_org_users_by_url_prefix( url_prefix, -1, -1) for user in all_org_users: limited_emails.append(user.email) email_list += search_user_from_profile_with_limits( q, limited_emails) elif ENABLE_GLOBAL_ADDRESSBOOK: # search from ccnet email_list += search_user_from_ccnet(q) # search from profile, NOT limit search range email_list += search_user_from_profile(q) else: # in cloud mode, user will be added to Contact when share repo # search user from user's contacts email_list += search_user_when_global_address_book_disabled( request, q) else: # not CLOUD_MODE # search from ccnet email_list += search_user_from_ccnet(q) # search from profile, NOT limit search range email_list += search_user_from_profile(q) else: # if current user can NOT use global address book, # he/she can also search `q` from Contact, # search user from user's contacts email_list += search_user_when_global_address_book_disabled( request, q) ## search finished # remove duplicate emails email_list = {}.fromkeys(email_list).keys() email_result = [] # remove nonexistent or inactive user for email in email_list: try: user = User.objects.get(email=email) if user.is_active: email_result.append(email) except User.DoesNotExist: continue # check if include myself in user result try: include_self = int(request.GET.get('include_self', 1)) except ValueError: include_self = 1 if include_self == 0 and username in email_result: # reomve myself email_result.remove(username) # format user result try: size = int(request.GET.get('avatar_size', 32)) except ValueError: size = 32 formated_result = format_searched_user_result(request, email_result[:10], size) return HttpResponse(json.dumps({"users": formated_result}), status=200, content_type='application/json; charset=utf-8')
def org_admin(request, url_prefix): """ List and add org users. """ if request.method == "POST": emails = request.POST.get("added-member-name") email_list = string2list(emails) for email in email_list: if not email or email.find("@") <= 0: continue org_id = request.user.org["org_id"] try: User.objects.get(email=email) email = email.strip(" ") org_id = request.user.org["org_id"] add_org_user(org_id, email, 0) # send signal org_user_added.send(sender=None, org_id=org_id, from_email=request.user.username, to_email=email) except User.DoesNotExist: # User is not registered, just create account and # add that account to org password = gen_token(max_length=6) if Site._meta.installed: site = Site.objects.get_current() else: site = RequestSite(request) RegistrationProfile.objects.create_active_user(email, email, password, site, send_email=False) add_org_user(org_id, email, 0) if hasattr(seahub_settings, "EMAIL_HOST"): org_name = request.user.org["org_name"] send_org_user_add_mail(request, email, password, org_name) # Make sure page request is an int. If not, deliver first page. try: current_page = int(request.GET.get("page", "1")) per_page = int(request.GET.get("per_page", "25")) except ValueError: current_page = 1 per_page = 25 users_plus_one = get_org_users_by_url_prefix(url_prefix, per_page * (current_page - 1), per_page + 1) if len(users_plus_one) == per_page + 1: page_next = True else: page_next = False org = get_user_current_org(request.user.username, url_prefix) if not org: return HttpResponseRedirect(reverse(myhome)) users = users_plus_one[:per_page] for user in users: if user.props.id == request.user.id: user.is_self = True try: user.quota_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org.org_id, user.email) except: user.quota_usage = -1 # My contacts contacts = Contact.objects.filter(user_email=request.user.username) org_quota_usage = seafserv_threaded_rpc.get_org_quota_usage(org.org_id) org_quota = seafserv_threaded_rpc.get_org_quota(org.org_id) return render_to_response( "organizations/org_admin.html", { "users": users, "contacts": contacts, "current_page": current_page, "prev_page": current_page - 1, "next_page": current_page + 1, "per_page": per_page, "page_next": page_next, "org_quota_usage": org_quota_usage, "org_quota": org_quota, }, context_instance=RequestContext(request), )
def org_personal(request, url_prefix): """ Show org personal page. """ org = get_user_current_org(request.user.username, url_prefix) if not org: return HttpResponseRedirect(reverse(myhome)) user = request.user.username # Org repos that I own owned_repos = seafserv_threaded_rpc.list_org_repos_by_owner(org.org_id, user) calculate_repo_last_modify(owned_repos) owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) # Org groups user created groups = get_org_groups_by_user(org.org_id, user) # Org repos others shared to me in_repos = list_org_shared_repos(org.org_id, user, "to_email", -1, -1) # For each org group I joined... for grp in groups: # Get org group repos, and for each group repos... for r_id in get_org_group_repoids(org.org_id, grp.id): # No need to list my own repo if is_org_repo_owner(org.org_id, r_id, user): continue # Convert repo properties due to the different collumns in Repo # and SharedRepo r = get_repo(r_id) if not r: continue r.repo_id = r.id r.repo_name = r.name r.repo_desc = r.desc last_commit = get_commits(r_id, 0, 1)[0] r.last_modified = last_commit.ctime if last_commit else 0 r.share_type = "group" r.user = get_org_repo_owner(r_id) r.user_perm = check_permission(r_id, user) in_repos.append(r) in_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) # All org groups used in auto complete. org_groups = get_org_groups(org.org_id, -1, -1) # Org members used in auto complete contacts = [] org_members = get_org_users_by_url_prefix(org.url_prefix, 0, MAX_INT) for m in org_members: if m.email == user: # shouldn' show my'email in auto complete continue m.contact_email = m.email contacts.append(m) # Get nickname if not Profile.objects.filter(user=request.user.username): nickname = "" else: profile = Profile.objects.filter(user=request.user.username)[0] nickname = profile.nickname # events if EVENTS_ENABLED: events = True else: events = False quota_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org.org_id, user) starred_files = get_starred_files(user, org_id=org.org_id) return render_to_response( "organizations/personal.html", { "owned_repos": owned_repos, "in_repos": in_repos, "org": org, "groups": groups, "org_groups": org_groups, "contacts": contacts, "create_shared_repo": False, "allow_public_share": True, "nickname": nickname, "events": events, "quota_usage": quota_usage, "starred_files": starred_files, }, context_instance=RequestContext(request), )
if not validate_group_name(group_name): result["error"] = _(u"Group name can only contain letters, digits and underscore") return HttpResponse(json.dumps(result), content_type=content_type) try: e_grpname = group_name.encode("utf-8") user = request.user.username group_id = ccnet_threaded_rpc.create_org_group(org.org_id, e_grpname, user) except SearpcError, e: result["error"] = _(e.msg) return HttpResponse(json.dumps(result), content_type=content_type) return HttpResponse(json.dumps({"success": True}), content_type=content_type) joined_groups = get_org_groups_by_user(org.org_id, request.user.username) groups = get_org_groups(org.org_id, -1, -1) org_members = get_org_users_by_url_prefix(url_prefix, 0, MAX_INT) return render_to_response( "organizations/org_groups.html", {"org": org, "groups": groups, "joined_groups": joined_groups, "org_members": org_members}, context_instance=RequestContext(request), ) def send_org_user_add_mail(request, email, password, org_name): """ Send email when add new user. """ use_https = request.is_secure() domain = RequestSite(request).domain
def org_personal(request, url_prefix): """ Show org personal page. """ org = get_user_current_org(request.user.username, url_prefix) if not org: return HttpResponseRedirect(reverse(myhome)) user = request.user.username # Org repos that I own owned_repos = seafserv_threaded_rpc.list_org_repos_by_owner(org.org_id, user) calculate_repo_last_modify(owned_repos) owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) # Org repos others shared to me in_repos = list_org_shared_repos(org.org_id, user,'to_email', -1, -1) # Org groups user created groups = get_org_groups_by_user(org.org_id, user) # All org groups used in auto complete. org_groups = get_org_groups(org.org_id, -1, -1) # Org members used in auto complete contacts = [] org_members = get_org_users_by_url_prefix(org.url_prefix, 0, MAX_INT) for m in org_members: if m.email == user: # shouldn' show my'email in auto complete continue m.contact_email = m.email contacts.append(m) # Get nickname if not Profile.objects.filter(user=request.user.username): nickname = '' else: profile = Profile.objects.filter(user=request.user.username)[0] nickname = profile.nickname # events if EVENTS_ENABLED: events = get_org_user_events(org.org_id, user) else: events = None quota_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org.org_id, user) starred_files = get_starred_files(user, org_id=org.org_id) return render_to_response('organizations/personal.html', { 'owned_repos': owned_repos, "in_repos": in_repos, 'org': org, 'groups': groups, 'org_groups': org_groups, 'contacts': contacts, 'create_shared_repo': False, 'allow_public_share': True, 'nickname': nickname, 'events': events, 'quota_usage': quota_usage, 'starred_files': starred_files, }, context_instance=RequestContext(request))