From 7950fcd26a0e7a4d54b11c9eb28c2c2876277c03 Mon Sep 17 00:00:00 2001 From: Rajandeep Date: Fri, 11 Sep 2026 08:54:25 -0700 Subject: [PATCH] 34761 - Active Candidates --- data-tool/flows/auth/inspect_auth_flow.py | 12 +++++++++++- data-tool/flows/auth/verify_auth_flow.py | 10 ++++++++++ data-tool/flows/config.py | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/data-tool/flows/auth/inspect_auth_flow.py b/data-tool/flows/auth/inspect_auth_flow.py index be8318adcf..854f4849e1 100644 --- a/data-tool/flows/auth/inspect_auth_flow.py +++ b/data-tool/flows/auth/inspect_auth_flow.py @@ -102,7 +102,7 @@ class InspectAuthSettings: invite_expiry_days: int = 7 invite_expiry_cutoff: datetime | None = None invite_criteria: InviteCriteria | None = None - + file_cnt_last_2yrs: int | None = None @property def run_verify(self) -> bool: """Return False so shared Auth batches only read Auth state.""" @@ -187,6 +187,15 @@ def validate_inspect_config(config: Any) -> InspectAuthSettings: raise ValueError("AUTH_REPORT_BATCH_SIZE must be greater than 0") inspect_filter = parse_inspect_filter(getattr(config, "INSPECT_AUTH_FILTER", None), "INSPECT_AUTH_FILTER") + file_cnt_raw = blank_to_none(getattr(config, "INSPECT_AUTH_FILE_CNT_LAST_2YRS", None)) + file_cnt_last_2yrs = None + if file_cnt_raw is not None: + try: + file_cnt_last_2yrs = int(file_cnt_raw) + except (TypeError, ValueError) as exc: + raise ValueError("INSPECT_AUTH_FILE_CNT_LAST_2YRS must be a non-negative integer") from exc + if file_cnt_last_2yrs < 0: + raise ValueError("INSPECT_AUTH_FILE_CNT_LAST_2YRS must be a non-negative integer") invite_expiry_days = parse_invite_expiry_days( getattr(config, "INSPECT_AUTH_INVITE_EXPIRY_DAYS", None) ) @@ -266,6 +275,7 @@ def validate_inspect_config(config: Any) -> InspectAuthSettings: invite_expiry_days=invite_expiry_days, invite_expiry_cutoff=invite_expiry_cutoff, invite_criteria=invite_criteria, + file_cnt_last_2yrs=file_cnt_last_2yrs, ) diff --git a/data-tool/flows/auth/verify_auth_flow.py b/data-tool/flows/auth/verify_auth_flow.py index 3f002e95d5..274ad313f6 100644 --- a/data-tool/flows/auth/verify_auth_flow.py +++ b/data-tool/flows/auth/verify_auth_flow.py @@ -1441,6 +1441,16 @@ def build_candidate_queries(config: Any, settings: AuthCandidateSettings | None auth_mig_group_ids=settings.auth_mig_group_ids, auth_mig_batch_ids=settings.auth_mig_batch_ids, ).strip() + file_cnt_gt = getattr(settings, "file_cnt_last_2yrs", None) + if file_cnt_gt is not None: + base_sql = f""" + SELECT candidates.corp_num + FROM ( + {base_sql} + ) candidates + INNER JOIN mv_legacy_corps_data lcd ON lcd.corp_num = candidates.corp_num + WHERE lcd.file_cnt_last_2yrs > {int(file_cnt_gt)} + """.strip() count_sql = f""" SELECT COUNT(*) diff --git a/data-tool/flows/config.py b/data-tool/flows/config.py index 789db8733a..721c5e78a6 100644 --- a/data-tool/flows/config.py +++ b/data-tool/flows/config.py @@ -245,6 +245,7 @@ class _Config(): # pylint: disable=too-few-public-methods # inspect Auth flow. HAS_CONTACT / ENTITY_WITHOUT_CONTACT mean usable contact email, # not merely any raw contact row. INSPECT_AUTH_FILTER = (os.getenv('INSPECT_AUTH_FILTER') or 'ALL').strip() or 'ALL' + INSPECT_AUTH_FILE_CNT_LAST_2YRS = os.getenv('INSPECT_AUTH_FILE_CNT_LAST_2YRS') # Invitation settings stay raw here and are validated only by inspect-auth. # INSPECT_AUTH_INVITE_CRITERIA is an AND-composed clause list such as # count>=3, all_expired, age[1]>=90, newest_age>30. Positions are chronological