diff --git a/fastapi-app/requirements.txt b/fastapi-app/requirements.txt index 712cf65..8bfa1b5 100644 Binary files a/fastapi-app/requirements.txt and b/fastapi-app/requirements.txt differ diff --git a/fastapi-app/router.py b/fastapi-app/router.py index 42004d1..fe1d15b 100644 --- a/fastapi-app/router.py +++ b/fastapi-app/router.py @@ -1,13 +1,17 @@ -from fastapi import APIRouter, UploadFile, File, Form -from repository import UserRepository, CSVFileRepository, H5ModelRepository, ModelStatisticsRepository -from schemas import UserCreate, ModelStatisticsCreate -import shutil import os +from fastapi import APIRouter, UploadFile, File, Form, HTTPException +from pathlib import Path +from database import new_session, User, CSVFile +from repository import CSVFileRepository, UserRepository, H5ModelRepository, ModelStatisticsRepository +import shutil +import pandas as pd +from sqlalchemy import select +from schemas import UserCreate, ModelStatisticsCreate router = APIRouter() -UPLOAD_FOLDER_CSV = "uploads/csv" -os.makedirs(UPLOAD_FOLDER_CSV, exist_ok=True) +UPLOAD_FOLDER_CSV = Path("uploads/csv") +UPLOAD_FOLDER_CSV.mkdir(parents=True, exist_ok=True) UPLOAD_FOLDER_MODELS = "uploads/models" os.makedirs(UPLOAD_FOLDER_MODELS, exist_ok=True) @@ -18,15 +22,30 @@ async def create_user(user: UserCreate): user_id = await UserRepository.create_user(user) return {"user_id": user_id} -# Загрузка CSV файла +# Обновлённый метод для загрузки CSV файла @router.post("/upload/csv/") async def upload_csv(user_id: int = Form(...), file: UploadFile = File(...)): - file_path = os.path.join(UPLOAD_FOLDER_CSV, file.filename) + # Получаем данные пользователя + async with new_session() as session: + user = await session.get(User, user_id) + if not user: + return {"error": "Пользователь не найден"} + username = user.username + + # Формируем путь для сохранения + user_folder = UPLOAD_FOLDER_CSV / str(user_id) + user_folder.mkdir(parents=True, exist_ok=True) + file_path = user_folder / file.filename + + # Сохраняем файл with open(file_path, "wb") as buffer: shutil.copyfileobj(file.file, buffer) - await CSVFileRepository.upload_file(user_id=user_id, file_path=file_path) - return {"message": "CSV файл загружен", "file_path": file_path} + # Сохраняем данные в БД, заменяя обратные слэши на прямые + normalized_path = str(file_path).replace("\\", "/") + await CSVFileRepository.upload_file(user_id=user_id, file_path=normalized_path) + return {"message": "CSV файл загружен", "file_path": normalized_path} + # Загрузка H5 модели @router.post("/upload/h5/") @@ -43,3 +62,51 @@ async def upload_h5_model(user_id: int = Form(...), file: UploadFile = File(...) async def add_model_statistics(stats: ModelStatisticsCreate): await ModelStatisticsRepository.add_statistics(stats) return {"message": "Статистика модели сохранена"} + + +# Получение строк из CSV файла +@router.get("/csv/rows/") +async def get_csv_rows( + user_id: int, + file_name: str, + start_row: int, + end_row: int +): + # Проверка существования пользователя + async with new_session() as session: + user = await session.get(User, user_id) + if not user: + raise HTTPException(status_code=404, detail="Пользователь не найден") + + # Формируем путь к файлу + user_folder = UPLOAD_FOLDER_CSV / str(user_id) + file_path = user_folder / file_name + + # Проверка файла в БД, заменяя обратные слэши на прямые + normalized_file_path = str(file_path).replace("\\", "/") + result = await session.execute( + select(CSVFile).where( + CSVFile.user_id == user_id, + CSVFile.file_path == normalized_file_path + ) + ) + csv_file = result.scalars().first() + + if not csv_file or not file_path.exists(): + raise HTTPException(status_code=404, detail=f"Файл '{file_name}' не найден для пользователя '{user_id}'") + + # Читаем файл и извлекаем строки + try: + if file_name.endswith(".xlsx"): + df = pd.read_excel(file_path) + elif file_name.endswith(".csv"): + df = pd.read_csv(file_path) + else: + raise HTTPException(status_code=400, detail="Неподдерживаемый формат файла") + + rows = df.iloc[start_row:end_row].to_dict(orient="records") + return {"rows": rows} + + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка при чтении файла: {str(e)}") +