from . import coerce_methods as coerce_methods from collections import OrderedDict DEBUG = False def mapper(mapping, data): """ MDG - 27/01/2021 This method handles the mapping declared within the endpoint. For each parameter, it applies the coerce method (if present) or simply renames the parameter key. Usage example: Declare within the endpoint a Dict similar to this: mapping = { "cards_mapping": { "firstname": ("fn", coerce_methods.coerce_fn_to_microsip_firstname, None), "lastname": ("fn", coerce_methods.coerce_fn_to_microsip_lastname, None), "phone": ("tel", coerce_methods.clean_phone_number_from_symbols, None), "address": ("adr", coerce_methods.coerce_adr_to_microsip_address, None), "city": ("adr", coerce_methods.coerce_adr_to_microsip_city, None), "state": ("adr", coerce_methods.coerce_adr_to_microsip_state, None), "zip": ("adr", coerce_methods.coerce_adr_to_microsip_zip, None), "email": ("email", None, None) #("categories": "", None), }, "base_mapping": { "items": ("cards", None, "cards_mapping"), } } The "base_mapping" is the first level mapping. In -> "items": ("cards", None, "cards_mapping"), - "items" is the parameter name in which the parameter to handle will be renamed - "cards" is the parameter name to handle (that comes from logics) - "None" is the coerce method to eventually apply - "cards_mapping" is the sub level mapping (the mapping of the single objects within the cards array) The mapping can be recursive (infinite level of sub mapping) IMPORTANT: the base level mapping has to be named "base_mapping". The sub level mappings have to be named with the dict key used for that mapping. """ currentMapping = mapping if isinstance(data, list): responseData = [] if DEBUG: print("[DEBUG] Data input in mapping:") if DEBUG: print(data) for item in data: responseItem = OrderedDict() for key, value in currentMapping.items(): responseParameter = key majornetParameter, coerceMethod, subMapping = value if majornetParameter in item: if DEBUG: print("[DEBUG] Handling majornetParameter: ") if DEBUG: print(majornetParameter) if subMapping: mapper(subMapping, mapping_item[majornetParameter]) if coerceMethod: responseItem[responseParameter] = coerceMethod(item[majornetParameter]) else: responseItem[responseParameter] = item[majornetParameter] if DEBUG: print("[DEBUG] Mapping to responseParameter: ") if DEBUG: print(responseParameter) if DEBUG: print("[DEBUG] Result item: ") if DEBUG: print(responseItem) if DEBUG: print("\n") responseData.append(responseItem) if DEBUG: print("\n\n\n[DEBUG] Result response data in list:") if DEBUG: print(responseData) else: responseData = OrderedDict() if 'base_mapping' in mapping: currentMapping = mapping['base_mapping'] for key, value in currentMapping.items(): responseParameter = key majornetParameter, coerceMethod, subMapping = value if majornetParameter in data: if subMapping: responseData[responseParameter] = mapper(mapping[subMapping], data[majornetParameter]) else: responseData[responseParameter] = data[majornetParameter] if coerceMethod: responseData[responseParameter] = coerceMethod(data[responseParameter]) if DEBUG: print("[DEBUG] Result response data returning from mapping:") if DEBUG: print(responseData) return responseData