Esempio n. 1
0
    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)
Esempio n. 2
0
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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 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)
Esempio n. 5
0
    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]
Esempio n. 6
0
    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)
Esempio n. 7
0
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]
Esempio n. 8
0
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]
Esempio n. 9
0
    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)