/
aastray
/
StudentPart
Обзор
Документация
Войти
/
aastray
/
StudentPart
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
API-lib/src/controllers/practice.py
208 строк
8 KB
aastray
Реализован функционал загрузки файлов и просмотра документов, удалены базовые эндпоинты, обновлена документация
10 янв 2026, 15:38
10 янв 2026, 15:38
4d47c55
Код
Авторство
О чём код?
""" Роутер для работы с практиками студентов. Содержит эндпоинты для работы с анкетами, документами и файлами. """ from fastapi import APIRouter, HTTPException, Body, Query, UploadFile, File, Depends from typing import Dict, Any, Optional, List from sqlalchemy.ext.asyncio import AsyncSession from src.database.db import get_session from src.schemas.PracticeSchemas.application_schema import ( PracticeApplicationCreate, PracticeApplicationResponse, PracticeApplicationListResponse ) from src.services.practice_service import ( submit_practice_application, get_practice_application, get_practice_applications_by_student, get_document_template, upload_document_scan, upload_practice_report, get_practice_grade ) router = APIRouter( prefix="/practice", tags=["Practice"], responses={404: {"description": "Not found"}}, ) @router.post("/application", summary="Отправить анкету на практику и сгенерировать документы", response_model=Dict[str, Any]) async def submit_application( application_data: PracticeApplicationCreate, db: AsyncSession = Depends(get_session) ): """ Принимает анкету студента, сохраняет её в БД, генерирует все необходимые документы (договор, задание, инструктаж, направление) и возвращает их в ответе. Возвращает: - Сохраненная анкета из БД - Сгенерированные документы (base64) - Статус обработки """ try: result = await submit_practice_application(application_data, db) return result except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при обработке анкеты: {str(e)}" ) @router.get("/application/{application_id}", summary="Получить анкету по ID", response_model=PracticeApplicationResponse) async def get_application( application_id: str, db: AsyncSession = Depends(get_session) ): """ Возвращает анкету на практику по ID. Args: application_id: ID анкеты Returns: Данные анкеты """ try: application = await get_practice_application(application_id, db) if not application: raise HTTPException(status_code=404, detail=f"Анкета с ID {application_id} не найдена") return application except HTTPException: raise except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при получении анкеты: {str(e)}" ) @router.get("/applications", summary="Получить список анкет студента", response_model=List[PracticeApplicationResponse]) async def get_applications( student_id: str = Query(..., description="ID студента"), skip: int = Query(0, ge=0, description="Количество записей для пропуска"), limit: int = Query(100, ge=1, le=1000, description="Максимальное количество записей"), db: AsyncSession = Depends(get_session) ): """ Возвращает список анкет студента. Args: student_id: ID студента skip: Количество записей для пропуска (для пагинации) limit: Максимальное количество записей Returns: Список анкет студента """ try: applications = await get_practice_applications_by_student(student_id, db, skip, limit) return applications except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при получении списка анкет: {str(e)}" ) @router.get("/template", summary="Получить шаблон документа") async def get_template( template_type: str = Query(..., description="Тип шаблона: договор, индивидуальное_задание, лист_учета_инструктажа, направление"), practice_type: Optional[str] = Query(None, description="Вид практики (опционально)") ): """ Возвращает шаблон документа по типу и виду практики. Args: template_type: Тип шаблона документа practice_type: Вид практики (опционально) Returns: Шаблон документа в base64 и метаданные """ try: result = await get_document_template(template_type, practice_type) return result except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при получении шаблона: {str(e)}" ) @router.post("/upload-document", summary="Загрузить скан документа с печатью") async def upload_document( file: UploadFile = File(..., description="Файл скана документа (PDF, DOCX)"), metadata: Dict[str, Any] = Body(..., description="Метаданные файла") ): """ Принимает скан документа с печатью, валидирует его и возвращает в ответе. Args: file: Загружаемый файл metadata: Метаданные файла (имя, тип и т.д.) Returns: Обработанный файл в base64 и метаданные """ try: result = await upload_document_scan(file, metadata) return result except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при загрузке документа: {str(e)}" ) @router.post("/upload-report", summary="Загрузить отчет о практике") async def upload_report( file: UploadFile = File(..., description="Файл отчета (DOCX, PDF)"), metadata: Dict[str, Any] = Body(..., description="Метаданные отчета") ): """ Принимает отчет о практике, валидирует его и возвращает в ответе. Args: file: Загружаемый файл отчета metadata: Метаданные отчета Returns: Обработанный файл в base64 и метаданные """ try: result = await upload_practice_report(file, metadata) return result except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при загрузке отчета: {str(e)}" ) @router.get("/grade", summary="Получить оценку за практику") async def get_grade( practice_id: Optional[str] = Query(None, description="ID практики"), student_id: Optional[str] = Query(None, description="ID студента") ): """ Возвращает оценку за практику (получается из внешнего сервиса через оркестратор). Args: practice_id: ID практики student_id: ID студента Returns: Данные об оценке """ try: result = await get_practice_grade(practice_id, student_id) return result except Exception as e: raise HTTPException( status_code=500, detail=f"Ошибка при получении оценки: {str(e)}" )