fine comb

This commit is contained in:
zandercymatics 2024-12-10 13:50:30 -07:00
parent ed9d215577
commit bc3a96aa87
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
7 changed files with 65 additions and 58 deletions

View file

@ -3791,6 +3791,7 @@ class WaffleFlagAdmin(FlagAdmin):
if extra_context is None: if extra_context is None:
extra_context = {} extra_context = {}
extra_context["dns_prototype_flag"] = flag_is_active_for_user(request.user, "dns_prototype_flag") extra_context["dns_prototype_flag"] = flag_is_active_for_user(request.user, "dns_prototype_flag")
extra_context["organization_member"] = flag_is_active_for_user(request.user, "organization_member")
return super().changelist_view(request, extra_context=extra_context) return super().changelist_view(request, extra_context=extra_context)

View file

@ -49,7 +49,7 @@ export function initPortfolioMemberPageToggle() {
* on the Add New Member page. * on the Add New Member page.
*/ */
export function initAddNewMemberPageListeners() { export function initAddNewMemberPageListeners() {
add_member_form = document.getElementById("add_member_form") let add_member_form = document.getElementById("add_member_form")
if (!add_member_form){ if (!add_member_form){
return; return;
} }

View file

@ -107,6 +107,8 @@ def is_widescreen_mode(request):
"/no-organization-requests/", "/no-organization-requests/",
"/no-organization-domains/", "/no-organization-domains/",
"/domain-request/", "/domain-request/",
# "/members/",
# "/member/"
] ]
is_widescreen = any(path in request.path for path in widescreen_paths) or request.path == "/" is_widescreen = any(path in request.path for path in widescreen_paths) or request.path == "/"
is_portfolio_widescreen = bool( is_portfolio_widescreen = bool(

View file

@ -4,7 +4,7 @@ import logging
from django import forms from django import forms
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.core.validators import MaxLengthValidator from django.core.validators import MaxLengthValidator
from django.utils.safestring import mark_safe
from registrar.models import ( from registrar.models import (
PortfolioInvitation, PortfolioInvitation,
UserPortfolioPermission, UserPortfolioPermission,
@ -109,13 +109,13 @@ class PortfolioSeniorOfficialForm(forms.ModelForm):
cleaned_data.pop("full_name", None) cleaned_data.pop("full_name", None)
return cleaned_data return cleaned_data
class BasePortfolioMemberForm(forms.Form):
class BasePortfolioMemberForm(forms.ModelForm): required_star = '<abbr class="usa-hint usa-hint--required" title="required">*</abbr>'
role = forms.ChoiceField( role = forms.ChoiceField(
label="Select permission",
choices=[ choices=[
(UserPortfolioRoleChoices.ORGANIZATION_ADMIN.value, "Admin Access"), (UserPortfolioRoleChoices.ORGANIZATION_ADMIN.value, "Admin access"),
(UserPortfolioRoleChoices.ORGANIZATION_MEMBER.value, "Basic Access") (UserPortfolioRoleChoices.ORGANIZATION_MEMBER.value, "Basic access")
], ],
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=True, required=True,
@ -123,12 +123,12 @@ class BasePortfolioMemberForm(forms.ModelForm):
"required": "Member access level is required", "required": "Member access level is required",
}, },
) )
# Permissions for admins
domain_request_permissions_admin = forms.ChoiceField( domain_request_permissions_admin = forms.ChoiceField(
label="Select permission", label=mark_safe(f"Select permission {required_star}"),
choices=[ choices=[
(UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value, "View all requests"), (UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value, "View all requests"),
(UserPortfolioPermissionChoices.EDIT_REQUESTS.value, "Create and edit requests") (UserPortfolioPermissionChoices.EDIT_REQUESTS.value, "View all requests plus create requests"),
], ],
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=False, required=False,
@ -136,11 +136,12 @@ class BasePortfolioMemberForm(forms.ModelForm):
"required": "Admin domain request permission is required", "required": "Admin domain request permission is required",
}, },
) )
member_permissions_admin = forms.ChoiceField( member_permissions_admin = forms.ChoiceField(
label="Select permission", label=mark_safe(f"Select permission {required_star}"),
choices=[ choices=[
(UserPortfolioPermissionChoices.VIEW_MEMBERS.value, "View all members"), (UserPortfolioPermissionChoices.VIEW_MEMBERS.value, "View all members"),
(UserPortfolioPermissionChoices.EDIT_MEMBERS.value, "Create and edit members") (UserPortfolioPermissionChoices.EDIT_MEMBERS.value, "View all members plus manage members"),
], ],
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=False, required=False,
@ -148,11 +149,13 @@ class BasePortfolioMemberForm(forms.ModelForm):
"required": "Admin member permission is required", "required": "Admin member permission is required",
}, },
) )
domain_request_permissions_member = forms.ChoiceField( domain_request_permissions_member = forms.ChoiceField(
label="Select permission", label=mark_safe(f"Select permission {required_star}"),
choices=[ choices=[
(UserPortfolioPermissionChoices.VIEW_MEMBERS.value, "View all members"), (UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value, "View all requests"),
(UserPortfolioPermissionChoices.EDIT_MEMBERS.value, "Create and edit members") (UserPortfolioPermissionChoices.EDIT_REQUESTS.value, "View all requests plus create requests"),
("no_access", "No access"),
], ],
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=False, required=False,
@ -161,8 +164,6 @@ class BasePortfolioMemberForm(forms.ModelForm):
}, },
) )
# this form dynamically shows/hides some fields, depending on what
# was selected prior. This toggles which field is required or not.
ROLE_REQUIRED_FIELDS = { ROLE_REQUIRED_FIELDS = {
UserPortfolioRoleChoices.ORGANIZATION_ADMIN: [ UserPortfolioRoleChoices.ORGANIZATION_ADMIN: [
"domain_request_permissions_admin", "domain_request_permissions_admin",
@ -173,10 +174,19 @@ class BasePortfolioMemberForm(forms.ModelForm):
], ],
} }
def __init__(self, *args, instance=None, **kwargs):
self.instance = instance
# If we have an instance, set initial
if instance:
kwargs['initial'] = self._map_instance_to_form(instance)
super().__init__(*args, **kwargs)
def _map_instance_to_form(self, instance): def _map_instance_to_form(self, instance):
"""Maps model instance data to form fields""" """Maps model instance data to form fields"""
if not instance: if not instance:
return {} return {}
mapped_data = {} mapped_data = {}
# Map roles with priority for admin # Map roles with priority for admin
if instance.roles: if instance.roles:
@ -192,37 +202,16 @@ class BasePortfolioMemberForm(forms.ModelForm):
mapped_data['domain_request_permissions_admin'] = UserPortfolioPermissionChoices.EDIT_REQUESTS.value mapped_data['domain_request_permissions_admin'] = UserPortfolioPermissionChoices.EDIT_REQUESTS.value
elif UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value in perms: elif UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value in perms:
mapped_data['domain_request_permissions_admin'] = UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value mapped_data['domain_request_permissions_admin'] = UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS.value
else:
mapped_data["member_permissions_admin"] = "no_access"
if UserPortfolioPermissionChoices.EDIT_MEMBERS.value in perms: if UserPortfolioPermissionChoices.EDIT_MEMBERS.value in perms:
mapped_data['member_permissions_admin'] = UserPortfolioPermissionChoices.EDIT_MEMBERS.value mapped_data['member_permissions_admin'] = UserPortfolioPermissionChoices.EDIT_MEMBERS.value
elif UserPortfolioPermissionChoices.VIEW_MEMBERS.value in perms: elif UserPortfolioPermissionChoices.VIEW_MEMBERS.value in perms:
mapped_data['member_permissions_admin'] = UserPortfolioPermissionChoices.VIEW_MEMBERS.value mapped_data['member_permissions_admin'] = UserPortfolioPermissionChoices.VIEW_MEMBERS.value
return mapped_data return mapped_data
def _map_form_to_instance(self, instance):
"""Maps form data to model instance"""
if not self.is_valid():
return
role = self.cleaned_data.get("role")
domain_request_permissions_member = self.cleaned_data.get("domain_request_permissions_member")
domain_request_permissions_admin = self.cleaned_data.get('domain_request_permissions_admin')
member_permissions_admin = self.cleaned_data.get('member_permissions_admin')
instance.roles = [role]
additional_permissions = []
if domain_request_permissions_member:
additional_permissions.append(domain_request_permissions_member)
elif domain_request_permissions_admin:
additional_permissions.append(domain_request_permissions_admin)
if member_permissions_admin:
additional_permissions.append(member_permissions_admin)
instance.additional_permissions = additional_permissions
return instance
def clean(self): def clean(self):
cleaned_data = super().clean() cleaned_data = super().clean()
role = cleaned_data.get("role") role = cleaned_data.get("role")
@ -239,6 +228,27 @@ class BasePortfolioMemberForm(forms.ModelForm):
return cleaned_data return cleaned_data
def save(self):
"""Save the form data to the instance"""
if not self.instance:
raise ValueError("Cannot save form without instance")
role = self.cleaned_data.get("role")
self.instance.roles = [self.cleaned_data["role"]]
additional_permissions = []
if self.cleaned_data.get("domain_request_permissions_member") and self.cleaned_data["domain_request_permissions_member"] != "no_access":
additional_permissions.append(self.cleaned_data["domain_request_permissions_member"])
elif self.cleaned_data.get("domain_request_permissions_admin"):
additional_permissions.append(self.cleaned_data["domain_request_permissions_admin"])
if self.cleaned_data.get("member_permissions_admin"):
additional_permissions.append(self.cleaned_data["member_permissions_admin"])
self.instance.additional_permissions = additional_permissions
self.instance.save()
return self.instance
class PortfolioMemberForm(BasePortfolioMemberForm): class PortfolioMemberForm(BasePortfolioMemberForm):
""" """
@ -250,6 +260,7 @@ class PortfolioMemberForm(BasePortfolioMemberForm):
"roles", "roles",
"additional_permissions", "additional_permissions",
] ]
def __init__(self, *args, instance=None, **kwargs): def __init__(self, *args, instance=None, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['role'].descriptions = { self.fields['role'].descriptions = {
@ -258,14 +269,6 @@ class PortfolioMemberForm(BasePortfolioMemberForm):
} }
self.instance = instance self.instance = instance
self.initial = self._map_instance_to_form(self.instance) self.initial = self._map_instance_to_form(self.instance)
def save(self):
"""Save form data to instance"""
if not self.instance:
self.instance = self.Meta.model()
self._map_form_to_instance(self.instance)
self.instance.save()
return self.instance
class PortfolioInvitedMemberForm(BasePortfolioMemberForm): class PortfolioInvitedMemberForm(BasePortfolioMemberForm):

View file

@ -21,7 +21,7 @@
{% if field and field.field and field.field.descriptions %} {% if field and field.field and field.field.descriptions %}
{% with description=field.field.descriptions|get_dict_value:option.value %} {% with description=field.field.descriptions|get_dict_value:option.value %}
{% if description %} {% if description %}
<p class="margin-0 margin-top-2">{{ description }}</p> <p class="margin-0 margin-top-1">{{ description }}</p>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
{% endif %} {% endif %}

View file

@ -9,6 +9,7 @@
{% endblock %} {% endblock %}
{% block portfolio_content %} {% block portfolio_content %}
{% include "includes/form_errors.html" with form=form %}
<!-- Navigation breadcrumbs --> <!-- Navigation breadcrumbs -->
<nav class="usa-breadcrumb padding-top-0" aria-label="Domain request breadcrumb"> <nav class="usa-breadcrumb padding-top-0" aria-label="Domain request breadcrumb">
@ -29,15 +30,15 @@
<!-- Page header --> <!-- Page header -->
<h1>Member access and permissions</h1> <h1>Member access and permissions</h1>
{% include "includes/required_fields.html" %} {% include "includes/required_fields.html" with remove_margin_top=True %}
<form class="usa-form usa-form--large" method="post" id="member_form" novalidate> <form class="usa-form usa-form--large" method="post" id="member_form" novalidate>
{% csrf_token %} {% csrf_token %}
<fieldset class="usa-fieldset margin-top-2"> <fieldset class="usa-fieldset">
<legend> <legend>
<h2>Member email</h2> <h2 class="margin-top-1">Member email</h2>
</legend> </legend>
<p> <p class="margin-top-0">
{% if member %} {% if member %}
{{ member.email }} {{ member.email }}
{% elif invitation %} {% elif invitation %}
@ -48,9 +49,9 @@
</fieldset> </fieldset>
<!-- Member access radio buttons (Toggles other sections) --> <!-- Member access radio buttons (Toggles other sections) -->
<fieldset class="usa-fieldset margin-top-2"> <fieldset class="usa-fieldset">
<legend> <legend>
<h2>Member Access</h2> <h2 class="margin-top-0">Member Access</h2>
</legend> </legend>
<em>Select the level of access for this member. <abbr class="usa-hint usa-hint--required" title="required">*</abbr></em> <em>Select the level of access for this member. <abbr class="usa-hint usa-hint--required" title="required">*</abbr></em>
@ -92,7 +93,7 @@
<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="margin-bottom-0 summary-item__title text-primary-dark">Organization domain requests</h3>
{% with group_classes="usa-form-editable usa-form-editable--no-border padding-top-0" %} {% with group_classes="usa-form-editable usa-form-editable--no-border padding-top-0" %}
{% input_with_errors form.domain_request_permissions_member %} {% input_with_errors form.domain_request_permissions_member %}
{% endwith %} {% endwith %}

View file

@ -165,7 +165,7 @@ class PortfolioMemberEditView(PortfolioMemberEditPermissionView, View):
user = portfolio_permission.user user = portfolio_permission.user
form = self.form_class(request.POST, instance=portfolio_permission) form = self.form_class(request.POST, instance=portfolio_permission)
print(f"form valid: {form.is_valid()}")
if form.is_valid(): if form.is_valid():
form.save() form.save()
return redirect("member", pk=pk) return redirect("member", pk=pk)