Esempio n. 1
0
def get_most_in_common_contributors(auth, node, **kwargs):
    node_contrib_ids = set(node.contributors._to_primary_keys())
    try:
        n_contribs = int(request.args.get('max', None))
    except (TypeError, ValueError):
        n_contribs = settings.MAX_MOST_IN_COMMON_LENGTH

    contrib_counts = Counter(contrib_id
        for node in auth.user.node__contributed
        for contrib_id in node.contributors._to_primary_keys()
        if contrib_id not in node_contrib_ids)

    active_contribs = itertools.ifilter(
        lambda c: User.load(c[0]).is_active,
        contrib_counts.most_common()
    )

    limited = itertools.islice(active_contribs, n_contribs)

    contrib_objs = [(User.load(_id), count) for _id, count in limited]

    contribs = [
        utils.add_contributor_json(most_contrib, auth.user)
        for most_contrib, count in sorted(contrib_objs, key=lambda t: (-t[1], t[0].fullname))
    ]
    return {'contributors': contribs}
Esempio n. 2
0
def get_recently_added_contributors(auth, node, **kwargs):

    max_results = request.args.get('max')
    if max_results:
        try:
            max_results = int(max_results)
        except (TypeError, ValueError):
            raise HTTPError(http.BAD_REQUEST)
    if not max_results:
        max_results = len(auth.user.recently_added)

    # only include active contributors
    active_contribs = itertools.ifilter(
        lambda c: c.is_active and c._id not in node.contributors,
        auth.user.recently_added
    )

    # Limit to max_results
    limited_contribs = itertools.islice(active_contribs, max_results)

    contribs = [
        utils.add_contributor_json(contrib, auth.user)
        for contrib in limited_contribs
    ]
    return {'contributors': contribs}
Esempio n. 3
0
def get_most_in_common_contributors(auth, node, **kwargs):
    node_contrib_ids = set(node.contributors._to_primary_keys())
    try:
        n_contribs = int(request.args.get('max', None))
    except (TypeError, ValueError):
        n_contribs = settings.MAX_MOST_IN_COMMON_LENGTH

    contrib_counts = Counter(
        contrib_id for node in auth.user.node__contributed
        for contrib_id in node.contributors._to_primary_keys()
        if contrib_id not in node_contrib_ids)

    active_contribs = itertools.ifilter(lambda c: User.load(c[0]).is_active,
                                        contrib_counts.most_common())

    limited = itertools.islice(active_contribs, n_contribs)

    contrib_objs = [(User.load(_id), count) for _id, count in limited]

    contribs = [
        profile_utils.add_contributor_json(most_contrib, auth.user)
        for most_contrib, count in sorted(contrib_objs,
                                          key=lambda t: (-t[1], t[0].fullname))
    ]
    return {'contributors': contribs}
Esempio n. 4
0
def invite_contributor_post(node, **kwargs):
    """API view for inviting an unregistered user.
    Expects JSON arguments with 'fullname' (required) and email (not required).
    """
    fullname = request.json.get('fullname').strip()
    email = request.json.get('email')
    if email:
        email = email.lower().strip()
    if not fullname:
        return {'status': 400, 'message': 'Must provide fullname'}, 400
    # Check if email is in the database
    user = get_user(email=email)
    if user:
        if user.is_registered:
            msg = 'User is already in database. Please go back and try your search again.'
            return {'status': 400, 'message': msg}, 400
        elif node.is_contributor(user):
            msg = 'User with this email address is already a contributor to this project.'
            return {'status': 400, 'message': msg}, 400
        else:
            serialized = utils.add_contributor_json(user)
            # use correct display name
            serialized['fullname'] = fullname
            serialized['email'] = email
    else:
        # Create a placeholder
        serialized = utils.serialize_unregistered(fullname, email)
    return {'status': 'success', 'contributor': serialized}
Esempio n. 5
0
def get_contributors_from_parent(auth, node, **kwargs):

    parent = node.parent_node

    if not parent:
        raise HTTPError(http.BAD_REQUEST)

    if not node.can_view(auth):
        raise HTTPError(http.FORBIDDEN)

    contribs = [profile_utils.add_contributor_json(contrib) for contrib in parent.visible_contributors]

    return {"contributors": contribs}
Esempio n. 6
0
    def test_add_contributor_json(self):
        # User with no employment or education info listed
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info['fullname'], self.fullname)
        assert_equal(user_info['email'], self.username)
        assert_equal(user_info['id'], self.user_id)
        assert_equal(user_info['employment'], None)
        assert_equal(user_info['education'], None)
        assert_equal(user_info['n_projects_in_common'], 0)
        assert_equal(user_info['registered'], True)
        assert_equal(user_info['active'], True)
        assert_in('secure.gravatar.com', user_info['gravatar_url'])
        assert_equal(user_info['profile_url'], self.profile)
