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}
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}
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}
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}
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}
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)
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)
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)
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)
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}
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)
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}
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}
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}
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}