"""Reports utils.""" import typing from pydantic import BaseModel from src.constants import BANK_FIELDS_DETAILS_NAMES, BANK_FIELDS_MAPPING def flatten_model( obj: typing.Any, parent_key: str = '', sep: str = '_' ) -> dict[str, typing.Any]: flat_dict = {} if isinstance(obj, dict): for k, v in obj.items(): new_key = f'{parent_key}{sep}{k}' if parent_key else k flat_dict.update(flatten_model(v, new_key, sep)) elif isinstance(obj, list): # special handling for list of name/value dicts or models if all( isinstance(item, (BaseModel, dict)) and 'name' in item and 'value' in item for item in obj ): for item in obj: name = item['name'] if isinstance(item, dict) else item.name value = item['value'] if isinstance(item, dict) else item.value key = f'{parent_key}{sep}{name}' flat_dict[key] = value else: for i, item in enumerate(obj): new_key = f'{parent_key}{sep}{i}' if parent_key else str(i) flat_dict.update(flatten_model(item, new_key, sep)) elif isinstance(obj, BaseModel): for field_name, field_value in obj.model_dump().items(): new_key = f'{parent_key}{sep}{field_name}' if parent_key else field_name flat_dict.update(flatten_model(field_value, new_key, sep)) else: flat_dict[parent_key] = obj return flat_dict def map_bank_details_fields(flat_dict: dict[str, typing.Any]) -> dict[str, typing.Any]: bank_details_field_mapping = { name: f'payout_method_bank_field_details_{name}' for name in BANK_FIELDS_DETAILS_NAMES } all_fields_mapping = { **BANK_FIELDS_MAPPING, **bank_details_field_mapping, } return { output_key: flat_dict.get(input_key, None) for output_key, input_key in all_fields_mapping.items() }