def serialize_unregistered(fullname, email): """Serializes an unregistered user.""" user = auth.get_user(email=email) if user is None: serialized = { 'fullname': fullname, 'id': None, 'registered': False, 'active': False, 'profile_image_url': profile_image_url(settings.PROFILE_IMAGE_PROVIDER, email, use_ssl=True, size=settings.PROFILE_IMAGE_MEDIUM), 'email': email, } else: serialized = add_contributor_json(user) serialized['fullname'] = fullname serialized['email'] = email return serialized
def test_serialize_user_full(self): user = UserFactory() project = ProjectFactory(creator=user, is_public=False) NodeFactory(creator=user) ProjectFactory(creator=user, is_public=True) CollectionFactory(creator=user) RegistrationFactory(project=project) d = utils.serialize_user(user, full=True, include_node_counts=True) profile_image_url = filters.profile_image_url( settings.PROFILE_IMAGE_PROVIDER, user, use_ssl=True, size=settings.PROFILE_IMAGE_LARGE) assert_equal(d['id'], user._primary_key) assert_equal(d['url'], user.url) assert_equal(d.get('username'), None) assert_equal(d['fullname'], user.fullname) assert_equal(d['registered'], user.is_registered) assert_equal(d['profile_image_url'], profile_image_url) assert_equal(d['absolute_url'], user.absolute_url) assert_equal(d['date_registered'], user.date_registered.strftime('%Y-%m-%d')) projects = [ node for node in user.contributed if node.category == 'project' and not node.is_registration and not node.is_deleted ] public_projects = [p for p in projects if p.is_public] assert_equal(d['number_projects'], len(projects)) assert_equal(d['number_public_projects'], len(public_projects))
def test_serialize_user_full(self): user = UserFactory() ProjectFactory(creator=user, is_public=False) NodeFactory(creator=user) ProjectFactory(creator=user, is_public=True) CollectionFactory(creator=user) d = utils.serialize_user(user, full=True, include_node_counts=True) profile_image_url = filters.profile_image_url(settings.PROFILE_IMAGE_PROVIDER, user, use_ssl=True, size=settings.PROFILE_IMAGE_LARGE) assert_equal(d['id'], user._primary_key) assert_equal(d['url'], user.url) assert_equal(d.get('username'), None) assert_equal(d['fullname'], user.fullname) assert_equal(d['registered'], user.is_registered) assert_equal(d['profile_image_url'], profile_image_url) assert_equal(d['absolute_url'], user.absolute_url) assert_equal(d['date_registered'], user.date_registered.strftime('%Y-%m-%d')) projects = [ node for node in user.contributed if node.category == 'project' and not node.is_registration and not node.is_deleted ] public_projects = [p for p in projects if p.is_public] assert_equal(d['number_projects'], len(projects)) assert_equal(d['number_public_projects'], len(public_projects))
def search_contributor(query, page=0, size=10, exclude=None, current_user=None): """Search for contributors to add to a project using elastic search. Request must include JSON data with a "query" field. :param query: The substring of the username to search for :param page: For pagination, the page number to use for results :param size: For pagination, the number of results per page :param exclude: A list of User objects to exclude from the search :param current_user: A User object of the current user :return: List of dictionaries, each containing the ID, full name, most recent employment and education, profile_image URL of an OSF user """ start = (page * size) items = re.split(r'[\s-]+', query) exclude = exclude or [] normalized_items = [] for item in items: try: normalized_item = six.u(item) except TypeError: normalized_item = item normalized_item = unicodedata.normalize('NFKD', normalized_item).encode( 'ascii', 'ignore') normalized_items.append(normalized_item) items = normalized_items query = ' AND '.join('{}*~'.format(re.escape(item)) for item in items) + \ ''.join(' NOT id:"{}"'.format(excluded._id) for excluded in exclude) results = search(build_query(query, start=start, size=size), index=INDEX, doc_type='user') docs = results['results'] pages = math.ceil(results['counts'].get('user', 0) / size) validate_page_num(page, pages) users = [] for doc in docs: # TODO: use utils.serialize_user user = OSFUser.load(doc['id']) if current_user and current_user._id == user._id: n_projects_in_common = -1 elif current_user: n_projects_in_common = current_user.n_projects_in_common(user) else: n_projects_in_common = 0 if user is None: logger.error('Could not load user {0}'.format(doc['id'])) continue if user.is_active: # exclude merged, unregistered, etc. current_employment = None education = None if user.jobs: current_employment = user.jobs[0]['institution'] if user.schools: education = user.schools[0]['institution'] users.append({ 'fullname': doc['user'], 'id': doc['id'], 'employment': current_employment, 'education': education, 'social': user.social_links, 'n_projects_in_common': n_projects_in_common, 'profile_image_url': profile_image_url(settings.PROFILE_IMAGE_PROVIDER, user, use_ssl=True, size=settings.PROFILE_IMAGE_MEDIUM), 'profile_url': user.profile_url, 'registered': user.is_registered, 'active': user.is_active }) return { 'users': users, 'total': results['counts']['total'], 'pages': pages, 'page': page, }
def search_contributor(query, page=0, size=10, exclude=None, current_user=None): """Search for contributors to add to a project using elastic search. Request must include JSON data with a "query" field. :param query: The substring of the username to search for :param page: For pagination, the page number to use for results :param size: For pagination, the number of results per page :param exclude: A list of User objects to exclude from the search :param current_user: A User object of the current user :return: List of dictionaries, each containing the ID, full name, most recent employment and education, profile_image URL of an OSF user """ start = (page * size) items = re.split(r'[\s-]+', query) exclude = exclude or [] normalized_items = [] for item in items: try: normalized_item = six.u(item) except TypeError: normalized_item = item normalized_item = unicodedata.normalize('NFKD', normalized_item).encode('ascii', 'ignore') normalized_items.append(normalized_item) items = normalized_items query = ' AND '.join('{}*~'.format(re.escape(item)) for item in items) + \ ''.join(' NOT id:"{}"'.format(excluded._id) for excluded in exclude) results = search(build_query(query, start=start, size=size), index=INDEX, doc_type='user') docs = results['results'] pages = math.ceil(results['counts'].get('user', 0) / size) validate_page_num(page, pages) users = [] for doc in docs: # TODO: use utils.serialize_user user = OSFUser.load(doc['id']) if current_user and current_user._id == user._id: n_projects_in_common = -1 elif current_user: n_projects_in_common = current_user.n_projects_in_common(user) else: n_projects_in_common = 0 if user is None: logger.error('Could not load user {0}'.format(doc['id'])) continue if user.is_active: # exclude merged, unregistered, etc. current_employment = None education = None if user.jobs: current_employment = user.jobs[0]['institution'] if user.schools: education = user.schools[0]['institution'] users.append({ 'fullname': doc['user'], 'id': doc['id'], 'employment': current_employment, 'education': education, 'social': user.social_links, 'n_projects_in_common': n_projects_in_common, 'profile_image_url': profile_image_url(settings.PROFILE_IMAGE_PROVIDER, user, use_ssl=True, size=settings.PROFILE_IMAGE_MEDIUM), 'profile_url': user.profile_url, 'registered': user.is_registered, 'active': user.is_active }) return { 'users': users, 'total': results['counts']['total'], 'pages': pages, 'page': page, }
def get_profile_image_url(user, size=settings.PROFILE_IMAGE_MEDIUM): return profile_image_url(settings.PROFILE_IMAGE_PROVIDER, user, use_ssl=True, size=size)