/profile/ : gestion des attributs multivalués (#86672) #109

Open
pmarillonnet wants to merge 3 commits from wip/86672-profile-multivalued-attributes into main
7 changed files with 55 additions and 2 deletions

View File

@ -83,6 +83,7 @@ class Command(hobo_deploy.Command):
'user_visible',
'required',
'searchable',
'multiple',
'disabled',
'required_on_login',
):

View File

@ -46,6 +46,7 @@ class AttributeDefinitionCreateForm(forms.ModelForm):
'label',
'name',
'description',
'kind',
'required',
'required_on_login',
'asked_on_registration',
@ -53,7 +54,7 @@ class AttributeDefinitionCreateForm(forms.ModelForm):
'user_visible',
'searchable',
'disabled',
'kind',
'multiple',
]
@ -61,6 +62,10 @@ class AttributeDefinitionUpdateForm(AttributeDefinitionCreateForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
authn_info = utils.get_authn_information_from_idp()
self.fields['multiple'].disabled = True
self.fields['multiple'].help_text = _(
'The "multiple" flag can only be set at attribute creation time.'
)
if self.instance.name == 'email' and authn_info.get('accept_email_authentication', False):
self.fields['disabled'].disabled = True
self.fields['disabled'].help_text = _(

View File

@ -0,0 +1,17 @@
# Generated by Django 3.2.18 on 2024-02-07 13:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('profile', '0005_auto_20210727_1633'),
]
operations = [
migrations.AddField(
model_name='attributedefinition',
name='multiple',
field=models.BooleanField(blank=True, default=False, verbose_name='multiple'),
),
]

View File

@ -60,6 +60,7 @@ class AttributeDefinition(models.Model):
('language', _('Language')),
),
)
multiple = models.BooleanField(verbose_name=_('multiple'), blank=True, default=False)
disabled = models.BooleanField(verbose_name=_('disabled'), default=False)
order = models.PositiveIntegerField()
last_update_timestamp = models.DateTimeField(auto_now=True)

View File

@ -70,15 +70,21 @@ def test_add_attribute(logged_app, admin_user, kind):
page.form['label'] = 'test'
page.form['name'] = 'test'
page.form['description'] = 'test'
page.form['kind'] = kind
page.form['required'] = True
page.form['required_on_login'] = True
page.form['asked_on_registration'] = False
page.form['user_editable'] = False
page.form['user_visible'] = False
page.form['disabled'] = False
page.form['kind'] = kind
page.form['multiple'] = True
page.form.submit()
assert models.AttributeDefinition.objects.filter(kind=kind).filter(name='test').count() == 1
assert models.AttributeDefinition.objects.get(name='test').multiple is True
page = app.get('/profile/test/options', status=200)
assert 'disabled' in page.pyquery('#id_multiple')[0].keys()
assert 'The "multiple" flag can only be set at attribute creation time.' in page.text
def test_edit_user_full_name_template(logged_app, admin_user, settings):

View File

@ -154,6 +154,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'title',
'multiple': False,
},
{
'kind': 'string',
@ -165,6 +166,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': True,
'name': 'first_name',
'multiple': False,
},
{
'kind': 'string',
@ -176,6 +178,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': True,
'name': 'last_name',
'multiple': False,
},
{
'kind': 'email',
@ -187,6 +190,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'email',
'multiple': False,
},
{
'kind': 'string',
@ -198,6 +202,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'address',
'multiple': False,
},
{
'kind': 'string',
@ -209,6 +214,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'zipcode',
'multiple': False,
},
{
'kind': 'string',
@ -220,6 +226,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'city',
'multiple': False,
},
{
'kind': 'phone_number',
@ -231,6 +238,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'phone',
'multiple': False,
},
{
'kind': 'fr_phone_number',
@ -242,6 +250,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'fr_phone',
'multiple': False,
},
{
'kind': 'string',
@ -253,6 +262,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'country',
'multiple': True,
},
{
'kind': 'birthdate',
@ -264,6 +274,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'user_editable': True,
'asked_on_registration': False,
'name': 'birthdate',
'multiple': False,
},
{
'kind': 'boolean',
@ -276,6 +287,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
'asked_on_registration': True,
'required_on_login': True,
'name': 'cgu',
'multiple': False,
},
]
},
@ -415,6 +427,7 @@ def test_hobo_deploy(monkeypatch, tenant_base, mocker, skeleton_dir, tmp_path):
assert at.user_visible == field['user_visible']
assert at.user_editable == field['user_editable']
assert at.required_on_login == field.get('required_on_login', False)
assert at.multiple == field['multiple']
for at in Attribute.all_objects.all():
assert [field for field in env['profile']['fields'] if field['name'] == at.name]

View File

@ -11,6 +11,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -24,6 +25,7 @@
"required": true,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -37,6 +39,7 @@
"required": true,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -50,6 +53,7 @@
"required": true,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -63,6 +67,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -76,6 +81,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -89,6 +95,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -102,6 +109,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -115,6 +123,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
},
@ -128,6 +137,7 @@
"required": false,
"required_on_login": false,
"searchable": false,
"multiple": false,
"user_editable": true,
"user_visible": true
}