diff --git a/python/nav/web/templates/useradmin/account_detail.html b/python/nav/web/templates/useradmin/account_detail.html index 07a425f71e..a82ed3d587 100644 --- a/python/nav/web/templates/useradmin/account_detail.html +++ b/python/nav/web/templates/useradmin/account_detail.html @@ -1,5 +1,4 @@ {% extends "useradmin/base.html" %} -{% load crispy_forms_tags %} {% block content %} @@ -63,7 +62,7 @@

{% comment %} ACCOUNT FORM {% endcomment %} {% if account_form %}
- {% crispy account_form %} + {% include 'custom_crispy_templates/flat_form.html' with form=account_form %}
{% endif %} diff --git a/python/nav/web/templates/useradmin/frag-external-account-fieldset.html b/python/nav/web/templates/useradmin/frag-external-account-fieldset.html new file mode 100644 index 0000000000..1e9b1f82da --- /dev/null +++ b/python/nav/web/templates/useradmin/frag-external-account-fieldset.html @@ -0,0 +1,6 @@ +{% extends "custom_crispy_templates/flat_fieldset.html" %} + +{% block fieldset_fields %} +

External authenticator: {{ account.ext_sync }}

+ {{ block.super }} +{% endblock %} diff --git a/python/nav/web/useradmin/forms.py b/python/nav/web/useradmin/forms.py index 5fb31c38cc..56d0222527 100644 --- a/python/nav/web/useradmin/forms.py +++ b/python/nav/web/useradmin/forms.py @@ -21,13 +21,6 @@ from django import forms from django.utils.encoding import force_str -from crispy_forms.helper import FormHelper -from crispy_forms_foundation.layout import ( - Layout, - Fieldset, - Submit, - HTML, -) from nav.web.crispyforms import ( set_flat_form_attributes, FlatFieldset, @@ -94,44 +87,34 @@ class AccountForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(AccountForm, self).__init__(*args, **kwargs) account = kwargs.get('instance', False) - self.helper = FormHelper() - self.helper.form_action = '' - self.helper.form_method = 'POST' - - fieldset_name = 'Account' - fieldset_args = [fieldset_name] - default_args = ['login', 'name', 'password1', 'password2'] if account: self.fields['password1'].required = False - submit_value = 'Save changes' - - # This should really be two different forms because of this - if kwargs['instance'].ext_sync: - # We don't want to enable local password editing for accounts that are - # managed externally. - authenticator = ( - "

External authenticator: %s

" - % kwargs["instance"].ext_sync - ) - del self.fields['password1'] - del self.fields['password2'] - self.fields['login'].widget.attrs['readonly'] = True - fieldset_args.extend(['login', 'name', HTML(authenticator)]) - else: - fieldset_args.extend(default_args) + if kwargs["instance"].id == Account.DEFAULT_ACCOUNT: # We don't want to enable significant changes to the anonymous account - for field in ("password1", "password2", "login"): - self.fields[field].widget.attrs["readonly"] = True - else: - submit_value = 'Create account' - fieldset_args.extend(default_args) + self.fields["password1"].widget.attrs["readonly"] = True + self.fields["password2"].widget.attrs["readonly"] = True + self.fields["login"].widget.attrs["readonly"] = True - submit = Submit('submit_account', submit_value, css_class='small') - fieldset_args.extend([submit]) - fieldset = Fieldset(*fieldset_args) - self.helper.layout = Layout(fieldset) + submit_value = "Save changes" if account else "Create account" + + self.attrs = set_flat_form_attributes( + form_fields=[ + FlatFieldset( + legend="Account", + fields=[ + self["login"], + self["name"], + self["password1"], + self["password2"], + SubmitField( + "submit_account", submit_value, css_classes="small" + ), + ], + ) + ], + ) def clean_password1(self): """Validate password""" @@ -157,6 +140,35 @@ class Meta(object): exclude = ('password', 'ext_sync', 'organizations', 'preferences') +class ExternalAccountForm(AccountForm): + """Form for editing an externally managed account""" + + def __init__(self, *args, **kwargs): + super(AccountForm, self).__init__(*args, **kwargs) + + # We don't want to enable local password editing for accounts that are + # managed externally. + del self.fields['password1'] + del self.fields['password2'] + self.fields['login'].widget.attrs['readonly'] = True + + self.attrs = set_flat_form_attributes( + form_fields=[ + FlatFieldset( + legend="Account", + fields=[ + self["login"], + self["name"], + SubmitField( + "submit_account", "Save changes", css_classes="small" + ), + ], + template="useradmin/frag-external-account-fieldset.html", + ) + ], + ) + + class PrivilegeForm(forms.Form): """Form for adding a privilege to a group from the group page""" diff --git a/python/nav/web/useradmin/views.py b/python/nav/web/useradmin/views.py index bb9b63fcf7..68d62c4551 100644 --- a/python/nav/web/useradmin/views.py +++ b/python/nav/web/useradmin/views.py @@ -59,13 +59,18 @@ def account_detail(request, account_id=None): account = None old_account = copy.deepcopy(account) - account_form = forms.AccountForm(instance=account) + external_authentication = getattr(account, "ext_sync", False) + if external_authentication: + account_form_class = forms.ExternalAccountForm + else: + account_form_class = forms.AccountForm + account_form = account_form_class(instance=account) org_form = forms.OrganizationAddForm(account) group_form = forms.GroupAddForm(account) if request.method == 'POST': if 'submit_account' in request.POST: - account_form = forms.AccountForm(request.POST, instance=account) + account_form = account_form_class(request.POST, instance=account) if account_form.is_valid(): return save_account(request, account_form, old_account)