initial updates to forms, templates, and javascript

This commit is contained in:
David Kennedy 2025-01-23 16:01:32 -05:00
parent 3ca79aef90
commit 1cae575814
No known key found for this signature in database
GPG key ID: 6528A5386E66B96B
4 changed files with 89 additions and 81 deletions

View file

@ -125,38 +125,26 @@ class BasePortfolioMemberForm(forms.ModelForm):
}, },
) )
domain_request_permission_admin = forms.ChoiceField( domain_permission_member = forms.ChoiceField(
label=mark_safe(f"Select permission {required_star}"), # nosec label=mark_safe(f"Select permission {required_star}"), # nosec
choices=[ choices=[
(UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value, "View all requests"), (UserPortfolioPermissionChoices.VIEW_MANAGED_DOMAINS.value, "Viewer, limited"),
(UserPortfolioPermissionChoices.EDIT_REQUESTS.value, "View all requests plus create requests"), (UserPortfolioPermissionChoices.VIEW_ALL_DOMAINS.value, "Viewer, all"),
], ],
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=False, required=False,
error_messages={ error_messages={
"required": "Admin domain request permission is required", "required": "Member domain permission is required",
},
)
member_permission_admin = forms.ChoiceField(
label=mark_safe(f"Select permission {required_star}"), # nosec
choices=[
(UserPortfolioPermissionChoices.VIEW_MEMBERS.value, "View all members"),
(UserPortfolioPermissionChoices.EDIT_MEMBERS.value, "View all members plus manage members"),
],
widget=forms.RadioSelect,
required=False,
error_messages={
"required": "Admin member permission is required",
}, },
) )
domain_request_permission_member = forms.ChoiceField( domain_request_permission_member = forms.ChoiceField(
label=mark_safe(f"Select permission {required_star}"), # nosec label=mark_safe(f"Select permission {required_star}"), # nosec
choices=[ choices=[
(UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value, "View all requests"),
(UserPortfolioPermissionChoices.EDIT_REQUESTS.value, "View all requests plus create requests"),
("no_access", "No access"), ("no_access", "No access"),
(UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value, "Viewer"),
(UserPortfolioPermissionChoices.EDIT_REQUESTS.value, "Creator"),
], ],
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=False, required=False,
@ -165,15 +153,28 @@ class BasePortfolioMemberForm(forms.ModelForm):
}, },
) )
member_permission_member = forms.ChoiceField(
label=mark_safe(f"Select permission {required_star}"), # nosec
choices=[
("no_access", "No access"),
(UserPortfolioPermissionChoices.VIEW_MEMBERS.value, "Viewer"),
],
widget=forms.RadioSelect,
required=False,
error_messages={
"required": "Admin member permission is required",
},
)
# Tracks what form elements are required for a given role choice. # Tracks what form elements are required for a given role choice.
# All of the fields included here have "required=False" by default as they are conditionally required. # All of the fields included here have "required=False" by default as they are conditionally required.
# see def clean() for more details. # see def clean() for more details.
ROLE_REQUIRED_FIELDS = { ROLE_REQUIRED_FIELDS = {
UserPortfolioRoleChoices.ORGANIZATION_ADMIN: [ UserPortfolioRoleChoices.ORGANIZATION_ADMIN: [],
"domain_request_permission_admin",
"member_permission_admin",
],
UserPortfolioRoleChoices.ORGANIZATION_MEMBER: [ UserPortfolioRoleChoices.ORGANIZATION_MEMBER: [
"domain_permission_member",
"member_permission_member",
"domain_request_permission_member", "domain_request_permission_member",
], ],
} }
@ -225,6 +226,10 @@ class BasePortfolioMemberForm(forms.ModelForm):
if cleaned_data.get("domain_request_permission_member") == "no_access": if cleaned_data.get("domain_request_permission_member") == "no_access":
cleaned_data["domain_request_permission_member"] = None cleaned_data["domain_request_permission_member"] = None
# Edgecase: Member uses a special form value for None called "no_access".
if cleaned_data.get("member_permission_member") == "no_access":
cleaned_data["member_permission_member"] = None
# Handle roles # Handle roles
cleaned_data["roles"] = [role] cleaned_data["roles"] = [role]
@ -267,12 +272,15 @@ class BasePortfolioMemberForm(forms.ModelForm):
UserPortfolioRoleChoices.ORGANIZATION_ADMIN, UserPortfolioRoleChoices.ORGANIZATION_ADMIN,
UserPortfolioRoleChoices.ORGANIZATION_MEMBER, UserPortfolioRoleChoices.ORGANIZATION_MEMBER,
] ]
domain_perms = [ domain_request_perms = [
UserPortfolioPermissionChoices.EDIT_REQUESTS, UserPortfolioPermissionChoices.EDIT_REQUESTS,
UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS, UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS,
] ]
domain_perms = [
UserPortfolioPermissionChoices.VIEW_MANAGED_DOMAINS,
UserPortfolioPermissionChoices.VIEW_ALL_DOMAINS,
]
member_perms = [ member_perms = [
UserPortfolioPermissionChoices.EDIT_MEMBERS,
UserPortfolioPermissionChoices.VIEW_MEMBERS, UserPortfolioPermissionChoices.VIEW_MEMBERS,
] ]
@ -282,16 +290,15 @@ class BasePortfolioMemberForm(forms.ModelForm):
roles = self.instance.roles or [] roles = self.instance.roles or []
selected_role = next((role for role in roles if role in roles), None) selected_role = next((role for role in roles if role in roles), None)
self.initial["role"] = selected_role self.initial["role"] = selected_role
is_admin = selected_role == UserPortfolioRoleChoices.ORGANIZATION_ADMIN is_member = selected_role == UserPortfolioRoleChoices.ORGANIZATION_MEMBER
if is_admin: if is_member:
selected_domain_permission = next((perm for perm in domain_perms if perm in perms), None) # Edgecase: Member and domain request use a special form value for None called "no_access". This ensures a form selection.
selected_member_permission = next((perm for perm in member_perms if perm in perms), None) selected_domain_permission = next((perm for perm in domain_perms if perm in perms), UserPortfolioPermissionChoices.VIEW_MANAGED_DOMAINS.value)
self.initial["domain_request_permission_admin"] = selected_domain_permission selected_domain_request_permission = next((perm for perm in domain_request_perms if perm in perms), "no_access")
self.initial["member_permission_admin"] = selected_member_permission selected_member_permission = next((perm for perm in member_perms if perm in perms), "no_access")
else: self.initial["domain_request_permission_member"] = selected_domain_request_permission
# Edgecase: Member uses a special form value for None called "no_access". This ensures a form selection. self.initial["domain_permission_member"] = selected_domain_permission
selected_domain_permission = next((perm for perm in domain_perms if perm in perms), "no_access") self.initial["member_permission_member"] = selected_member_permission
self.initial["domain_request_permission_member"] = selected_domain_permission
class PortfolioMemberForm(BasePortfolioMemberForm): class PortfolioMemberForm(BasePortfolioMemberForm):

