|
4 | 4 | from collections.abc import Iterable, Generator |
5 | 5 | from enum import StrEnum |
6 | 6 | from typing import Any, Mapping, cast, NotRequired |
| 7 | +from functools import partial |
7 | 8 |
|
8 | 9 | import openpyxl |
9 | 10 | from PIL import Image |
|
14 | 15 | from country_workspace.contrib.kobo.api.data.helpers import VALUE_FORMAT |
15 | 16 | from country_workspace.datasources.utils import datetime_to_date, date_to_iso_string |
16 | 17 | from country_workspace.models import AsyncJob, Batch, Household, Individual |
17 | | -from country_workspace.utils.config import BatchNameConfig, FailIfAlienConfig |
| 18 | +from country_workspace.utils.config import BatchNameConfig, ValidateModeConfig |
18 | 19 | from country_workspace.utils.fields import Record, clean_field_names |
19 | 20 | from country_workspace.utils.functional import compose |
| 21 | +from country_workspace.utils.types import ValidateBeneficiaries |
20 | 22 | from country_workspace.validators.beneficiaries import validate_beneficiaries |
21 | 23 |
|
22 | 24 | RDI = str | io.BytesIO |
|
29 | 31 | PEOPLE = "people" |
30 | 32 |
|
31 | 33 |
|
32 | | -class Config(BatchNameConfig, FailIfAlienConfig): |
| 34 | +class Config(BatchNameConfig, ValidateModeConfig): |
33 | 35 | master_detail: bool |
34 | 36 | household_pk_col: NotRequired[str] |
35 | 37 | master_column_label: NotRequired[str] |
@@ -219,20 +221,24 @@ def import_from_rdi(job: AsyncJob) -> dict[str, int]: |
219 | 221 | imported_by=job.owner, |
220 | 222 | source=Batch.BatchSource.RDI, |
221 | 223 | ) |
| 224 | + validate = partial(validate_beneficiaries, config=config, office=job.program.country_office) |
222 | 225 | if config["master_detail"]: |
223 | | - return _import_master_detail(job, batch, config) |
224 | | - return _import_people_only(job, batch, config) |
| 226 | + return _import_master_detail(job, batch, config, validate) |
| 227 | + return _import_people_only(job, batch, config, validate) |
225 | 228 |
|
226 | 229 |
|
227 | | -def _import_master_detail(job: AsyncJob, batch: Batch, config: dict) -> dict[str, int]: |
| 230 | +def _import_master_detail( |
| 231 | + job: AsyncJob, batch: Batch, config: Config, validate: ValidateBeneficiaries |
| 232 | +) -> dict[str, int]: |
228 | 233 | household_sheet, individual_sheet = read_sheets(config, job.file, SheetName.HOUSEHOLDS, SheetName.INDIVIDUALS) |
229 | 234 | household_mapping = process_households(household_sheet, job, batch, config) |
230 | 235 | individuals_mapping = process_beneficiaries(individual_sheet, job, batch, config, household_mapping) |
231 | | - validate_beneficiaries(config, household_mapping) |
| 236 | + validate(household_mapping) |
232 | 237 | return {"household": len(household_mapping), "individual": len(individuals_mapping)} |
233 | 238 |
|
234 | 239 |
|
235 | | -def _import_people_only(job: AsyncJob, batch: Batch, config: dict) -> dict[str, int]: |
| 240 | +def _import_people_only(job: AsyncJob, batch: Batch, config: Config, validate: ValidateBeneficiaries) -> dict[str, int]: |
236 | 241 | (people_sheet,) = read_sheets(config, job.file, SheetName.PEOPLE) |
237 | | - validate_beneficiaries(config, people_mapping := process_beneficiaries(people_sheet, job, batch, config)) |
| 242 | + people_mapping = process_beneficiaries(people_sheet, job, batch, config) |
| 243 | + validate(people_mapping) |
238 | 244 | return {"people": len(people_mapping)} |
0 commit comments