docker environ removed. Rollback to development
This commit is contained in:
@@ -1,92 +0,0 @@
|
||||
import os
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
import requests
|
||||
from django.db import models
|
||||
from asgiref.sync import sync_to_async
|
||||
|
||||
|
||||
class APIDataLogger:
|
||||
"""Класс для работы с API, сохранения и обработки данных."""
|
||||
|
||||
def __init__(self, name, url, token=None, username=None, password=None):
|
||||
self.name = name
|
||||
self.url = url
|
||||
self.token = token
|
||||
self.username = username
|
||||
self.password = password
|
||||
self.output_dir = "modules"
|
||||
|
||||
def ensure_directory_exists(self, path):
|
||||
"""Создать директорию, если она не существует."""
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
|
||||
def fetch_data(self, additional_data=None):
|
||||
"""Получить данные из API."""
|
||||
headers = {"Content-Type": "application/json"}
|
||||
data = additional_data or {}
|
||||
|
||||
if self.token:
|
||||
data["token"] = self.token
|
||||
|
||||
response = requests.post(self.url, headers=headers, json=data, auth=(self.username, self.password) if self.username and self.password else None)
|
||||
if response.status_code != 200:
|
||||
print(f'{self.name}: API запрос не удался. Код статуса: {response.status_code}')
|
||||
return []
|
||||
|
||||
return response.json()
|
||||
|
||||
def save_data(self, data, suffix):
|
||||
"""Сохранить данные в файл JSON."""
|
||||
now = datetime.now()
|
||||
current_date = now.strftime('%Y-%m-%d')
|
||||
directory = os.path.join(self.output_dir, current_date, self.name)
|
||||
self.ensure_directory_exists(directory)
|
||||
|
||||
filename = f"{self.name} {suffix}.json"
|
||||
filepath = os.path.join(directory, filename)
|
||||
with open(filepath, 'w') as file:
|
||||
json.dump(data, file)
|
||||
return filepath
|
||||
|
||||
def load_previous_data(self, suffixes):
|
||||
"""Загрузить данные из файлов за текущий и предыдущий интервалы."""
|
||||
now = datetime.now()
|
||||
current_date = now.strftime('%Y-%m-%d')
|
||||
yesterday_date = (now - timedelta(days=1)).strftime('%Y-%m-%d')
|
||||
|
||||
directories = [(yesterday_date, "21"), (current_date, "9")] if 9 <= now.hour < 21 else [(current_date, "9"), (current_date, "21")]
|
||||
data_combined = []
|
||||
|
||||
for date, suffix in directories:
|
||||
filepath = os.path.join(self.output_dir, date, self.name, f"{self.name} {suffix}.json")
|
||||
try:
|
||||
with open(filepath, 'r') as file:
|
||||
data_combined.extend(json.load(file))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
return data_combined
|
||||
|
||||
def filter_data(self, data, filter_function):
|
||||
"""Фильтрация данных с использованием переданной функции."""
|
||||
return filter_function(data)
|
||||
|
||||
def process_and_save(self, additional_data=None, filter_function=None):
|
||||
"""Основной процесс: запрос, сохранение, чтение, фильтрация."""
|
||||
now = datetime.now()
|
||||
suffix = "9" if 9 <= now.hour < 21 else "21"
|
||||
|
||||
# Шаг 1: Получить данные
|
||||
raw_data = self.fetch_data(additional_data)
|
||||
self.save_data(raw_data, suffix)
|
||||
|
||||
# Шаг 2: Загрузить данные за текущий и предыдущий интервал
|
||||
combined_data = self.load_previous_data(["9", "21"])
|
||||
|
||||
# Шаг 3: Фильтрация
|
||||
if filter_function:
|
||||
combined_data = self.filter_data(combined_data, filter_function)
|
||||
|
||||
return combined_data
|
||||
@@ -1,53 +0,0 @@
|
||||
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
|
||||
Reference in New Issue
Block a user