View file

@ -21,10 +21,11 @@ class UserPortfolioPermission(TimeStampedModel):
UserPortfolioRoleChoices.ORGANIZATION_ADMIN: [ UserPortfolioRoleChoices.ORGANIZATION_ADMIN: [
UserPortfolioPermissionChoices.VIEW_ALL_DOMAINS, UserPortfolioPermissionChoices.VIEW_ALL_DOMAINS,
UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS, UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS,
UserPortfolioPermissionChoices.EDIT_REQUESTS,
UserPortfolioPermissionChoices.VIEW_MEMBERS, UserPortfolioPermissionChoices.VIEW_MEMBERS,
UserPortfolioPermissionChoices.EDIT_MEMBERS,
UserPortfolioPermissionChoices.VIEW_PORTFOLIO, UserPortfolioPermissionChoices.VIEW_PORTFOLIO,
UserPortfolioPermissionChoices.EDIT_PORTFOLIO, UserPortfolioPermissionChoices.EDIT_PORTFOLIO,
# Domain: field specific permissions
UserPortfolioPermissionChoices.VIEW_SUBORGANIZATION, UserPortfolioPermissionChoices.VIEW_SUBORGANIZATION,
UserPortfolioPermissionChoices.EDIT_SUBORGANIZATION, UserPortfolioPermissionChoices.EDIT_SUBORGANIZATION,
], ],
@ -38,9 +39,9 @@ class UserPortfolioPermission(TimeStampedModel):
# Used to throw a ValidationError on clean() for UserPortfolioPermission and PortfolioInvitation. # Used to throw a ValidationError on clean() for UserPortfolioPermission and PortfolioInvitation.
FORBIDDEN_PORTFOLIO_ROLE_PERMISSIONS = { FORBIDDEN_PORTFOLIO_ROLE_PERMISSIONS = {
UserPortfolioRoleChoices.ORGANIZATION_MEMBER: [ UserPortfolioRoleChoices.ORGANIZATION_MEMBER: [
UserPortfolioPermissionChoices.VIEW_MEMBERS, UserPortfolioPermissionChoices.EDIT_PORTFOLIO,
UserPortfolioPermissionChoices.EDIT_MEMBERS, UserPortfolioPermissionChoices.EDIT_MEMBERS,
UserPortfolioPermissionChoices.VIEW_ALL_DOMAINS, UserPortfolioPermissionChoices.EDIT_SUBORGANIZATION,
], ],
} }

