Изменен ИС ЖКХ РС

This commit is contained in:
Gitea
2022-06-02 17:35:32 +09:00
parent c93a73cd52
commit 21e5ad26f2
14 changed files with 220 additions and 74 deletions

48
isjkhrs/crud.py Normal file
View File

@ -0,0 +1,48 @@
from sqlalchemy.orm import Session
from sqlalchemy import text
from isjkhrs.database import get_table
from isjkhrs import schemas
def exec_procedure(session, proc_name, params, database: str = None):
sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}"
for name, value in params.items()])
dbstr = ""
if database:
dbstr = f"[{database}]."
sql_string = """
DECLARE @return_value int;
EXEC @return_value = {dbstr}[dbo].[{proc_name}] {params};
SELECT 'Return Value' = @return_value;
""".format(dbstr=dbstr, proc_name=proc_name, params=sql_params)
data = session.execute(sql_string).fetchall()
session.commit()
session.expire_all()
return data
def exec_procedure_wo_result(session, proc_name, params, database: str = None):
sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}"
for name, value in params.items()])
dbstr = ""
if database:
dbstr = f"[{database}]."
sql_string = """
EXEC {dbstr}[dbo].[{proc_name}] {params}
""".format(dbstr=dbstr, proc_name=proc_name, params=sql_params)
session.execute(sql_string)
session.commit()
class FilterViewSet:
"""get"""
"""post"""
def get_filter_types(db: Session, data: schemas.FilterTypeInit):
return exec_procedure(db, 'uspGetFilterTypes', data.dict(), 'ISJKHRSTO')
def get_filter_list(db: Session, data: schemas.FilterListInit):
return exec_procedure(db, 'uspGetFilterList', data.dict(), 'ISJKHRSTO')
def set_filter_list(db: Session, data: schemas.FilterSetInit):
return exec_procedure_wo_result(db, 'uspSetFilterList', data.dict(), 'ISJKHRSTO')

61
isjkhrs/database.py Normal file
View File

@ -0,0 +1,61 @@
from sqlalchemy import create_engine, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from typing import Optional, Dict
from dataclasses import dataclass
import json
@dataclass
class Database:
engine: str
name: str
host: str
user: str
password: str
options: Optional[Dict] = None
def get_url(self):
option_str = ""
if self.options:
opt = [name+'='+'+'.join(value.split())
for name, value in self.options.items()]
option_str = "?"+"&".join(opt)
return f"{self.engine}://{self.user}:{self.password}@{self.host}/{self.name}{option_str}"
data = {}
with open('settings', 'r') as settings:
data_str = settings.read()
data = json.loads(data_str)
db = Database(**data.get('database'))
SQL_ALCHEMY_DATABASE_URL_MSSQL = db.get_url()
engine = create_engine(
SQL_ALCHEMY_DATABASE_URL_MSSQL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def get_table(tablename: str, dbname: str = None) -> Table:
metadata = Base.metadata
metadata.reflect(bind=engine)
if dbname == None:
dbname = db.name
return Table(tablename, metadata, schema=dbname+'.dbo', autoload=True, autoload_with=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

13
isjkhrs/isapi.py Normal file
View File

@ -0,0 +1,13 @@
from fastapi import APIRouter, Depends
from auth import oauth2
from auth.login.schemas import login as schemas
from isjkhrs import ismain
router = APIRouter()
router.include_router(
router=ismain.router,
prefix="",
responses={404: {"description": "IS is Not found"}}
)

View File

@ -1,11 +1,28 @@
from infosys.routers import general
from isjkhrs.routers import general, isjkhrsto
from fastapi import APIRouter, Depends
from auth import oauth2
from auth.login.schemas import login as schemas
router = APIRouter()
router.include_router(
router=general.router,
prefix="",
responses={404: {"description": "info is not found"}}
)
def exec_procedure(session, proc_name, params, database: str = None):
sql_params = ""
if params:
sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}"
for name, value in params.items()])
dbstr = ""
if database:
dbstr = f"[{database}]."
sql_string = """
DECLARE @return_value int;
EXEC @return_value = {dbstr}[dbo].[{proc_name}] {params};
SELECT 'Return Value' = @return_value;
""".format(dbstr=dbstr, proc_name=proc_name, params=sql_params)
print(sql_string)
data = session.execute(sql_string).fetchall()
session.commit()
session.expire_all()
return data
router.include_router(general.router, prefix="", tags=["is"])
router.include_router(isjkhrsto.router, prefix="/filter", tags=["FilterViewSet"])

View File

@ -27,17 +27,4 @@ async def get_address(city_id: int, db= Depends(general.get_db)):
@router.get('/getRegions')
async def get_region(db = Depends(general.get_db)):
return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall()
@router.post('/get_filter_types', response_model=List[schemas.FilterTypeSerializer])
async def get_filter_types(request: schemas.FilterTypeInit, db: Session = Depends(general.get_db)):
return db.FilterViewSet.get_filter_types(db, request)
@router.post('/get_filter_list', response_model=List[schemas.FilterListSerializer])
async def get_filter_list(request: schemas.FilterListInit, db: Session = Depends(general.get_db)):
return crud.FilterViewSet.get_filter_list(db, request)
@router.post('/set_report_filter_list', response_model=List[schemas.FilterListSerializer])
async def set_report_filter_list(request: schemas.FilterSetInit, db: Session = Depends(general.get_db)):
return crud.FilterViewSet.set_filter_list(db, request)
return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall()

View File

@ -0,0 +1,22 @@
from fastapi import APIRouter, Depends
from kv.database import get_db
import isjkhrs.crud as crud
from sqlalchemy.orm import Session
from typing import List
import isjkhrs.schemas as schemas
router = APIRouter()
@router.post('/get_filter_types', response_model=List[schemas.FilterTypeSerializer])
async def get_filter_types(request: schemas.FilterTypeInit, db: Session = Depends(get_db)):
return crud.FilterViewSet.get_filter_types(db, request)
@router.post('/get_filter_list', response_model=List[schemas.FilterListSerializer])
async def get_filter_list(request: schemas.FilterListInit, db: Session = Depends(get_db)):
return crud.FilterViewSet.get_filter_list(db, request)
@router.post('/set_report_filter_list', response_model=List[schemas.FilterListSerializer])
async def set_report_filter_list(request: schemas.FilterSetInit, db: Session = Depends(get_db)):
return crud.FilterViewSet.set_filter_list(db, request)

32
isjkhrs/schemas.py Normal file
View File

@ -0,0 +1,32 @@
from decimal import Decimal
from pydantic import BaseModel
from typing import Optional, List
from datetime import date, datetime
class FilterTypeInit(BaseModel):
IDUser: int
GetType: int
NeedClear: bool
class FilterListInit(BaseModel):
IDUser: int = 1
IDFilterType: int
class FilterSetInit(FilterListInit):
IDFilterObject: int
NeedClear: bool
class FilterTypeSerializer(BaseModel):
ID: int
Name: Optional[str] = None
IDParent: int = None
OrderField: int
class FilterListSerializer(BaseModel):
ID: int
Name: Optional[str] = None
IsChecked: bool