mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-27 13:06:30 +02:00
linter and final test fixes
This commit is contained in:
parent
0b91689cd5
commit
bdd57c8cfd
2 changed files with 94 additions and 66 deletions
|
@ -89,7 +89,7 @@ class Command(BaseCommand):
|
||||||
help="Only add suborganizations to newly created portfolios, skip existing ones.",
|
help="Only add suborganizations to newly created portfolios, skip existing ones.",
|
||||||
)
|
)
|
||||||
|
|
||||||
def handle(self, **options):
|
def handle(self, **options): # noqa: C901
|
||||||
agency_name = options.get("agency_name")
|
agency_name = options.get("agency_name")
|
||||||
branch = options.get("branch")
|
branch = options.get("branch")
|
||||||
parse_requests = options.get("parse_requests")
|
parse_requests = options.get("parse_requests")
|
||||||
|
@ -116,7 +116,6 @@ class Command(BaseCommand):
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise CommandError(f"Cannot find '{branch}' federal agencies in our database.")
|
raise CommandError(f"Cannot find '{branch}' federal agencies in our database.")
|
||||||
|
|
||||||
portfolios = []
|
portfolios = []
|
||||||
for federal_agency in agencies:
|
for federal_agency in agencies:
|
||||||
message = f"Processing federal agency '{federal_agency.agency}'..."
|
message = f"Processing federal agency '{federal_agency.agency}'..."
|
||||||
|
@ -127,6 +126,8 @@ class Command(BaseCommand):
|
||||||
federal_agency, parse_domains, parse_requests, both, skip_existing_portfolios
|
federal_agency, parse_domains, parse_requests, both, skip_existing_portfolios
|
||||||
)
|
)
|
||||||
portfolios.append(portfolio)
|
portfolios.append(portfolio)
|
||||||
|
if add_managers:
|
||||||
|
self.add_managers_to_portfolio(portfolio)
|
||||||
except Exception as exec:
|
except Exception as exec:
|
||||||
self.failed_portfolios.add(federal_agency)
|
self.failed_portfolios.add(federal_agency)
|
||||||
logger.error(exec)
|
logger.error(exec)
|
||||||
|
@ -196,27 +197,28 @@ class Command(BaseCommand):
|
||||||
# Fetch all domains associated with the portfolio
|
# Fetch all domains associated with the portfolio
|
||||||
domains = Domain.objects.filter(domain_info__portfolio=portfolio)
|
domains = Domain.objects.filter(domain_info__portfolio=portfolio)
|
||||||
logger.debug(f"domains: {domains}")
|
logger.debug(f"domains: {domains}")
|
||||||
domain_managers = set()
|
domain_managers: set[int] = set()
|
||||||
|
|
||||||
# Fetch all users with manager roles for the domains
|
# Fetch all users with manager roles for the domains
|
||||||
managers = UserDomainRole.objects.filter(
|
managers = UserDomainRole.objects.filter(domain__in=domains, role=UserDomainRole.Roles.MANAGER).values_list(
|
||||||
domain__in=domains,
|
"user", flat=True
|
||||||
role=UserDomainRole.Roles.MANAGER
|
)
|
||||||
).values_list('user', flat=True)
|
|
||||||
domain_managers.update(managers)
|
domain_managers.update(managers)
|
||||||
|
|
||||||
invited_managers = set()
|
invited_managers: set[str] = set()
|
||||||
|
|
||||||
# Get the emails of invited managers
|
# Get the emails of invited managers
|
||||||
for domain in domains:
|
for domain in domains:
|
||||||
domain_invitations = DomainInvitation.objects.filter(domain=domain, status=DomainInvitation.DomainInvitationStatus.INVITED).values_list('email', flat=True)
|
domain_invitations = DomainInvitation.objects.filter(
|
||||||
|
domain=domain, status=DomainInvitation.DomainInvitationStatus.INVITED
|
||||||
|
).values_list("email", flat=True)
|
||||||
invited_managers.update(domain_invitations)
|
invited_managers.update(domain_invitations)
|
||||||
|
|
||||||
logger.debug(f"invited_managers: {invited_managers}")
|
logger.debug(f"invited_managers: {invited_managers}")
|
||||||
for manager in domain_managers:
|
for id in domain_managers:
|
||||||
try:
|
try:
|
||||||
# manager is a user id
|
# manager is a user id
|
||||||
user = User.objects.get(id=manager)
|
user = User.objects.get(id=id)
|
||||||
_, created = UserPortfolioPermission.objects.get_or_create(
|
_, created = UserPortfolioPermission.objects.get_or_create(
|
||||||
portfolio=portfolio,
|
portfolio=portfolio,
|
||||||
user=user,
|
user=user,
|
||||||
|
@ -231,8 +233,8 @@ class Command(BaseCommand):
|
||||||
self.failed_managers.add(user)
|
self.failed_managers.add(user)
|
||||||
logger.debug(f"User '{user}' does not exist")
|
logger.debug(f"User '{user}' does not exist")
|
||||||
|
|
||||||
for manager in invited_managers:
|
for email in invited_managers:
|
||||||
self.create_portfolio_invitation(portfolio, manager)
|
self.create_portfolio_invitation(portfolio, email)
|
||||||
|
|
||||||
def create_portfolio_invitation(self, portfolio: Portfolio, email: str):
|
def create_portfolio_invitation(self, portfolio: Portfolio, email: str):
|
||||||
"""
|
"""
|
||||||
|
@ -257,7 +259,7 @@ class Command(BaseCommand):
|
||||||
_, created = UserPortfolioPermission.objects.get_or_create(
|
_, created = UserPortfolioPermission.objects.get_or_create(
|
||||||
portfolio=portfolio,
|
portfolio=portfolio,
|
||||||
user=user,
|
user=user,
|
||||||
defaults={"role": UserPortfolioPermission.RoleChoices.MANAGER},
|
defaults={"role": UserPortfolioRoleChoices.ORGANIZATION_MEMBER},
|
||||||
)
|
)
|
||||||
if created:
|
if created:
|
||||||
logger.info(f"Created portfolio permission for '{user}' to portfolio '{portfolio}'")
|
logger.info(f"Created portfolio permission for '{user}' to portfolio '{portfolio}'")
|
||||||
|
@ -329,7 +331,7 @@ class Command(BaseCommand):
|
||||||
),
|
),
|
||||||
prompt_title="Do you wish to commit this update to the database?",
|
prompt_title="Do you wish to commit this update to the database?",
|
||||||
):
|
):
|
||||||
message = f"prompted for execution"
|
message = "prompted for execution"
|
||||||
TerminalHelper.colorful_logger(logger.info, TerminalColors.MAGENTA, message)
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.MAGENTA, message)
|
||||||
DomainRequest.objects.bulk_update(updated_requests, ["federal_agency"])
|
DomainRequest.objects.bulk_update(updated_requests, ["federal_agency"])
|
||||||
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKBLUE, "Action completed successfully.")
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKBLUE, "Action completed successfully.")
|
||||||
|
|
|
@ -3,17 +3,11 @@ import boto3_mocking # type: ignore
|
||||||
from datetime import date, datetime, time
|
from datetime import date, datetime, time
|
||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
<<<<<<< HEAD
|
|
||||||
from registrar.models.portfolio_invitation import PortfolioInvitation
|
|
||||||
from registrar.models.senior_official import SeniorOfficial
|
|
||||||
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
|
||||||
from registrar.models.utility.portfolio_helper import UserPortfolioRoleChoices
|
|
||||||
=======
|
|
||||||
from registrar.models.domain_group import DomainGroup
|
from registrar.models.domain_group import DomainGroup
|
||||||
from registrar.models.portfolio_invitation import PortfolioInvitation
|
from registrar.models.portfolio_invitation import PortfolioInvitation
|
||||||
from registrar.models.senior_official import SeniorOfficial
|
from registrar.models.senior_official import SeniorOfficial
|
||||||
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
||||||
>>>>>>> origin/main
|
from registrar.models.utility.portfolio_helper import UserPortfolioRoleChoices
|
||||||
from registrar.utility.constants import BranchChoices
|
from registrar.utility.constants import BranchChoices
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.module_loading import import_string
|
from django.utils.module_loading import import_string
|
||||||
|
@ -1533,7 +1527,7 @@ class TestCreateFederalPortfolio(TestCase):
|
||||||
):
|
):
|
||||||
call_command("create_federal_portfolio", **kwargs)
|
call_command("create_federal_portfolio", **kwargs)
|
||||||
|
|
||||||
# @less_console_noise_decorator
|
@less_console_noise_decorator
|
||||||
def test_post_process_started_domain_requests_existing_portfolio(self):
|
def test_post_process_started_domain_requests_existing_portfolio(self):
|
||||||
"""Ensures that federal agency is cleared when agency name matches portfolio name.
|
"""Ensures that federal agency is cleared when agency name matches portfolio name.
|
||||||
As the name implies, this implicitly tests the "post_process_started_domain_requests" function.
|
As the name implies, this implicitly tests the "post_process_started_domain_requests" function.
|
||||||
|
@ -1862,7 +1856,6 @@ class TestCreateFederalPortfolio(TestCase):
|
||||||
self.assertEqual(existing_portfolio.notes, "Old notes")
|
self.assertEqual(existing_portfolio.notes, "Old notes")
|
||||||
self.assertEqual(existing_portfolio.creator, self.user)
|
self.assertEqual(existing_portfolio.creator, self.user)
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
@less_console_noise_decorator
|
@less_console_noise_decorator
|
||||||
def test_add_managers_from_domains(self):
|
def test_add_managers_from_domains(self):
|
||||||
"""Test that all domain managers are added as portfolio managers."""
|
"""Test that all domain managers are added as portfolio managers."""
|
||||||
|
@ -1874,14 +1867,13 @@ class TestCreateFederalPortfolio(TestCase):
|
||||||
UserDomainRole.objects.create(user=manager2, domain=self.domain, role=UserDomainRole.Roles.MANAGER)
|
UserDomainRole.objects.create(user=manager2, domain=self.domain, role=UserDomainRole.Roles.MANAGER)
|
||||||
|
|
||||||
# Run the management command
|
# Run the management command
|
||||||
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True)
|
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_domains=True, add_managers=True)
|
||||||
|
|
||||||
# Check that the portfolio was created
|
# Check that the portfolio was created
|
||||||
self.portfolio = Portfolio.objects.get(federal_agency=self.federal_agency)
|
self.portfolio = Portfolio.objects.get(federal_agency=self.federal_agency)
|
||||||
|
|
||||||
# Check that the users have been added as portfolio managers
|
# Check that the users have been added as portfolio managers
|
||||||
permissions = UserPortfolioPermission.objects.filter(portfolio=self.portfolio, user__in=[manager1, manager2])
|
permissions = UserPortfolioPermission.objects.filter(portfolio=self.portfolio, user__in=[manager1, manager2])
|
||||||
print(UserPortfolioPermission.objects.all())
|
|
||||||
|
|
||||||
# Check that the users have been added as portfolio managers
|
# Check that the users have been added as portfolio managers
|
||||||
self.assertEqual(permissions.count(), 2)
|
self.assertEqual(permissions.count(), 2)
|
||||||
|
@ -1894,13 +1886,11 @@ class TestCreateFederalPortfolio(TestCase):
|
||||||
|
|
||||||
# create a domain invitation for the manager
|
# create a domain invitation for the manager
|
||||||
_ = DomainInvitation.objects.create(
|
_ = DomainInvitation.objects.create(
|
||||||
domain=self.domain,
|
domain=self.domain, email="manager1@example.com", status=DomainInvitation.DomainInvitationStatus.INVITED
|
||||||
email="manager1@example.com",
|
|
||||||
status=DomainInvitation.DomainInvitationStatus.INVITED
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Run the management command
|
# Run the management command
|
||||||
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True)
|
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_domains=True, add_managers=True)
|
||||||
|
|
||||||
# Check that the portfolio was created
|
# Check that the portfolio was created
|
||||||
self.portfolio = Portfolio.objects.get(federal_agency=self.federal_agency)
|
self.portfolio = Portfolio.objects.get(federal_agency=self.federal_agency)
|
||||||
|
@ -1912,16 +1902,18 @@ class TestCreateFederalPortfolio(TestCase):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
invitation.status,
|
invitation.status,
|
||||||
PortfolioInvitation.PortfolioInvitationStatus.INVITED,
|
PortfolioInvitation.PortfolioInvitationStatus.INVITED,
|
||||||
"PortfolioInvitation status should remain INVITED for non-existent users."
|
"PortfolioInvitation status should remain INVITED for non-existent users.",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Verify that no duplicate invitations are created
|
# Verify that no duplicate invitations are created
|
||||||
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True)
|
self.run_create_federal_portfolio(
|
||||||
|
agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True
|
||||||
|
)
|
||||||
invitations = PortfolioInvitation.objects.filter(email="manager1@example.com", portfolio=self.portfolio)
|
invitations = PortfolioInvitation.objects.filter(email="manager1@example.com", portfolio=self.portfolio)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
invitations.count(),
|
invitations.count(),
|
||||||
1,
|
1,
|
||||||
"Duplicate PortfolioInvitation should not be created for the same email and portfolio."
|
"Duplicate PortfolioInvitation should not be created for the same email and portfolio.",
|
||||||
)
|
)
|
||||||
|
|
||||||
@less_console_noise_decorator
|
@less_console_noise_decorator
|
||||||
|
@ -1932,40 +1924,75 @@ class TestCreateFederalPortfolio(TestCase):
|
||||||
UserDomainRole.objects.create(user=manager, domain=self.domain, role=UserDomainRole.Roles.MANAGER)
|
UserDomainRole.objects.create(user=manager, domain=self.domain, role=UserDomainRole.Roles.MANAGER)
|
||||||
|
|
||||||
# Create a pre-existing portfolio
|
# Create a pre-existing portfolio
|
||||||
self.portfolio = Portfolio.objects.create(organization_name=self.federal_agency.agency, federal_agency=self.federal_agency, creator=self.user)
|
self.portfolio = Portfolio.objects.create(
|
||||||
|
organization_name=self.federal_agency.agency, federal_agency=self.federal_agency, creator=self.user
|
||||||
|
)
|
||||||
|
|
||||||
# Manually add the manager to the portfolio
|
# Manually add the manager to the portfolio
|
||||||
UserPortfolioPermission.objects.create(portfolio=self.portfolio, user=manager, roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER])
|
UserPortfolioPermission.objects.create(
|
||||||
|
portfolio=self.portfolio, user=manager, roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER]
|
||||||
|
)
|
||||||
|
|
||||||
# Run the management command
|
# Run the management command
|
||||||
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True)
|
self.run_create_federal_portfolio(
|
||||||
|
agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True
|
||||||
|
)
|
||||||
|
|
||||||
# Ensure that the manager is not duplicated
|
# Ensure that the manager is not duplicated
|
||||||
permissions = UserPortfolioPermission.objects.filter(portfolio=self.portfolio, user=manager)
|
permissions = UserPortfolioPermission.objects.filter(portfolio=self.portfolio, user=manager)
|
||||||
self.assertEqual(permissions.count(), 1)
|
self.assertEqual(permissions.count(), 1)
|
||||||
|
|
||||||
@less_console_noise_decorator
|
@less_console_noise_decorator
|
||||||
def test_add_managers_portfolio_already_exists(self):
|
def test_add_managers_skip_existing_portfolios(self):
|
||||||
"""Test that managers are skipped when the portfolio already exists."""
|
"""Test that managers are skipped when the portfolio already exists."""
|
||||||
|
|
||||||
# Create a pre-existing portfolio
|
# Create a pre-existing portfolio
|
||||||
self.portfolio = Portfolio.objects.create(organization_name=self.federal_agency.agency, federal_agency=self.federal_agency, creator=self.user)
|
self.portfolio = Portfolio.objects.create(
|
||||||
|
organization_name=self.federal_agency.agency, federal_agency=self.federal_agency, creator=self.user
|
||||||
|
)
|
||||||
|
|
||||||
|
domain_request_1 = completed_domain_request(
|
||||||
|
name="domain1.gov",
|
||||||
|
status=DomainRequest.DomainRequestStatus.IN_REVIEW,
|
||||||
|
generic_org_type=DomainRequest.OrganizationChoices.CITY,
|
||||||
|
federal_agency=self.federal_agency,
|
||||||
|
user=self.user,
|
||||||
|
portfolio=self.portfolio,
|
||||||
|
)
|
||||||
|
domain_request_1.approve()
|
||||||
|
domain1 = Domain.objects.get(name="domain1.gov")
|
||||||
|
|
||||||
|
domain_request_2 = completed_domain_request(
|
||||||
|
name="domain2.gov",
|
||||||
|
status=DomainRequest.DomainRequestStatus.IN_REVIEW,
|
||||||
|
generic_org_type=DomainRequest.OrganizationChoices.CITY,
|
||||||
|
federal_agency=self.federal_agency,
|
||||||
|
user=self.user,
|
||||||
|
portfolio=self.portfolio,
|
||||||
|
)
|
||||||
|
domain_request_2.approve()
|
||||||
|
domain2 = Domain.objects.get(name="domain2.gov")
|
||||||
|
|
||||||
# Create users and assign them as domain managers
|
# Create users and assign them as domain managers
|
||||||
manager1 = User.objects.create(username="manager1", email="manager1@example.com")
|
manager1 = User.objects.create(username="manager1", email="manager1@example.com")
|
||||||
manager2 = User.objects.create(username="manager2", email="manager2@example.com")
|
manager2 = User.objects.create(username="manager2", email="manager2@example.com")
|
||||||
UserDomainRole.objects.create(user=manager1, domain=self.domain, role=UserDomainRole.Roles.MANAGER)
|
UserDomainRole.objects.create(user=manager1, domain=domain1, role=UserDomainRole.Roles.MANAGER)
|
||||||
UserDomainRole.objects.create(user=manager2, domain=self.domain, role=UserDomainRole.Roles.MANAGER)
|
UserDomainRole.objects.create(user=manager2, domain=domain2, role=UserDomainRole.Roles.MANAGER)
|
||||||
|
|
||||||
# Run the management command
|
# Run the management command
|
||||||
self.run_create_federal_portfolio(agency_name=self.federal_agency.agency, parse_requests=True, add_managers=True)
|
self.run_create_federal_portfolio(
|
||||||
|
agency_name=self.federal_agency.agency,
|
||||||
|
parse_requests=True,
|
||||||
|
add_managers=True,
|
||||||
|
skip_existing_portfolios=True,
|
||||||
|
)
|
||||||
|
|
||||||
# Check that managers were added to the portfolio
|
# Check that managers were added to the portfolio
|
||||||
permissions = UserPortfolioPermission.objects.filter(portfolio=self.portfolio, user__in=[manager1, manager2])
|
permissions = UserPortfolioPermission.objects.filter(portfolio=self.portfolio, user__in=[manager1, manager2])
|
||||||
self.assertEqual(permissions.count(), 2)
|
self.assertEqual(permissions.count(), 2)
|
||||||
for perm in permissions:
|
for perm in permissions:
|
||||||
self.assertIn(UserPortfolioRoleChoices.ORGANIZATION_MEMBER, perm.roles)
|
self.assertIn(UserPortfolioRoleChoices.ORGANIZATION_MEMBER, perm.roles)
|
||||||
=======
|
|
||||||
def test_skip_existing_portfolios(self):
|
def test_skip_existing_portfolios(self):
|
||||||
"""Tests the skip_existing_portfolios to ensure that it doesn't add
|
"""Tests the skip_existing_portfolios to ensure that it doesn't add
|
||||||
suborgs, domain requests, and domain info."""
|
suborgs, domain requests, and domain info."""
|
||||||
|
@ -2466,4 +2493,3 @@ class TestRemovePortfolios(TestCase):
|
||||||
|
|
||||||
# Check that the portfolio was deleted
|
# Check that the portfolio was deleted
|
||||||
self.assertFalse(Portfolio.objects.filter(organization_name="Test with suborg").exists())
|
self.assertFalse(Portfolio.objects.filter(organization_name="Test with suborg").exists())
|
||||||
>>>>>>> origin/main
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue