Skip to content

Commit

Permalink
Merge pull request #3168 from Uninett/refactor/uncrispify-account-for…
Browse files Browse the repository at this point in the history
…m-useradmin

Uncrispify `AccountForm` in useradmin
  • Loading branch information
johannaengland authored Nov 15, 2024
2 parents 42c7d52 + 075c26b commit 705c151
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 43 deletions.
3 changes: 1 addition & 2 deletions python/nav/web/templates/useradmin/account_detail.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{% extends "useradmin/base.html" %}
{% load crispy_forms_tags %}

{% block content %}

Expand Down Expand Up @@ -63,7 +62,7 @@ <h4>
{% comment %} ACCOUNT FORM {% endcomment %}
{% if account_form %}
<div class="column medium-6 large-3">
{% crispy account_form %}
{% include 'custom_crispy_templates/flat_form.html' with form=account_form %}
</div>
{% endif %}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{% extends "custom_crispy_templates/flat_fieldset.html" %}

{% block fieldset_fields %}
<p class='alert-box'>External authenticator: {{ account.ext_sync }}</p>
{{ block.super }}
{% endblock %}
90 changes: 51 additions & 39 deletions python/nav/web/useradmin/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 = (
"<p class='alert-box'>External authenticator: %s</p>"
% 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"""
Expand All @@ -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"""

Expand Down
9 changes: 7 additions & 2 deletions python/nav/web/useradmin/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit 705c151

Please sign in to comment.