def getVars( self ): vars = wcomponents.WTemplated.getVars( self ) minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() vars["title"] = minfo.getTitle() vars["organisation"] = minfo.getOrganisation() vars['supportEmail'] = Config.getInstance().getSupportEmail() vars['publicSupportEmail'] = Config.getInstance().getPublicSupportEmail() vars['noReplyEmail'] = Config.getInstance().getNoReplyEmail() vars["lang"] = minfo.getLang() vars["address"] = "" if minfo.getCity() != "": vars["address"] = minfo.getCity() if minfo.getCountry() != "": if vars["address"] != "": vars["address"] = "%s (%s)"%(vars["address"], minfo.getCountry()) else: vars["address"] = "%s"%minfo.getCountry() vars["timezone"] = Config.getInstance().getDefaultTimezone() vars["systemIconAdmins"] = Config.getInstance().getSystemIconURL( "admin" ) iconDisabled = str(Config.getInstance().getSystemIconURL( "disabledSection" )) iconEnabled = str(Config.getInstance().getSystemIconURL( "enabledSection" )) url = urlHandlers.UHAdminSwitchNewsActive.getURL() icon = iconEnabled if minfo.isNewsActive() else iconDisabled vars["features"] = i18nformat("""<a href="%s"><img src="%s" border="0" style="float:left; padding-right: 5px">_("News Pages")</a>""") % (url, icon) vars["administrators"] = fossilize(sorted([u.as_avatar for u in User.find(is_admin=True, is_deleted=False)], key=methodcaller('getStraightFullName'))) return vars
def user_create(grant_admin): """Creates new user""" update_session_options(db) user_type = 'user' if not grant_admin else 'admin' while True: email = prompt_email() if email is None: return email = email.lower() if not User.find(User.all_emails.contains(email), ~User.is_deleted, ~User.is_pending).count(): break error('Email already exists') first_name = prompt("First name") last_name = prompt("Last name") affiliation = prompt("Affiliation", '') print() while True: username = prompt("Enter username").lower() if not Identity.find(provider='indico', identifier=username).count(): break error('Username already exists') password = prompt_pass() if password is None: return identity = Identity(provider='indico', identifier=username, password=password) user = create_user(email, {'first_name': to_unicode(first_name), 'last_name': to_unicode(last_name), 'affiliation': to_unicode(affiliation)}, identity) user.is_admin = grant_admin print_user_info(user) if prompt_bool(cformat("%{yellow}Create the new {}?").format(user_type), default=True): db.session.add(user) db.session.commit() success("New {} created successfully with ID: {}".format(user_type, user.id))
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 user_create(grant_admin): """Creates new user""" user_type = 'user' if not grant_admin else 'admin' while True: email = prompt_email() if email is None: return email = email.lower() if not User.find(User.all_emails.contains(email), ~User.is_deleted, ~User.is_pending).count(): break print(cformat('%{red}Email already exists')) first_name = click.prompt("First name").strip() last_name = click.prompt("Last name").strip() affiliation = click.prompt("Affiliation", '').strip() print() while True: username = click.prompt("Enter username").lower().strip() if not Identity.find(provider='indico', identifier=username).count(): break print(cformat('%{red}Username already exists')) password = prompt_pass() if password is None: return identity = Identity(provider='indico', identifier=username, password=password) user = create_user(email, {'first_name': to_unicode(first_name), 'last_name': to_unicode(last_name), 'affiliation': to_unicode(affiliation)}, identity) user.is_admin = grant_admin _print_user_info(user) if click.confirm(cformat("%{yellow}Create the new {}?").format(user_type), default=True): db.session.add(user) db.session.commit() print(cformat("%{green}New {} created successfully with ID: %{green!}{}").format(user_type, user.id))
def getVars(self): wvars = wcomponents.WTemplated.getVars(self) minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() wvars['title'] = minfo.getTitle() wvars['organisation'] = minfo.getOrganisation() wvars['supportEmail'] = Config.getInstance().getSupportEmail() wvars['publicSupportEmail'] = Config.getInstance().getPublicSupportEmail() wvars['noReplyEmail'] = Config.getInstance().getNoReplyEmail() wvars['lang'] = minfo.getLang() wvars['address'] = '' if minfo.getCity() != '': wvars['address'] = minfo.getCity() if minfo.getCountry() != '': if wvars['address'] != '': wvars['address'] = '{0} ({1})'.format(wvars['address'], minfo.getCountry()) else: wvars['address'] = minfo.getCountry() wvars['timezone'] = Config.getInstance().getDefaultTimezone() wvars['systemIconAdmins'] = Config.getInstance().getSystemIconURL('admin') iconDisabled = str(Config.getInstance().getSystemIconURL('disabledSection')) iconEnabled = str(Config.getInstance().getSystemIconURL('enabledSection')) url = urlHandlers.UHAdminSwitchNewsActive.getURL() icon = iconEnabled if minfo.isNewsActive() else iconDisabled wvars['features'] = i18nformat('<a href="{}"><img src="{}" border="0"' 'style="float:left; padding-right: 5px">_("News Pages")</a>').format(url, icon) wvars['administrators'] = fossilize(sorted([u.as_avatar for u in User.find(is_admin=True, is_deleted=False)], key=methodcaller('getStraightFullName'))) wvars['tracker_url'] = urljoin(Config.getInstance().getTrackerURL(), 'api/instance/{}'.format(cephalopod_settings.get('uuid'))) wvars['cephalopod_data'] = {'enabled': cephalopod_settings.get('joined'), 'contact': cephalopod_settings.get('contact_name'), 'email': cephalopod_settings.get('contact_email'), 'url': Config.getInstance().getBaseURL(), 'organisation': minfo.getOrganisation()} return wvars
def getVars(self): wvars = wcomponents.WTemplated.getVars(self) minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() wvars['title'] = minfo.getTitle() wvars['organisation'] = minfo.getOrganisation() wvars['supportEmail'] = Config.getInstance().getSupportEmail() wvars['publicSupportEmail'] = Config.getInstance().getPublicSupportEmail() wvars['noReplyEmail'] = Config.getInstance().getNoReplyEmail() wvars['lang'] = Config.getInstance().getDefaultLocale() wvars['address'] = '' if minfo.getCity() != '': wvars['address'] = minfo.getCity() if minfo.getCountry() != '': if wvars['address'] != '': wvars['address'] = '{0} ({1})'.format(wvars['address'], minfo.getCountry()) else: wvars['address'] = minfo.getCountry() wvars['timezone'] = Config.getInstance().getDefaultTimezone() wvars['systemIconAdmins'] = Config.getInstance().getSystemIconURL('admin') wvars['administrators'] = fossilize(sorted([u.as_avatar for u in User.find(is_admin=True, is_deleted=False)], key=methodcaller('getStraightFullName'))) wvars['tracker_url'] = urljoin(Config.getInstance().getTrackerURL(), 'api/instance/{}'.format(cephalopod_settings.get('uuid'))) wvars['cephalopod_data'] = {'enabled': cephalopod_settings.get('joined'), 'contact': cephalopod_settings.get('contact_name'), 'email': cephalopod_settings.get('contact_email'), 'url': Config.getInstance().getBaseURL(), 'organisation': minfo.getOrganisation()} return wvars
def _getAnswer(self): for fossil in self._userList: user = User.get(int(fossil['id'])) if user is not None: user.is_admin = True admins = User.find(is_admin=True, is_deleted=False).order_by(User.first_name, User.last_name).all() return fossilize([u.as_avatar for u in admins])
def create(grant_admin): """Creates a new user""" user_type = 'user' if not grant_admin else 'admin' while True: email = prompt_email() if email is None: return email = email.lower() if not User.find(User.all_emails.contains(email), ~User.is_deleted, ~User.is_pending).count(): break print(cformat('%{red}Email already exists')) first_name = click.prompt("First name").strip() last_name = click.prompt("Last name").strip() affiliation = click.prompt("Affiliation", '').strip() print() while True: username = click.prompt("Enter username").lower().strip() if not Identity.find(provider='indico', identifier=username).count(): break print(cformat('%{red}Username already exists')) password = prompt_pass() if password is None: return identity = Identity(provider='indico', identifier=username, password=password) user = create_user(email, {'first_name': to_unicode(first_name), 'last_name': to_unicode(last_name), 'affiliation': to_unicode(affiliation)}, identity) user.is_admin = grant_admin _print_user_info(user) if click.confirm(cformat("%{yellow}Create the new {}?").format(user_type), default=True): db.session.add(user) db.session.commit() print(cformat("%{green}New {} created successfully with ID: %{green!}{}").format(user_type, user.id))
def _getAnswer(self): user = User.get(self._userId) if user is not None: user.is_admin = False admins = User.find(is_admin=True, is_deleted=False).order_by(User.first_name, User.last_name).all() return fossilize([u.as_avatar for u in admins])
def migrate_favorite_users(self): print cformat('%{white!}migrating favorite users') for avatars in grouper(self._iter_avatars_with_favorite_users(), 2500, skip_missing=True): avatars = list(avatars) users = {u.id: u for u in User.find(User.id.in_(int(a.id) for a, _ in avatars))} for avatar, user_ids in committing_iterator(avatars, 1000): user = users.get(int(avatar.id)) if user is None: print cformat('%{red!}!!!%{reset} ' '%{yellow!}User {} does not exist').format(avatar.id) continue print cformat('%{green}+++%{reset} ' '%{white!}{:6d}%{reset} %{cyan}{}%{reset}').format(user.id, user.full_name) valid_users = {u.id: u for u in User.find(User.id.in_(user_ids))} for user_id in user_ids: target = valid_users.get(user_id) if target is None: print cformat('%{yellow!}!!!%{reset} ' '%{yellow!}User {} does not exist').format(user_id) continue user.favorite_users.add(target) print cformat('%{blue!}<->%{reset} ' '%{white!}{:6d}%{reset} %{cyan}{}%{reset}').format(target.id, target.full_name)
def migrate_links(self): print cformat('%{white!}migrating links') for avatars in grouper(self._iter_avatars(), 2500, skip_missing=True): avatars = {int(a.id): a for a in avatars} users = ((u, avatars[u.id]) for u in User.find(User.id.in_(avatars))) for user, avatar in committing_iterator( self.flushing_iterator(users, 250), 2500): registrants = set() user_shown = False for type_, entries in avatar.linkedTo.iteritems(): # store registrant roles, in order to avoid duplication below for role, objects in entries.iteritems(): if (type_ == 'category' and role == 'favorite') or type_ == 'group': continue if not objects: continue if type_ == 'registration' and role == 'registrant': registrants |= set(objects) if not user_shown: print cformat( '%{green}+++%{reset} ' '%{white!}{:6d}%{reset} %{cyan}{}%{reset}' ).format(user.id, user.full_name) user_shown = True print cformat( '%{blue!}<->%{reset} ' '%{yellow!}{:4d}%{reset}x %{green!}{:12} %{cyan!}{}%{reset}' ).format(len(objects), type_, role) for obj in objects: try: UserLink.create_link(user, obj, role, type_) except Exception as e: print cformat( '%{red!}!!!%{reset} ' '%{red!}linking failed%{reset} (%{yellow!}{}%{reset}): ' '{}').format(unicode(e), obj) # add old "registrant" entries to registration/registrant for reg in getattr(avatar, 'registrants', {}).itervalues(): if reg.getConference().getOwner( ) and reg not in registrants: UserLink.create_link(user, reg, 'registrant', 'registration') print cformat( '%{cyan!}<->%{reset} ' '%{yellow!} 1%{reset}x %{green!}{:12} %{cyan!}{}%{reset}' ).format('registration', 'registrant')
def getVars(self): wvars = wcomponents.WTemplated.getVars(self) minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() wvars['title'] = minfo.getTitle() wvars['organisation'] = minfo.getOrganisation() wvars['supportEmail'] = Config.getInstance().getSupportEmail() wvars['publicSupportEmail'] = Config.getInstance( ).getPublicSupportEmail() wvars['noReplyEmail'] = Config.getInstance().getNoReplyEmail() wvars['lang'] = minfo.getLang() wvars['address'] = '' if minfo.getCity() != '': wvars['address'] = minfo.getCity() if minfo.getCountry() != '': if wvars['address'] != '': wvars['address'] = '{0} ({1})'.format(wvars['address'], minfo.getCountry()) else: wvars['address'] = minfo.getCountry() wvars['timezone'] = Config.getInstance().getDefaultTimezone() wvars['systemIconAdmins'] = Config.getInstance().getSystemIconURL( 'admin') iconDisabled = str( Config.getInstance().getSystemIconURL('disabledSection')) iconEnabled = str( Config.getInstance().getSystemIconURL('enabledSection')) url = urlHandlers.UHAdminSwitchNewsActive.getURL() icon = iconEnabled if minfo.isNewsActive() else iconDisabled wvars['features'] = i18nformat( '<a href="{}"><img src="{}" border="0"' 'style="float:left; padding-right: 5px">_("News Pages")</a>' ).format(url, icon) wvars['administrators'] = fossilize( sorted([ u.as_avatar for u in User.find(is_admin=True, is_deleted=False) ], key=methodcaller('getStraightFullName'))) wvars['tracker_url'] = urljoin( Config.getInstance().getTrackerURL(), 'api/instance/{}'.format(cephalopod_settings.get('uuid'))) wvars['cephalopod_data'] = { 'enabled': cephalopod_settings.get('joined'), 'contact': cephalopod_settings.get('contact_name'), 'email': cephalopod_settings.get('contact_email'), 'url': Config.getInstance().getBaseURL(), 'organisation': minfo.getOrganisation() } return wvars
def migrate_favorite_users(self): users = {u.id: u for u in User.find(User.id.in_(set(self.favorite_avatars)))} for user_id, avatars in self.favorite_avatars.viewitems(): user = users[user_id] self.print_success('%[white!]{:6d}%[reset] %[cyan]{}%[reset]'.format(user_id, user.full_name)) for avatar_id in avatars: fav_user = self.global_ns.avatar_merged_user.get(avatar_id) if not fav_user: self.print_warning('User not found: {} (in {})'.format(avatar_id, user_id)) continue user.favorite_users.add(fav_user) self.print_info(u'%[blue!]F%[reset] %[white!]{:6d}%[reset] %[cyan]{}%[reset]' .format(fav_user.id, fav_user.full_name)) # add the user to his/her own favorites user.favorite_users.add(user) db.session.flush()
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.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)
def migrate_links(self): print cformat('%{white!}migrating links') for avatars in grouper(self._iter_avatars(), 2500, skip_missing=True): avatars = {int(a.id): a for a in avatars} users = ((u, avatars[u.id]) for u in User.find(User.id.in_(avatars))) for user, avatar in committing_iterator(self.flushing_iterator(users, 250), 2500): registrants = set() user_shown = False for type_, entries in avatar.linkedTo.iteritems(): # store registrant roles, in order to avoid duplication below for role, objects in entries.iteritems(): if (type_ == 'category' and role == 'favorite') or type_ == 'group': continue if not objects: continue if type_ == 'registration' and role == 'registrant': registrants |= set(objects) if not user_shown: print cformat('%{green}+++%{reset} ' '%{white!}{:6d}%{reset} %{cyan}{}%{reset}').format(user.id, user.full_name) user_shown = True print cformat('%{blue!}<->%{reset} ' '%{yellow!}{:4d}%{reset}x %{green!}{:12} %{cyan!}{}%{reset}').format( len(objects), type_, role) for obj in objects: try: UserLink.create_link(user, obj, role, type_) except Exception as e: print cformat('%{red!}!!!%{reset} ' '%{red!}linking failed%{reset} (%{yellow!}{}%{reset}): ' '{}').format(unicode(e), obj) # add old "registrant" entries to registration/registrant for reg in getattr(avatar, 'registrants', {}).itervalues(): if reg.getConference().getOwner() and reg not in registrants: UserLink.create_link(user, reg, 'registrant', 'registration') print cformat('%{cyan!}<->%{reset} ' '%{yellow!} 1%{reset}x %{green!}{:12} %{cyan!}{}%{reset}').format( 'registration', 'registrant')
def getVars(self): vars = wcomponents.WTemplated.getVars(self) minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() vars["title"] = minfo.getTitle() vars["organisation"] = minfo.getOrganisation() vars['supportEmail'] = Config.getInstance().getSupportEmail() vars['publicSupportEmail'] = Config.getInstance( ).getPublicSupportEmail() vars['noReplyEmail'] = Config.getInstance().getNoReplyEmail() vars["lang"] = minfo.getLang() vars["address"] = "" if minfo.getCity() != "": vars["address"] = minfo.getCity() if minfo.getCountry() != "": if vars["address"] != "": vars["address"] = "%s (%s)" % (vars["address"], minfo.getCountry()) else: vars["address"] = "%s" % minfo.getCountry() try: vars["timezone"] = minfo.getTimezone() except: vars["timezone"] = 'UTC' vars["systemIconAdmins"] = Config.getInstance().getSystemIconURL( "admin") iconDisabled = str( Config.getInstance().getSystemIconURL("disabledSection")) iconEnabled = str( Config.getInstance().getSystemIconURL("enabledSection")) url = urlHandlers.UHAdminSwitchNewsActive.getURL() icon = iconEnabled if minfo.isNewsActive() else iconDisabled vars["features"] = i18nformat( """<a href="%s"><img src="%s" border="0" style="float:left; padding-right: 5px">_("News Pages")</a>""" ) % (url, icon) vars["administrators"] = fossilize( [u.as_avatar for u in User.find(is_admin=True)]) return vars
def get_admin_emails(): """Get the email addresses of all Indico admins""" return {u.email for u in User.find(is_admin=True, is_deleted=False)}
def _getAnswer(self): for fossil in self._userList: user = User.get(int(fossil['id'])) if user is not None: user.is_admin = True return fossilize([u.as_avatar for u in User.find(is_admin=True)])
def _count_users(): return User.find(is_deleted=False, is_pending=False).count()
def has_data(self): return bool(User.find().count())
def _getAnswer(self): user = User.get(self._userId) if user is not None: user.is_admin = False return fossilize([u.as_avatar for u in User.find(is_admin=True)])
def _count_users(self): return User.find(is_deleted=False, is_pending=False).count()