Esempio n. 7
0
    def test_add_contributor_json(self):
        # User with no employment or education info listed
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info['fullname'], self.fullname)
        assert_equal(user_info['email'], self.username)
        assert_equal(user_info['id'], self.user_id)
        assert_equal(user_info['employment'], None)
        assert_equal(user_info['education'], None)
        assert_equal(user_info['n_projects_in_common'], 0)
        assert_equal(user_info['registered'], True)
        assert_equal(user_info['active'], True)
        assert_in('secure.gravatar.com', user_info['gravatar_url'])
        assert_equal(user_info['profile_url'], self.profile)
Esempio n. 8
0
    def test_add_contributor_json(self):
        # User with no employment or education info listed
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info["fullname"], self.fullname)
        assert_equal(user_info["email"], self.username)
        assert_equal(user_info["id"], self.user_id)
        assert_equal(user_info["employment"], None)
        assert_equal(user_info["education"], None)
        assert_equal(user_info["n_projects_in_common"], 0)
        assert_equal(user_info["registered"], True)
        assert_equal(user_info["active"], True)
        assert_in("secure.gravatar.com", user_info["gravatar_url"])
        assert_equal(user_info["profile_url"], self.profile)
Esempio n. 9
0
    def test_add_contributor_json_with_job(self):
        # Test user with only employment information
        self.user.jobs = self.jobs
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info["fullname"], self.fullname)
        assert_equal(user_info["email"], self.username)
        assert_equal(user_info["id"], self.user_id)
        assert_equal(user_info["employment"], self.user.jobs[0]["institution"])
        assert_equal(user_info["education"], None)
        assert_equal(user_info["n_projects_in_common"], 0)
        assert_equal(user_info["registered"], True)
        assert_equal(user_info["active"], True)
        assert_in("secure.gravatar.com", user_info["gravatar_url"])
        assert_equal(user_info["profile_url"], self.profile)
Esempio n. 10
0
    def test_add_contributor_json_with_job(self):
        # Test user with only employment information
        self.user.jobs = self.jobs
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info['fullname'], self.fullname)
        assert_equal(user_info['email'], self.username)
        assert_equal(user_info['id'], self.user_id)
        assert_equal(user_info['employment'], self.user.jobs[0]['institution'])
        assert_equal(user_info['education'], None)
        assert_equal(user_info['n_projects_in_common'], 0)
        assert_equal(user_info['registered'], True)
        assert_equal(user_info['active'], True)
        assert_in('secure.gravatar.com', user_info['gravatar_url'])
        assert_equal(user_info['profile_url'], self.profile)
Esempio n. 11
0
    def test_add_contributor_json_with_job(self):
        # Test user with only employment information
        self.user.jobs = self.jobs
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info['fullname'], self.fullname)
        assert_equal(user_info['email'], self.username)
        assert_equal(user_info['id'], self.user_id)
        assert_equal(user_info['employment'], self.user.jobs[0]['institution'])
        assert_equal(user_info['education'], None)
        assert_equal(user_info['n_projects_in_common'], 0)
        assert_equal(user_info['registered'], True)
        assert_equal(user_info['active'], True)
        assert_in('secure.gravatar.com', user_info['gravatar_url'])
        assert_equal(user_info['profile_url'], self.profile)
Esempio n. 12
0
def get_contributors_from_parent(auth, node, **kwargs):

    parent = node.parent_node

    if not parent:
        raise HTTPError(http.BAD_REQUEST)

    if not node.can_view(auth):
        raise HTTPError(http.FORBIDDEN)

    contribs = [
        profile_utils.add_contributor_json(contrib)
        for contrib in parent.visible_contributors
    ]

    return {'contributors': contribs}
Esempio n. 13
0
    def test_add_contributor_json_with_job_and_edu(self):
        # User with both employment and education information
        self.user.jobs = self.jobs
        self.user.schools = self.schools
        user_info = utils.add_contributor_json(self.user)

        assert_equal(user_info['fullname'], self.fullname)
        assert_equal(user_info['email'], self.username)
        assert_equal(user_info['id'], self.user_id)
        assert_equal(user_info['employment'], self.user.jobs[0]['institution'])
        assert_equal(user_info['education'], self.user.schools[0]['institution'])
        assert_equal(user_info['n_projects_in_common'], 0)
        assert_equal(user_info['registered'], True)
        assert_equal(user_info['active'], True)
        assert_in('secure.gravatar.com', user_info['profile_image_url'])
        assert_equal(user_info['profile_url'], self.profile)
