diff --git a/app.py b/app.py index 619b57a..2c26ecb 100644 --- a/app.py +++ b/app.py @@ -121,9 +121,24 @@ def get_installs(): LEFT JOIN folders f ON i.folder_id = f.id """) rows = cursor.fetchall() - # Форматируем время для вывода в читаемом формате + # Обработка времени в разных форматах + def format_time(time_str): + if not time_str: + return None + try: + # Пробуем разобрать ISO 8601 (с T и Z) + dt = datetime.datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.strftime("%Y-%m-%d %H:%M:%S") + except ValueError: + try: + # Пробуем разобрать наш читаемый формат + dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") + return dt.strftime("%Y-%m-%d %H:%M:%S") + except ValueError: + return time_str # Возвращаем как есть, если формат не распознан + return [{"id": row[0], "rust_id": row[1], "computer_name": row[2], - "install_time": datetime.datetime.strptime(row[3], "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S") if row[3] else None, + "install_time": format_time(row[3]), "folder_id": row[4], "folder_name": row[5], "protocol": row[6]} for row in rows] @@ -198,8 +213,8 @@ async def export_csv(folder_id: int | None = Query(None, description="ID пап writer = csv.writer(output, lineterminator='\n') writer.writerow(['ID подключения', 'Имя компьютера', 'Время установки', 'Папка', 'Протокол']) for row in rows: - # Форматируем время для CSV в читаемом формате - install_time = datetime.datetime.strptime(row[2], "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S") if row[2] else "" + # Обработка времени в разных форматах + install_time = format_time(row[2]) if row[2] else "" writer.writerow([row[0], row[1], install_time, row[3], row[4]]) headers = { @@ -208,6 +223,21 @@ async def export_csv(folder_id: int | None = Query(None, description="ID пап } return StreamingResponse(iter([output.getvalue()]), headers=headers) +def format_time(time_str): + if not time_str: + return None + try: + # Пробуем разобрать ISO 8601 (с T и Z) + dt = datetime.datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S.%fZ") + return dt.strftime("%Y-%m-%d %H:%M:%S") + except ValueError: + try: + # Пробуем разобрать наш читаемый формат + dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") + return dt.strftime("%Y-%m-%d %H:%M:%S") + except ValueError: + return time_str # Возвращаем как есть, если формат не распознан + @app.post("/api/import/csv") async def import_csv(file: UploadFile = File(...), folder_id: int | None = Query(None, description="ID папки для импорта, если None - использовать 'Несортированные'")): try: @@ -229,12 +259,19 @@ async def import_csv(file: UploadFile = File(...), folder_id: int | None = Query if cursor.fetchone(): continue # Пропускаем дублирующуюся запись - # Проверяем формат времени + # Проверяем и форматируем время if install_time: try: - datetime.datetime.strptime(install_time, "%Y-%m-%d %H:%M:%S") + # Пробуем разобрать время в формате YYYY-MM-DD HH:MM:SS + dt = datetime.datetime.strptime(install_time, "%Y-%m-%d %H:%M:%S") + install_time = dt.strftime("%Y-%m-%d %H:%M:%S") except ValueError: - raise HTTPException(status_code=400, detail=f"Неверный формат времени для записи с ID {rust_id}. Используйте YYYY-MM-DD HH:MM:SS") + try: + # Пробуем разобрать ISO 8601 (если в CSV другой формат) + dt = datetime.datetime.strptime(install_time, "%Y-%m-%dT%H:%M:%S.%fZ") + install_time = dt.strftime("%Y-%m-%d %H:%M:%S") + except ValueError: + raise HTTPException(status_code=400, detail=f"Неверный формат времени для записи с ID {rust_id}. Используйте YYYY-MM-DD HH:MM:SS или ISO 8601") # Получаем или создаем ID папки if folder_name: