This commit is contained in:
zandercymatics 2025-01-27 08:17:54 -07:00
parent 3dff276079
commit 0fc136cf54
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
2 changed files with 41 additions and 17 deletions

View file

@ -908,12 +908,13 @@ Example (only requests): `./manage.py create_federal_portfolio --branch "executi
##### Parameters ##### Parameters
| | Parameter | Description | | | Parameter | Description |
|:-:|:-------------------------- |:-------------------------------------------------------------------------------------------| |:-:|:---------------------------- |:-------------------------------------------------------------------------------------------|
| 1 | **agency_name** | Name of the FederalAgency record surrounded by quotes. For instance,"AMTRAK". | | 1 | **agency_name** | Name of the FederalAgency record surrounded by quotes. For instance,"AMTRAK". |
| 2 | **branch** | Creates a portfolio for each federal agency in a branch: executive, legislative, judicial | | 2 | **branch** | Creates a portfolio for each federal agency in a branch: executive, legislative, judicial |
| 3 | **both** | If True, runs parse_requests and parse_domains. | | 3 | **both** | If True, runs parse_requests and parse_domains. |
| 4 | **parse_requests** | If True, then the created portfolio is added to all related DomainRequests. | | 4 | **parse_requests** | If True, then the created portfolio is added to all related DomainRequests. |
| 5 | **parse_domains** | If True, then the created portfolio is added to all related Domains. | | 5 | **parse_domains** | If True, then the created portfolio is added to all related Domains. |
| 6 | **skip_existing_portfolios** | If True, then the script will only iterate through DomainRequest / DomainInfo records with portfolio__isnull=True |
- Parameters #1-#2: Either `--agency_name` or `--branch` must be specified. Not both. - Parameters #1-#2: Either `--agency_name` or `--branch` must be specified. Not both.
- Parameters #2-#3, you cannot use `--both` while using these. You must specify either `--parse_requests` or `--parse_domains` seperately. While all of these parameters are optional in that you do not need to specify all of them, - Parameters #2-#3, you cannot use `--both` while using these. You must specify either `--parse_requests` or `--parse_domains` seperately. While all of these parameters are optional in that you do not need to specify all of them,

View file

@ -64,6 +64,11 @@ class Command(BaseCommand):
action=argparse.BooleanOptionalAction, action=argparse.BooleanOptionalAction,
help="Adds portfolio to both requests and domains", help="Adds portfolio to both requests and domains",
) )
parser.add_argument(
"--skip_existing_portfolios",
action=argparse.BooleanOptionalAction,
help="Only add suborganizations to newly created portfolios, skip existing ones.",
)
def handle(self, **options): def handle(self, **options):
agency_name = options.get("agency_name") agency_name = options.get("agency_name")
@ -71,6 +76,7 @@ class Command(BaseCommand):
parse_requests = options.get("parse_requests") parse_requests = options.get("parse_requests")
parse_domains = options.get("parse_domains") parse_domains = options.get("parse_domains")
both = options.get("both") both = options.get("both")
skip_existing_portfolios = options.get("skip_existing_portfolios")
if not both: if not both:
if not parse_requests and not parse_domains: if not parse_requests and not parse_domains:
@ -97,7 +103,9 @@ class Command(BaseCommand):
TerminalHelper.colorful_logger(logger.info, TerminalColors.MAGENTA, message) TerminalHelper.colorful_logger(logger.info, TerminalColors.MAGENTA, message)
try: try:
# C901 'Command.handle' is too complex (12) # C901 'Command.handle' is too complex (12)
portfolio = self.handle_populate_portfolio(federal_agency, parse_domains, parse_requests, both) portfolio = self.handle_populate_portfolio(
federal_agency, parse_domains, parse_requests, both, skip_existing_portfolios
)
portfolios.append(portfolio) portfolios.append(portfolio)
except Exception as exec: except Exception as exec:
self.failed_portfolios.add(federal_agency) self.failed_portfolios.add(federal_agency)
@ -173,17 +181,17 @@ class Command(BaseCommand):
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.")
def handle_populate_portfolio(self, federal_agency, parse_domains, parse_requests, both): def handle_populate_portfolio(self, federal_agency, parse_domains, parse_requests, both, skip_existing_portfolios):
"""Attempts to create a portfolio. If successful, this function will """Attempts to create a portfolio. If successful, this function will
also create new suborganizations""" also create new suborganizations"""
portfolio, _ = self.create_portfolio(federal_agency) portfolio, _ = self.create_portfolio(federal_agency)
self.create_suborganizations(portfolio, federal_agency) self.create_suborganizations(portfolio, federal_agency)
if parse_domains or both: if parse_domains or both:
self.handle_portfolio_domains(portfolio, federal_agency) self.handle_portfolio_domains(portfolio, federal_agency, skip_existing_portfolios)
if parse_requests or both: if parse_requests or both:
self.handle_portfolio_requests(portfolio, federal_agency) self.handle_portfolio_requests(portfolio, federal_agency, skip_existing_portfolios)
return portfolio return portfolio
@ -274,7 +282,9 @@ class Command(BaseCommand):
else: else:
TerminalHelper.colorful_logger(logger.warning, TerminalColors.YELLOW, "No suborganizations added") TerminalHelper.colorful_logger(logger.warning, TerminalColors.YELLOW, "No suborganizations added")
def handle_portfolio_requests(self, portfolio: Portfolio, federal_agency: FederalAgency): def handle_portfolio_requests(
self, portfolio: Portfolio, federal_agency: FederalAgency, skip_existing_portfolios: bool
):
""" """
Associate portfolio with domain requests for a federal agency. Associate portfolio with domain requests for a federal agency.
Updates all relevant domain request records. Updates all relevant domain request records.
@ -284,9 +294,16 @@ class Command(BaseCommand):
DomainRequest.DomainRequestStatus.INELIGIBLE, DomainRequest.DomainRequestStatus.INELIGIBLE,
DomainRequest.DomainRequestStatus.REJECTED, DomainRequest.DomainRequestStatus.REJECTED,
] ]
if skip_existing_portfolios:
domain_requests = DomainRequest.objects.filter(
federal_agency=federal_agency, portfolio__isnull=True
).exclude(status__in=invalid_states)
else:
domain_requests = DomainRequest.objects.filter(federal_agency=federal_agency).exclude( domain_requests = DomainRequest.objects.filter(federal_agency=federal_agency).exclude(
status__in=invalid_states status__in=invalid_states
) )
if not domain_requests.exists(): if not domain_requests.exists():
message = f""" message = f"""
Portfolio '{portfolio}' not added to domain requests: no valid records found. Portfolio '{portfolio}' not added to domain requests: no valid records found.
@ -329,14 +346,20 @@ class Command(BaseCommand):
message = f"Added portfolio '{portfolio}' to {len(domain_requests)} domain requests." message = f"Added portfolio '{portfolio}' to {len(domain_requests)} domain requests."
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, message) TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, message)
def handle_portfolio_domains(self, portfolio: Portfolio, federal_agency: FederalAgency): def handle_portfolio_domains(
self, portfolio: Portfolio, federal_agency: FederalAgency, skip_existing_portfolios: bool
):
""" """
Associate portfolio with domains for a federal agency. Associate portfolio with domains for a federal agency.
Updates all relevant domain information records. Updates all relevant domain information records.
Returns a queryset of DomainInformation objects, or None if nothing changed. Returns a queryset of DomainInformation objects, or None if nothing changed.
""" """
if skip_existing_portfolios:
domain_infos = DomainInformation.objects.filter(federal_agency=federal_agency, portfolio__isnull=True)
else:
domain_infos = DomainInformation.objects.filter(federal_agency=federal_agency) domain_infos = DomainInformation.objects.filter(federal_agency=federal_agency)
if not domain_infos.exists(): if not domain_infos.exists():
message = f""" message = f"""
Portfolio '{portfolio}' not added to domains: no valid records found. Portfolio '{portfolio}' not added to domains: no valid records found.