Projet

Général

Profil

0005-forms-add-ou-selector-to-login-form-30252.patch

Benjamin Dauvergne, 14 février 2019 12:19

Télécharger (3,92 ko)

Voir les différences:

Subject: [PATCH 5/6] forms: add ou selector to login form (#30252)

 src/authentic2/app_settings.py   |  2 ++
 src/authentic2/forms/__init__.py | 12 ++++++++++++
 tests/test_login.py              | 15 +++++++++++++++
 3 files changed, 29 insertions(+)
src/authentic2/app_settings.py
137 137
                              ' form'),
138 138
    A2_USERNAME_HELP_TEXT=Setting(default=None, definition='Help text to explain validation rules of usernames'),
139 139
    A2_USERNAME_IS_UNIQUE=Setting(default=True, definition='Check username uniqueness'),
140
    A2_LOGIN_FORM_OU_SELECTOR=Setting(default=False, definition='Whether to add an OU selector to the login form'),
141
    A2_LOGIN_FORM_OU_SELECTOR_LABEL=Setting(default=None, definition='Label of OU field on login page'),
140 142
    A2_REGISTRATION_USERNAME_IS_UNIQUE=Setting(default=True, definition='Check username uniqueness on registration'),
141 143
    IDP_BACKENDS=(),
142 144
    AUTH_FRONTENDS=(),
src/authentic2/forms/__init__.py
22 22
from django.contrib.auth import REDIRECT_FIELD_NAME, forms as auth_forms
23 23
from django.utils import html
24 24

  
25
from django_rbac.utils import get_ou_model
26

  
27
from authentic2.utils import lazy_label
25 28
from authentic2.compat import get_user_model
26 29
from authentic2.forms.fields import PasswordField
27 30

  
28 31
from .. import app_settings
29 32
from ..exponential_retry_timeout import ExponentialRetryTimeout
30 33

  
34
OU = get_ou_model()
35

  
31 36

  
32 37
class EmailChangeFormNoPassword(forms.Form):
33 38
    email = forms.EmailField(label=_('New email'))
......
181 186
        required=False,
182 187
        label=_('Remember me'),
183 188
        help_text=_('Do not ask for authentication next time'))
189
    ou = forms.ModelChoiceField(
190
        label=lazy_label(_('Organizational unit'), lambda: app_settings.A2_LOGIN_FORM_OU_SELECTOR_LABEL),
191
        required=True,
192
        queryset=OU.objects.all())
184 193

  
185 194
    def __init__(self, *args, **kwargs):
186 195
        super(AuthenticationForm, self).__init__(*args, **kwargs)
......
192 201
        if not app_settings.A2_USER_REMEMBER_ME:
193 202
            del self.fields['remember_me']
194 203

  
204
        if not app_settings.A2_LOGIN_FORM_OU_SELECTOR:
205
            del self.fields['ou']
206

  
195 207
        if self.request:
196 208
            self.remote_addr = self.request.META['REMOTE_ADDR']
197 209
        else:
tests/test_login.py
133 133
    freezer.move_to('2018-01-31')
134 134
    response = app.get('/')
135 135
    assert simple_user.first_name not in response
136

  
137

  
138
def test_ou_selector(app, settings, simple_user):
139
    settings.A2_LOGIN_FORM_OU_SELECTOR = True
140
    response = app.get('/login/')
141
    # Check selector is here and there are no errors
142
    assert not response.pyquery('.errorlist')
143
    assert response.pyquery.find('select#id_ou')
144
    assert (set([elt.text for elt in response.pyquery.find('select#id_ou option')])
145
            == set([u'Default organizational unit', u'OU1', u'---------']))
146
    # Check selector is required
147
    response.form.set('username', simple_user.username)
148
    response.form.set('password', simple_user.username)
149
    response = response.form.submit(name='login-password-submit')
150
    assert response.pyquery('.errorlist')
136
-