mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-27 21:16:28 +02:00
a little bit of linting
This commit is contained in:
parent
4e4e2c0d8e
commit
1fe97eb54e
8 changed files with 52 additions and 38 deletions
|
@ -1483,7 +1483,7 @@ class PortfolioInvitationAdmin(ListHeaderAdmin):
|
||||||
extra_context["tabtitle"] = "Portfolio invitations"
|
extra_context["tabtitle"] = "Portfolio invitations"
|
||||||
# Get the filtered values
|
# Get the filtered values
|
||||||
return super().changelist_view(request, extra_context=extra_context)
|
return super().changelist_view(request, extra_context=extra_context)
|
||||||
|
|
||||||
def save_model(self, request, obj, form, change):
|
def save_model(self, request, obj, form, change):
|
||||||
"""
|
"""
|
||||||
Override the save_model method to send an email only on creation of the PortfolioInvitation object.
|
Override the save_model method to send an email only on creation of the PortfolioInvitation object.
|
||||||
|
@ -1494,7 +1494,9 @@ class PortfolioInvitationAdmin(ListHeaderAdmin):
|
||||||
requestor = request.user
|
requestor = request.user
|
||||||
|
|
||||||
requested_user = User.objects.filter(email=requested_email).first()
|
requested_user = User.objects.filter(email=requested_email).first()
|
||||||
permission_exists = UserPortfolioPermission.objects.filter(user=requested_user, portfolio=portfolio).exists()
|
permission_exists = UserPortfolioPermission.objects.filter(
|
||||||
|
user=requested_user, portfolio=portfolio
|
||||||
|
).exists()
|
||||||
try:
|
try:
|
||||||
if not requested_user or not permission_exists:
|
if not requested_user or not permission_exists:
|
||||||
send_portfolio_invitation_email(email=requested_email, requestor=requestor, portfolio=portfolio)
|
send_portfolio_invitation_email(email=requested_email, requestor=requestor, portfolio=portfolio)
|
||||||
|
@ -1511,14 +1513,21 @@ class PortfolioInvitationAdmin(ListHeaderAdmin):
|
||||||
def _handle_exceptions(self, exception, request, obj):
|
def _handle_exceptions(self, exception, request, obj):
|
||||||
"""Handle exceptions raised during the process."""
|
"""Handle exceptions raised during the process."""
|
||||||
if isinstance(exception, EmailSendingError):
|
if isinstance(exception, EmailSendingError):
|
||||||
logger.warning("Could not sent email invitation to %s for portfolio %s (EmailSendingError)", obj.email, obj.portfolio, exc_info=True)
|
logger.warning(
|
||||||
|
"Could not sent email invitation to %s for portfolio %s (EmailSendingError)",
|
||||||
|
obj.email,
|
||||||
|
obj.portfolio,
|
||||||
|
exc_info=True,
|
||||||
|
)
|
||||||
messages.error(request, "Could not send email invitation. Portfolio invitation not saved.")
|
messages.error(request, "Could not send email invitation. Portfolio invitation not saved.")
|
||||||
elif isinstance(exception, MissingEmailError):
|
elif isinstance(exception, MissingEmailError):
|
||||||
messages.error(request, str(exception))
|
messages.error(request, str(exception))
|
||||||
logger.error(
|
logger.error(
|
||||||
f"Can't send email to '{obj.email}' for portfolio '{obj.portfolio}'. No email exists for the requestor.",
|
f"Can't send email to '{obj.email}' for portfolio '{obj.portfolio}'. "
|
||||||
|
f"No email exists for the requestor.",
|
||||||
exc_info=True,
|
exc_info=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.warning("Could not send email invitation (Other Exception)", obj.portfolio, exc_info=True)
|
logger.warning("Could not send email invitation (Other Exception)", obj.portfolio, exc_info=True)
|
||||||
messages.error(request, "Could not send email invitation. Portfolio invitation not saved.")
|
messages.error(request, "Could not send email invitation. Portfolio invitation not saved.")
|
||||||
|
|
|
@ -12,7 +12,6 @@ from registrar.models import (
|
||||||
DomainInformation,
|
DomainInformation,
|
||||||
Portfolio,
|
Portfolio,
|
||||||
SeniorOfficial,
|
SeniorOfficial,
|
||||||
User,
|
|
||||||
)
|
)
|
||||||
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
|
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
|
||||||
|
|
||||||
|
@ -111,9 +110,9 @@ class PortfolioSeniorOfficialForm(forms.ModelForm):
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BasePortfolioMemberForm(forms.ModelForm):
|
class BasePortfolioMemberForm(forms.ModelForm):
|
||||||
"""Base form for the PortfolioMemberForm and PortfolioInvitedMemberForm"""
|
"""Base form for the PortfolioMemberForm and PortfolioInvitedMemberForm"""
|
||||||
|
|
||||||
required_star = '<abbr class="usa-hint usa-hint--required" title="required">*</abbr>'
|
required_star = '<abbr class="usa-hint usa-hint--required" title="required">*</abbr>'
|
||||||
role = forms.ChoiceField(
|
role = forms.ChoiceField(
|
||||||
choices=[
|
choices=[
|
||||||
|
@ -180,7 +179,7 @@ class BasePortfolioMemberForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = None
|
model = None
|
||||||
fields = ["roles", "additional_permissions" ]
|
fields = ["roles", "additional_permissions"]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
@ -242,7 +241,7 @@ class BasePortfolioMemberForm(forms.ModelForm):
|
||||||
|
|
||||||
logger.info(cleaned_data)
|
logger.info(cleaned_data)
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
def map_instance_to_initial(self):
|
def map_instance_to_initial(self):
|
||||||
"""
|
"""
|
||||||
Maps self.instance to self.initial, handling roles and permissions.
|
Maps self.instance to self.initial, handling roles and permissions.
|
||||||
|
@ -301,7 +300,7 @@ class PortfolioMemberForm(BasePortfolioMemberForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UserPortfolioPermission
|
model = UserPortfolioPermission
|
||||||
fields = ["roles", "additional_permissions" ]
|
fields = ["roles", "additional_permissions"]
|
||||||
|
|
||||||
|
|
||||||
class PortfolioInvitedMemberForm(BasePortfolioMemberForm):
|
class PortfolioInvitedMemberForm(BasePortfolioMemberForm):
|
||||||
|
@ -311,8 +310,7 @@ class PortfolioInvitedMemberForm(BasePortfolioMemberForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PortfolioInvitation
|
model = PortfolioInvitation
|
||||||
fields = ["roles", "additional_permissions" ]
|
fields = ["roles", "additional_permissions"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PortfolioNewMemberForm(BasePortfolioMemberForm):
|
class PortfolioNewMemberForm(BasePortfolioMemberForm):
|
||||||
|
@ -336,4 +334,3 @@ class PortfolioNewMemberForm(BasePortfolioMemberForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PortfolioInvitation
|
model = PortfolioInvitation
|
||||||
fields = ["portfolio", "email", "roles", "additional_permissions"]
|
fields = ["portfolio", "email", "roles", "additional_permissions"]
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ from typing import Optional
|
||||||
from django_fsm import FSMField, transition, TransitionNotAllowed # type: ignore
|
from django_fsm import FSMField, transition, TransitionNotAllowed # type: ignore
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from registrar.models.host import Host
|
from registrar.models.host import Host
|
||||||
|
|
|
@ -10,6 +10,7 @@ import logging
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Portfolio(TimeStampedModel):
|
class Portfolio(TimeStampedModel):
|
||||||
"""
|
"""
|
||||||
Portfolio is used for organizing domains/domain-requests into
|
Portfolio is used for organizing domains/domain-requests into
|
||||||
|
@ -165,7 +166,7 @@ class Portfolio(TimeStampedModel):
|
||||||
def get_suborganizations(self):
|
def get_suborganizations(self):
|
||||||
"""Returns all suborganizations associated with this portfolio"""
|
"""Returns all suborganizations associated with this portfolio"""
|
||||||
return self.portfolio_suborganizations.all()
|
return self.portfolio_suborganizations.all()
|
||||||
|
|
||||||
def full_clean(self, exclude=None, validate_unique=True):
|
def full_clean(self, exclude=None, validate_unique=True):
|
||||||
logger.info("portfolio full clean")
|
logger.info("portfolio full clean")
|
||||||
super().full_clean(exclude, validate_unique)
|
super().full_clean(exclude, validate_unique)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import logging
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class UserPortfolioRoleChoices(models.TextChoices):
|
class UserPortfolioRoleChoices(models.TextChoices):
|
||||||
"""
|
"""
|
||||||
Roles make it easier for admins to look at
|
Roles make it easier for admins to look at
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from registrar.models import DomainInvitation
|
from registrar.models import DomainInvitation
|
||||||
from registrar.models.portfolio_invitation import PortfolioInvitation
|
|
||||||
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
|
||||||
from registrar.utility.errors import (
|
from registrar.utility.errors import (
|
||||||
AlreadyDomainInvitedError,
|
AlreadyDomainInvitedError,
|
||||||
AlreadyDomainManagerError,
|
AlreadyDomainManagerError,
|
||||||
|
@ -9,7 +7,7 @@ from registrar.utility.errors import (
|
||||||
OutsideOrgMemberError,
|
OutsideOrgMemberError,
|
||||||
)
|
)
|
||||||
from registrar.utility.waffle import flag_is_active_for_user
|
from registrar.utility.waffle import flag_is_active_for_user
|
||||||
from registrar.utility.email import send_templated_email, EmailSendingError
|
from registrar.utility.email import send_templated_email
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
|
@ -1128,7 +1128,10 @@ class DomainUsersView(DomainBaseView):
|
||||||
for portfolio_invitation in portfolio_invitations:
|
for portfolio_invitation in portfolio_invitations:
|
||||||
logger.info(portfolio_invitation)
|
logger.info(portfolio_invitation)
|
||||||
logger.info(portfolio_invitation.roles)
|
logger.info(portfolio_invitation.roles)
|
||||||
if portfolio_invitation.roles and UserPortfolioRoleChoices.ORGANIZATION_ADMIN in portfolio_invitation.roles:
|
if (
|
||||||
|
portfolio_invitation.roles
|
||||||
|
and UserPortfolioRoleChoices.ORGANIZATION_ADMIN in portfolio_invitation.roles
|
||||||
|
):
|
||||||
has_admin_flag = True
|
has_admin_flag = True
|
||||||
break # Once we find one match, no need to check further
|
break # Once we find one match, no need to check further
|
||||||
|
|
||||||
|
@ -1210,18 +1213,16 @@ class DomainAddUserView(DomainFormBaseView):
|
||||||
|
|
||||||
# Determine membership in a different organization
|
# Determine membership in a different organization
|
||||||
member_of_a_different_org = (
|
member_of_a_different_org = (
|
||||||
(existing_org_permission and existing_org_permission.portfolio != requestor_org) or
|
existing_org_permission and existing_org_permission.portfolio != requestor_org
|
||||||
(existing_org_invitation and existing_org_invitation.portfolio != requestor_org)
|
) or (existing_org_invitation and existing_org_invitation.portfolio != requestor_org)
|
||||||
)
|
|
||||||
|
|
||||||
# Determine membership in the same organization
|
# Determine membership in the same organization
|
||||||
member_of_this_org = (
|
member_of_this_org = (existing_org_permission and existing_org_permission.portfolio == requestor_org) or (
|
||||||
(existing_org_permission and existing_org_permission.portfolio == requestor_org) or
|
existing_org_invitation and existing_org_invitation.portfolio == requestor_org
|
||||||
(existing_org_invitation and existing_org_invitation.portfolio == requestor_org)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return member_of_a_different_org, member_of_this_org
|
return member_of_a_different_org, member_of_this_org
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
"""Add the specified user to this domain."""
|
"""Add the specified user to this domain."""
|
||||||
requested_email = form.cleaned_data["email"]
|
requested_email = form.cleaned_data["email"]
|
||||||
|
@ -1232,7 +1233,9 @@ class DomainAddUserView(DomainFormBaseView):
|
||||||
# Get the requestor's organization
|
# Get the requestor's organization
|
||||||
requestor_org = UserPortfolioPermission.objects.filter(user=requestor).first().portfolio
|
requestor_org = UserPortfolioPermission.objects.filter(user=requestor).first().portfolio
|
||||||
|
|
||||||
member_of_a_different_org, member_of_this_org = self._get_org_membership(requestor_org, requested_email, requested_user)
|
member_of_a_different_org, member_of_this_org = self._get_org_membership(
|
||||||
|
requestor_org, requested_email, requested_user
|
||||||
|
)
|
||||||
|
|
||||||
# determine portfolio of the domain (code currently is looking at requestor's portfolio)
|
# determine portfolio of the domain (code currently is looking at requestor's portfolio)
|
||||||
# if requested_email/user is not member or invited member of this portfolio
|
# if requested_email/user is not member or invited member of this portfolio
|
||||||
|
@ -1299,7 +1302,12 @@ class DomainAddUserView(DomainFormBaseView):
|
||||||
def _handle_exceptions(self, exception, email):
|
def _handle_exceptions(self, exception, email):
|
||||||
"""Handle exceptions raised during the process."""
|
"""Handle exceptions raised during the process."""
|
||||||
if isinstance(exception, EmailSendingError):
|
if isinstance(exception, EmailSendingError):
|
||||||
logger.warning("Could not send email invitation to %s for domain %s (EmailSendingError)", email, self.object, exc_info=True)
|
logger.warning(
|
||||||
|
"Could not send email invitation to %s for domain %s (EmailSendingError)",
|
||||||
|
email,
|
||||||
|
self.object,
|
||||||
|
exc_info=True,
|
||||||
|
)
|
||||||
messages.warning(self.request, "Could not send email invitation.")
|
messages.warning(self.request, "Could not send email invitation.")
|
||||||
elif isinstance(exception, OutsideOrgMemberError):
|
elif isinstance(exception, OutsideOrgMemberError):
|
||||||
logger.warning(
|
logger.warning(
|
||||||
|
@ -1342,6 +1350,7 @@ class DomainAddUserView(DomainFormBaseView):
|
||||||
logger.warning("Could not send email invitation (Other Exception)", portfolio, exc_info=True)
|
logger.warning("Could not send email invitation (Other Exception)", portfolio, exc_info=True)
|
||||||
messages.warning(self.request, "Could not send email invitation.")
|
messages.warning(self.request, "Could not send email invitation.")
|
||||||
|
|
||||||
|
|
||||||
class DomainInvitationCancelView(SuccessMessageMixin, DomainInvitationPermissionCancelView):
|
class DomainInvitationCancelView(SuccessMessageMixin, DomainInvitationPermissionCancelView):
|
||||||
object: DomainInvitation
|
object: DomainInvitation
|
||||||
fields = []
|
fields = []
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logging
|
import logging
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
from django.http import Http404, JsonResponse
|
from django.http import Http404, JsonResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
|
@ -299,7 +298,7 @@ class PortfolioInvitedMemberEditView(PortfolioMemberEditPermissionView, View):
|
||||||
"invitation": portfolio_invitation,
|
"invitation": portfolio_invitation,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
def post(self, request, pk):
|
def post(self, request, pk):
|
||||||
portfolio_invitation = get_object_or_404(PortfolioInvitation, pk=pk)
|
portfolio_invitation = get_object_or_404(PortfolioInvitation, pk=pk)
|
||||||
form = self.form_class(request.POST, instance=portfolio_invitation)
|
form = self.form_class(request.POST, instance=portfolio_invitation)
|
||||||
|
@ -520,7 +519,7 @@ class PortfolioAddMemberView(PortfolioMembersPermissionView, FormMixin):
|
||||||
self.object = None # No existing PortfolioInvitation instance
|
self.object = None # No existing PortfolioInvitation instance
|
||||||
form = self.get_form()
|
form = self.get_form()
|
||||||
return self.render_to_response(self.get_context_data(form=form))
|
return self.render_to_response(self.get_context_data(form=form))
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
"""Handle POST requests to process form submission."""
|
"""Handle POST requests to process form submission."""
|
||||||
self.object = None # For a new invitation, there's no existing model instance
|
self.object = None # For a new invitation, there's no existing model instance
|
||||||
|
@ -536,16 +535,16 @@ class PortfolioAddMemberView(PortfolioMembersPermissionView, FormMixin):
|
||||||
return self.form_valid(form)
|
return self.form_valid(form)
|
||||||
else:
|
else:
|
||||||
return self.form_invalid(form)
|
return self.form_invalid(form)
|
||||||
|
|
||||||
def is_ajax(self):
|
def is_ajax(self):
|
||||||
return self.request.headers.get("X-Requested-With") == "XMLHttpRequest"
|
return self.request.headers.get("X-Requested-With") == "XMLHttpRequest"
|
||||||
|
|
||||||
def form_invalid(self, form):
|
def form_invalid(self, form):
|
||||||
if self.is_ajax():
|
if self.is_ajax():
|
||||||
return JsonResponse({"is_valid": False}) # Return a JSON response
|
return JsonResponse({"is_valid": False}) # Return a JSON response
|
||||||
else:
|
else:
|
||||||
return super().form_invalid(form) # Handle non-AJAX requests normally
|
return super().form_invalid(form) # Handle non-AJAX requests normally
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
super().form_valid(form)
|
super().form_valid(form)
|
||||||
if self.is_ajax():
|
if self.is_ajax():
|
||||||
|
@ -577,14 +576,15 @@ class PortfolioAddMemberView(PortfolioMembersPermissionView, FormMixin):
|
||||||
self._handle_exceptions(e, portfolio, requested_email)
|
self._handle_exceptions(e, portfolio, requested_email)
|
||||||
return redirect(self.get_success_url())
|
return redirect(self.get_success_url())
|
||||||
|
|
||||||
def get_success_url(self):
|
|
||||||
"""Redirect to the members page."""
|
|
||||||
return reverse("members")
|
|
||||||
|
|
||||||
def _handle_exceptions(self, exception, portfolio, email):
|
def _handle_exceptions(self, exception, portfolio, email):
|
||||||
"""Handle exceptions raised during the process."""
|
"""Handle exceptions raised during the process."""
|
||||||
if isinstance(exception, EmailSendingError):
|
if isinstance(exception, EmailSendingError):
|
||||||
logger.warning("Could not sent email invitation to %s for portfolio %s (EmailSendingError)", email, portfolio, exc_info=True)
|
logger.warning(
|
||||||
|
"Could not sent email invitation to %s for portfolio %s (EmailSendingError)",
|
||||||
|
email,
|
||||||
|
portfolio,
|
||||||
|
exc_info=True,
|
||||||
|
)
|
||||||
messages.warning(self.request, "Could not send email invitation.")
|
messages.warning(self.request, "Could not send email invitation.")
|
||||||
elif isinstance(exception, MissingEmailError):
|
elif isinstance(exception, MissingEmailError):
|
||||||
messages.error(self.request, str(exception))
|
messages.error(self.request, str(exception))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue