from typing import Any from src.connectors.exceptions import OwsPayeeException from src.error_handlers.common import get_error_details from src.models import NewTaxDetails def flatten_fields( field_error_map: dict[str, Any], values: object, fields: list[str], data: dict[str, Any], ) -> None: """Hierarchical fields map to list.""" for key, error in field_error_map.items(): value = getattr(values, key, None) if values else None if isinstance(error, dict): flatten_fields(error, value, fields, data) else: if isinstance(error, list): error = ', '.join(error) fields.append(f'{key}: {error}') data[key] = value def handle_save_error( account_payee_id: int, payload: NewTaxDetails, exception: Exception ) -> None: status_code, error_data = get_error_details(exception) error_code = str(exception) additional_data = dict(account_payee_id=account_payee_id) if error_data and status_code == 400: data_message = error_data.get('message') if isinstance(data_message, str): error_code = error_data['message'] elif isinstance(data_message, dict): fields: list[str] = [] flatten_fields(data_message, payload, fields, additional_data) error_code = ', '.join(sorted(fields)) raise OwsPayeeException( 'Failed to save tax details', error_code, additional_data, )