View file

@ -92,23 +92,6 @@
<!-- Admin access form --> <!-- Admin access form -->
<div id="member-admin-permissions" class="margin-top-2"> <div id="member-admin-permissions" class="margin-top-2">
<h2>Admin access permissions</h2>
<p>Member permissions available for admin-level acccess.</p>
<h3 class="summary-item__title
text-primary-dark
margin-bottom-0">Organization domain requests</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.domain_request_permission_admin %}
{% endwith %}
<h3 class="summary-item__title
text-primary-dark
margin-bottom-0
margin-top-3">Organization members</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.member_permission_admin %}
{% endwith %}
</div> </div>
<!-- Basic access form --> <!-- Basic access form -->
@ -116,10 +99,27 @@
<h2>Basic member permissions</h2> <h2>Basic member permissions</h2>
<p>Member permissions available for basic-level acccess.</p> <p>Member permissions available for basic-level acccess.</p>
<h3 class="margin-bottom-0 summary-item__title text-primary-dark">Organization domain requests</h3> <h3 class="summary-item__title
text-primary-dark
margin-bottom-0">Domains</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.domain_permission_member %}
{% endwith %}
<h3 class="margin-bottom-0
summary-item__title
text-primary-dark">Domain requests</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %} {% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.domain_request_permission_member %} {% input_with_errors form.domain_request_permission_member %}
{% endwith %} {% endwith %}
<h3 class="summary-item__title
text-primary-dark
margin-bottom-0">Organization members</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.member_permission_member %}
{% endwith %}
</div> </div>
<!-- Submit/cancel buttons --> <!-- Submit/cancel buttons -->

View file

@ -65,23 +65,6 @@
<!-- Admin access form --> <!-- Admin access form -->
<div id="new-member-admin-permissions" class="margin-top-2"> <div id="new-member-admin-permissions" class="margin-top-2">
<h2>Admin access permissions</h2>
<p>Member permissions available for admin-level acccess.</p>
<h3 class="summary-item__title
text-primary-dark
margin-bottom-0">Organization domain requests</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.domain_request_permission_admin %}
{% endwith %}
<h3 class="summary-item__title
text-primary-dark
margin-bottom-0
margin-top-3">Organization members</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.member_permission_admin %}
{% endwith %}
</div> </div>
<!-- Basic access form --> <!-- Basic access form -->
@ -89,10 +72,27 @@
<h2>Basic member permissions</h2> <h2>Basic member permissions</h2>
<p>Member permissions available for basic-level acccess.</p> <p>Member permissions available for basic-level acccess.</p>
<h3 class="margin-bottom-0">Organization domain requests</h3> <h3 class="summary-item__title
text-primary-dark
margin-bottom-0">Domains</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.domain_permission_member %}
{% endwith %}
<h3 class="margin-bottom-0
summary-item__title
text-primary-dark">Domain requests</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %} {% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.domain_request_permission_member %} {% input_with_errors form.domain_request_permission_member %}
{% endwith %} {% endwith %}
<h3 class="summary-item__title
text-primary-dark
margin-bottom-0
margin-top-3">Organization members</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border bg-gray-1 padding-top-0" %}
{% input_with_errors form.member_permission_member %}
{% endwith %}
</div> </div>
<!-- Submit/cancel buttons --> <!-- Submit/cancel buttons -->