Hi,
we are developing an Indico plugin for automatic group assignmed for SSO logins based on this idea which should be generic, e.g. allow to configure the identity provider it is acting on and the domain / realm it is filtering for (so it can be re-used by others, and maybe also upstreamed). It’ll include full coverage by tests and optional automatic cleanup of old group assignments (e.g. in case users change their organisation and use a different EduGain IdP to log in).
The plugin is mostly ready, but I have a problem populating a SelectField with the multipass.identity_providers list. Here’s what I’m doing right now:
class SettingsForm(IndicoForm):
identity_provider = SelectField(_('Provider'), [InputRequired()],
description=_('The identity provider accounts need to be '
'associated with to be added to the group.'))
class SSOGroupMappingPlugin(IndicoPlugin):
...
def init(self):
identity_providers = multipass.identity_providers.values()
if not identity_providers:
del self.settings_form.identity_provider
idp_choices = [(p.name, p.title) for p in sorted(identity_providers, key=attrgetter('title'))]
self.settings_form.identity_provider.choices = idp_choices
super().init()
(you can find the full code here)
I have a pytest which confirms the choices variable is filled with the expected tuple:
Running this in an actual installation and adding a print statement confirms that the list of tuples is populated correctly in init.
However, when actually installing the plugin in a real instance and then entering plugin configuration, the SelectField remains empty.
Am I missing something in terms of execution order? Is there a different way to dynamically populate a SelectField?
Thanks in advance and cheers,
Oliver