54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import json
|
|
from datetime import datetime
|
|
|
|
def parse_pms_data(data, parser_settings):
|
|
date_format = parser_settings["date_format"]
|
|
fields_mapping = parser_settings["fields_mapping"]
|
|
conditions = parser_settings.get("conditions", {})
|
|
|
|
parsed_data = []
|
|
|
|
for record in data:
|
|
# Применение условий фильтрации
|
|
if conditions:
|
|
for condition_field, expected_value in conditions.items():
|
|
if record.get(condition_field) != expected_value:
|
|
break
|
|
else:
|
|
# Условие выполнено
|
|
pass
|
|
else:
|
|
# Условие отсутствует
|
|
pass
|
|
|
|
# Разбор полей
|
|
parsed_record = {}
|
|
for internal_field, external_field in fields_mapping.items():
|
|
if "." in external_field: # Например, "guests[0].lastName"
|
|
keys = external_field.split(".")
|
|
value = record
|
|
try:
|
|
for key in keys:
|
|
if key.endswith("]"): # Обработка индексов, например, "guests[0]"
|
|
key, index = key[:-1].split("[")
|
|
value = value[key][int(index)]
|
|
else:
|
|
value = value[key]
|
|
except (KeyError, IndexError, TypeError):
|
|
value = None
|
|
else:
|
|
value = record.get(external_field)
|
|
|
|
# Преобразование дат
|
|
if "date" in internal_field or "time" in internal_field:
|
|
try:
|
|
value = datetime.strptime(value, date_format)
|
|
except (ValueError, TypeError):
|
|
value = None
|
|
|
|
parsed_record[internal_field] = value
|
|
|
|
parsed_data.append(parsed_record)
|
|
|
|
return parsed_data
|