from core.models.Result import ResultError def result_is_valid(result): if hasattr(result, 'valid'): return bool(result.valid) if isinstance(result, dict): return bool(result.get('valid')) return False def result_data(result): if hasattr(result, 'data'): return result.data if isinstance(result, dict): return result.get('data') or result.get('billing_code') return None def result_message(result, default='Operation failed.'): if hasattr(result, 'message') and result.message: return str(result.message) if isinstance(result, dict): return str(result.get('message') or result.get('error_code') or default) return default def result_error_value(result, default=ResultError.UNKNOWN.value): error_type = None if hasattr(result, 'error_type'): error_type = result.error_type elif isinstance(result, dict): error_type = result.get('error_type') or result.get('error_code') if error_type is None: return default if hasattr(error_type, 'value'): return str(error_type.value) return str(error_type) def operation_failure_payload(operation, result=None, message=None, exception=None, context=None): if exception is not None: error_value = ResultError.UNKNOWN.value detail = str(exception) or type(exception).__name__ else: error_value = result_error_value(result) detail = message or result_message(result) title = _operation_title(operation, error_value) return { 'operation': operation, 'title': title, 'message': detail, 'error_type': error_value, 'severity': _severity_for(error_value), 'actions': _actions_for(error_value), 'context': context or {}, } def _operation_title(operation, error_value): if error_value == ResultError.CONNECTION.value: return 'Connection Problem' if operation == 'use_ticket' and error_value == ResultError.SUBSCRIPTION.value: return 'Ticket Expired' if operation == 'use_ticket': return 'Ticket Use Failed' if operation == 'enable_profile': return 'Profile Enable Failed' if operation == 'disable_profile': return 'Profile Disable Failed' return 'Operation Failed' def _severity_for(error_value): if error_value in { ResultError.CONNECTION.value, ResultError.SUBSCRIPTION.value, ResultError.MISSING_FILE.value, ResultError.MISSING_DATA.value, }: return 'warning' return 'error' def _actions_for(error_value): if error_value == ResultError.CONNECTION.value: return [ {'key': 'retry', 'label': 'Try Again', 'role': 'primary'}, {'key': 'cancel', 'label': 'Cancel', 'role': 'secondary'}, ] return [ {'key': 'dismiss', 'label': 'OK', 'role': 'primary'}, ]