Exemplo n.º 1
0
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
Exemplo n.º 2
0
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),
    )
Exemplo n.º 3
0
    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')
Exemplo n.º 4
0
    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')
Exemplo n.º 5
0
    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')
Exemplo n.º 6
0
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),
    )
Exemplo n.º 7
0
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),
    )
Exemplo n.º 8
0
        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
Exemplo n.º 9
0
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))