0005-forms-add-ou-selector-to-login-form-30252.patch
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 |
- |