Esempio n. 14
0
def get_contributors_from_parent(auth, node, **kwargs):

    parent = node.parent_node

    if not parent:
        raise HTTPError(http_status.HTTP_400_BAD_REQUEST)

    if not node.can_view(auth):
        raise HTTPError(http_status.HTTP_403_FORBIDDEN)

    contribs = [
        profile_utils.add_contributor_json(contrib, node=node)
        for contrib in parent.contributors if contrib not in node.contributors
    ]

    return {'contributors': contribs}
Esempio n. 15
0
def get_contributors_from_parent(auth, **kwargs):

    node = kwargs['node'] or kwargs['project']
    parent = node.parent_node

    if not parent:
        raise HTTPError(http.BAD_REQUEST)

    if not node.can_view(auth):
        raise HTTPError(http.FORBIDDEN)

    contribs = [
        utils.add_contributor_json(contrib)
        for contrib in parent.visible_contributors
        if contrib._id not in node.visible_contributor_ids
    ]

    return {'contributors': contribs}
Esempio n. 16
0
def get_contributors_from_parent(auth, **kwargs):

    node = kwargs['node'] or kwargs['project']
    parent = node.parent_node

    if not parent:
        raise HTTPError(http.BAD_REQUEST)

    if not node.can_view(auth):
        raise HTTPError(http.FORBIDDEN)

    contribs = [
        utils.add_contributor_json(contrib)
        for contrib in parent.visible_contributors
        if contrib._id not in node.visible_contributor_ids
    ]

    return {'contributors': contribs}
Esempio n. 17
0
def invite_contributor_post(node, **kwargs):
    """API view for inviting an unregistered user. Performs validation, but does not actually invite the user.

    Expects JSON arguments with 'fullname' (required) and email (not required).
    """
    fullname = request.json.get('fullname').strip()
    email = request.json.get('email')
    # Validate and sanitize inputs as needed. Email will raise error if invalid.
    fullname = sanitize.strip_html(fullname)
    if email:
        email = email.lower().strip()
        try:
            validate_email(email)
        except ValidationError as e:
            return {'status': 400, 'message': e.message}, 400

    if not fullname:
        return {
            'status': 400,
            'message': 'Full name field cannot be empty'
        }, 400

    # Check if email is in the database
    user = get_user(email=email)
    if user:
        if user.is_registered:
            msg = 'User is already in database. Please go back and try your search again.'
            return {'status': 400, 'message': msg}, 400
        elif node.is_contributor(user):
            msg = 'User with this email address is already a contributor to this project.'
            return {'status': 400, 'message': msg}, 400
        elif not user.is_confirmed:
            serialized = profile_utils.serialize_unregistered(fullname, email)
        else:
            serialized = profile_utils.add_contributor_json(user)
            # use correct display name
            serialized['fullname'] = fullname
            serialized['email'] = email
    else:
        # Create a placeholder
        serialized = profile_utils.serialize_unregistered(fullname, email)
    return {'status': 'success', 'contributor': serialized}
Esempio n. 18
0
def invite_contributor_post(node, **kwargs):
    """API view for inviting an unregistered user. Performs validation, but does not actually invite the user.

    Expects JSON arguments with 'fullname' (required) and email (not required).
    """
    fullname = request.json.get('fullname').strip()
    email = request.json.get('email')
    # Validate and sanitize inputs as needed. Email will raise error if invalid.
    fullname = sanitize.strip_html(fullname)
    if email:
        email = email.lower().strip()
        try:
            validate_email(email)
        except ValidationError as e:
            return {'status': 400, 'message': e.message}, 400

    if not fullname:
        return {'status': 400, 'message': 'Full name field cannot be empty'}, 400

    # Check if email is in the database
    user = get_user(email=email)
    if user:
        if user.is_registered:
            msg = 'User is already in database. Please go back and try your search again.'
            return {'status': 400, 'message': msg}, 400
        elif node.is_contributor(user):
            msg = 'User with this email address is already a contributor to this project.'
            return {'status': 400, 'message': msg}, 400
        elif not user.is_confirmed:
            serialized = profile_utils.serialize_unregistered(fullname, email)
        else:
            serialized = profile_utils.add_contributor_json(user)
            # use correct display name
            serialized['fullname'] = fullname
            serialized['email'] = email
    else:
        # Create a placeholder
        serialized = profile_utils.serialize_unregistered(fullname, email)
    return {'status': 'success', 'contributor': serialized}