def _process(self): form = SearchForm(obj=FormDefaults(exact=True)) form_data = form.data search_results = None num_of_users = User.query.count() num_deleted_users = User.find(is_deleted=True).count() if form.validate_on_submit(): search_results = [] exact = form_data.pop('exact') include_deleted = form_data.pop('include_deleted') include_pending = form_data.pop('include_pending') external = form_data.pop('external') form_data = {k: v for (k, v) in form_data.iteritems() if v and v.strip()} matches = search_users(exact=exact, include_deleted=include_deleted, include_pending=include_pending, external=external, **form_data) for entry in matches: if isinstance(entry, User): search_results.append(UserEntry( profile_url=url_for('.user_profile', entry), **{k: getattr(entry, k) for k in IDENTITY_ATTRIBUTES} )) else: search_results.append(UserEntry( profile_url=None, full_name="{first_name} {last_name}".format(**entry.data.to_dict()), **{k: entry.data.get(k) for k in (IDENTITY_ATTRIBUTES - {'full_name'})} )) search_results.sort(key=attrgetter('first_name', 'last_name')) num_reg_requests = RegistrationRequest.query.count() return WPUsersAdmin.render_template('users_admin.html', form=form, search_results=search_results, num_of_users=num_of_users, num_deleted_users=num_deleted_users, num_reg_requests=num_reg_requests)
def search(substring, include_deleted, include_pending, include_external, include_system, **criteria): """Searches users matching some criteria""" assert set(criteria.viewkeys()) == {'first_name', 'last_name', 'email', 'affiliation'} criteria = {k: v for k, v in criteria.viewitems() if v is not None} res = search_users(exact=(not substring), include_deleted=include_deleted, include_pending=include_pending, external=include_external, allow_system_user=include_system, **criteria) if not res: print(cformat('%{yellow}No results found')) return elif len(res) > 100: click.confirm('{} results found. Show them anyway?'.format(len(res)), abort=True) users = sorted((u for u in res if isinstance(u, User)), key=lambda x: (x.first_name.lower(), x.last_name.lower(), x.email)) externals = sorted((ii for ii in res if isinstance(ii, IdentityInfo)), key=lambda x: (_safe_lower(x.data.get('first_name')), _safe_lower(x.data.get('last_name')), _safe_lower(x.data['email']))) if users: table_data = [['ID', 'First Name', 'Last Name', 'Email', 'Affiliation']] for user in users: table_data.append([unicode(user.id), user.first_name, user.last_name, user.email, user.affiliation]) table = AsciiTable(table_data, cformat('%{white!}Users%{reset}')) table.justify_columns[0] = 'right' print(table.table) if externals: if users: print() table_data = [['First Name', 'Last Name', 'Email', 'Affiliation', 'Source', 'Identifier']] for ii in externals: data = ii.data table_data.append([data.get('first_name', ''), data.get('last_name', ''), data['email'], data.get('affiliation', '-'), ii.provider.name, ii.identifier]) table = AsciiTable(table_data, cformat('%{white!}Externals%{reset}')) print(table.table)
def _process(self, exact, external, favorites_first, **criteria): matches = search_users(exact=exact, include_pending=True, external=external, **criteria) self.externals = {} results = sorted((self._serialize_entry(entry) for entry in matches), key=itemgetter('full_name')) if favorites_first: favorites = {u.id for u in session.user.favorite_users} results.sort(key=lambda x: x['id'] not in favorites) total = len(results) results = results[:10] self._process_pending_users(results) return jsonify(users=results, total=total)
def match(self, criteria, exact=False, onlyActivated=True, searchInAuthenticators=False): from indico.modules.users.util import search_users cache = GenericCache('pending_identities') def _process_identities(obj): if isinstance(obj, IdentityInfo): cache.set(obj.provider.name + ":" + obj.identifier, obj.data) return AvatarProvisionalWrapper(obj) else: return obj.as_avatar results = search_users(exact=exact, include_pending=not onlyActivated, include_deleted=not onlyActivated, external=searchInAuthenticators, **{AVATAR_FIELD_MAP[k]: v for (k, v) in criteria.iteritems() if v}) return [_process_identities(obj) for obj in results]
def _process(self): form = SearchForm(obj=FormDefaults(exact=True)) form_data = form.data search_results = None num_of_users = User.query.count() num_deleted_users = User.find(is_deleted=True).count() if form.validate_on_submit(): search_results = [] exact = form_data.pop('exact') include_deleted = form_data.pop('include_deleted') include_pending = form_data.pop('include_pending') external = form_data.pop('external') form_data = { k: v for (k, v) in form_data.iteritems() if v and v.strip() } for entry in search_users(exact=exact, include_deleted=include_deleted, include_pending=include_pending, external=external, **form_data): if isinstance(entry, User): search_results.append( UserEntry(profile_url=url_for('.user_profile', entry), **{ k: getattr(entry, k) for k in IDENTITY_ATTRIBUTES })) else: search_results.append( UserEntry(profile_url=None, full_name="{first_name} {last_name}".format( **entry.data.to_dict()), **{ k: entry.data.get(k) for k in (IDENTITY_ATTRIBUTES - {'full_name'}) })) search_results.sort(key=attrgetter('first_name', 'last_name')) return WPUsersAdmin.render_template( 'users_admin.html', form=form, search_results=search_results, num_of_users=num_of_users, num_deleted_users=num_deleted_users)
def search_avatars(criteria, exact=False, search_externals=False): from indico.modules.users.util import search_users if not any(criteria.viewvalues()): return [] def _process_identities(obj): if isinstance(obj, IdentityInfo): GenericCache('pending_identities').set('{}:{}'.format(obj.provider.name, obj.identifier), obj.data) return AvatarProvisionalWrapper(obj) else: return obj.as_avatar results = search_users(exact=exact, external=search_externals, **{AVATAR_FIELD_MAP[k]: v for (k, v) in criteria.iteritems() if v}) return [_process_identities(obj) for obj in results]
def _process(self): form = SearchForm(obj=FormDefaults(exact=True)) form_data = form.data search_results = None num_of_users = User.query.count() num_deleted_users = User.query.filter_by(is_deleted=True).count() if form.validate_on_submit(): search_results = [] exact = form_data.pop('exact') include_deleted = form_data.pop('include_deleted') include_pending = form_data.pop('include_pending') external = form_data.pop('external') form_data = {k: v for (k, v) in form_data.items() if v and v.strip()} matches = search_users(exact=exact, include_deleted=include_deleted, include_pending=include_pending, include_blocked=True, external=external, allow_system_user=True, **form_data) for entry in matches: if isinstance(entry, User): search_results.append(UserEntry( avatar_url=entry.avatar_url, profile_url=url_for('.user_profile', entry), user=entry, **{k: getattr(entry, k) for k in IDENTITY_ATTRIBUTES} )) else: if not entry.data['first_name'] and not entry.data['last_name']: full_name = '<no name>' initial = '?' else: full_name = f'{entry.data["first_name"]} {entry.data["last_name"]}'.strip() initial = full_name[0] search_results.append(UserEntry( avatar_url=url_for('assets.avatar', name=initial), profile_url=None, user=None, full_name=full_name, **{k: entry.data.get(k) for k in (IDENTITY_ATTRIBUTES - {'full_name'})} )) search_results.sort(key=attrgetter('full_name')) num_reg_requests = RegistrationRequest.query.count() return WPUsersAdmin.render_template('users_admin.html', 'users', form=form, search_results=search_results, num_of_users=num_of_users, num_deleted_users=num_deleted_users, num_reg_requests=num_reg_requests)