mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-28 13:36:30 +02:00
fine comb
This commit is contained in:
parent
ed9d215577
commit
bc3a96aa87
7 changed files with 65 additions and 58 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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):
|
||||||
|
required_star = '<abbr class="usa-hint usa-hint--required" title="required">*</abbr>'
|
||||||
|
|
||||||
class BasePortfolioMemberForm(forms.ModelForm):
|
|
||||||
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,6 +202,8 @@ 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
|
||||||
|
@ -200,29 +212,6 @@ class BasePortfolioMemberForm(forms.ModelForm):
|
||||||
|
|
||||||
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 = {
|
||||||
|
@ -259,14 +270,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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue