diff --git a/backend_fastapi/auth.py b/backend_fastapi/auth.py index e122daf..d2fa57f 100644 --- a/backend_fastapi/auth.py +++ b/backend_fastapi/auth.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter +from fastapi import APIRouter, BackgroundTasks import backend_fastapi.schemas as schemas from backend_fastapi.repositories import get_stored_roles, add_role, add_user, get_role_all, update_role, delete_role, update_user,delete_user,get_users from typing import List diff --git a/backend_fastapi/general.py b/backend_fastapi/general.py new file mode 100644 index 0000000..04d8d3a --- /dev/null +++ b/backend_fastapi/general.py @@ -0,0 +1,26 @@ +from fastapi import APIRouter +import backend_fastapi.schemas as schemas +import backend_fastapi.repositories as repo +import asyncio +router = APIRouter() + +@router.get("/values") +async def get_values() -> list[schemas.Value]: + return await repo.get_values() + + +@router.get("/objects") +async def get_objects() -> list[schemas.Object]: + return await repo.get_objects() + +@router.get("/report") +async def get_report() -> None: + import pandas as pd + values, objects = await asyncio.gather(repo.get_values(), repo.get_objects()) + values = [schemas.Value.model_validate(value).model_dump() for value in values] + objects = [schemas.Object.model_validate(object).model_dump() for object in objects] + + df_values= pd.DataFrame(data=values) + df_objects= pd.DataFrame(data=objects) + df_type = df_values['id_param'].where(df_values['id_param'] == 3).notnull() + print(df_values[["id_object","value"]][df_type]) \ No newline at end of file diff --git a/backend_fastapi/models.py b/backend_fastapi/models.py index 617c266..e86f2b2 100644 --- a/backend_fastapi/models.py +++ b/backend_fastapi/models.py @@ -1,7 +1,9 @@ from .database import Model from sqlalchemy.orm import mapped_column, Mapped, relationship -from sqlalchemy import String, Boolean, ForeignKey - +from sqlalchemy import String, Boolean, ForeignKey, Date +from sqlalchemy.dialects.mssql import SQL_VARIANT, UNIQUEIDENTIFIER +from uuid import UUID +from datetime import date class Role(Model): __tablename__ = "roles" @@ -18,4 +20,28 @@ class User(Model): hashed_password: Mapped[str] = mapped_column(String(255),nullable=False) is_active: Mapped[bool] = mapped_column(Boolean,default=True) role_id: Mapped[int] = mapped_column(ForeignKey("roles.id")) - role: Mapped["Role"] = relationship() \ No newline at end of file + role: Mapped["Role"] = relationship() + + +class Object(Model): + __tablename__ = "vObjects" + + id: Mapped[UUID] = mapped_column(UNIQUEIDENTIFIER, primary_key=True) + id_parent: Mapped[UUID|None] = mapped_column(UNIQUEIDENTIFIER,nullable=True) + year: Mapped[int | None] = mapped_column(nullable=False) + id_city: Mapped[int] = mapped_column(nullable=False) + + +class Value(Model): + __tablename__ = "vValues" + id: Mapped[int] = mapped_column( primary_key=True) + id_object: Mapped[UUID] = mapped_column(ForeignKey("vObjects.id")) + id_param:Mapped[int] = mapped_column(nullable=False) + value:Mapped[str|None] = mapped_column(String(250)) + date_s: Mapped[date] = mapped_column(Date,nullable=False) + date_po: Mapped[date|None] = mapped_column(Date,nullable=True) + id_user:Mapped[int] = mapped_column(nullable=False) + + +# class Parameter(Model): +# __tablename__ = "vParameters" diff --git a/backend_fastapi/reports.py b/backend_fastapi/reports.py new file mode 100644 index 0000000..b607af2 --- /dev/null +++ b/backend_fastapi/reports.py @@ -0,0 +1,3 @@ +import pandas as pd +import asyncio + diff --git a/backend_fastapi/repositories.py b/backend_fastapi/repositories.py index ae15c05..fcb2f75 100644 --- a/backend_fastapi/repositories.py +++ b/backend_fastapi/repositories.py @@ -90,5 +90,17 @@ async def update_user(user: schemas.User, id: int): return {f"{id=} был обновлен"} +async def get_objects(): + async with async_session() as session: + result = await session.scalars(select(models.Object)) + return result.all() + + +async def get_values(): + async with async_session() as session: + result = await session.scalars(select(models.Value)) + return result.all() + + async def get_stored_roles(): return await exec_procedure('get_roles') \ No newline at end of file diff --git a/backend_fastapi/schemas.py b/backend_fastapi/schemas.py index 2410bc1..b127104 100644 --- a/backend_fastapi/schemas.py +++ b/backend_fastapi/schemas.py @@ -1,5 +1,6 @@ from pydantic import BaseModel, ConfigDict, EmailStr - +from uuid import UUID +from datetime import date class RoleBase(BaseModel): name: str @@ -23,4 +24,23 @@ class User(UserBase): class Role(RoleBase): model_config = ConfigDict(from_attributes=True) - id: int \ No newline at end of file + id: int + + +class Object(BaseModel): + model_config = ConfigDict(from_attributes=True) + id: UUID + id_city: int + id_parent: UUID | None + year: int | None + + +class Value(BaseModel): + model_config = ConfigDict(from_attributes=True) + id: int + id_object: UUID + id_param: int + value: str|None + date_s: date + date_po: date|None + id_user: int \ No newline at end of file diff --git a/main.py b/main.py index 719d9e9..773eefa 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from fastapi.responses import HTMLResponse from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager from backend_fastapi.auth import router as auth_router +from backend_fastapi.general import router as general_router from backend_fastapi.database import connect, disconnect @asynccontextmanager @@ -37,7 +38,8 @@ def index(): async def get_data(): return {"firstname": "Котофей","lastname":"Барсикофф","age":"10"} -app.include_router(router=auth_router, prefix="/auth") +app.include_router(router=auth_router, prefix="/auth", tags=["Auth"]) +app.include_router(router=general_router, prefix="/general", tags=["General"]) if __name__ == "__main__": import uvicorn diff --git a/requierements.txt b/requierements.txt index 6f8dcba..781b46e 100644 --- a/requierements.txt +++ b/requierements.txt @@ -2,4 +2,5 @@ uvicorn fastapi sqlalchemy aioodbc -python-dotenv \ No newline at end of file +python-dotenv +pandas \ No newline at end of file