From 21e5ad26f207b883b3dfbe2cb8e0e9bc533b305b Mon Sep 17 00:00:00 2001 From: Gitea Date: Thu, 2 Jun 2022 17:35:32 +0900 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=98=D0=A1=20=D0=96=D0=9A=D0=A5=20=D0=A0=D0=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- isjkhrs/crud.py | 48 ++++++++++++++ isjkhrs/database.py | 61 ++++++++++++++++++ isjkhrs/isapi.py | 13 ++++ isjkhrs/ismain.py | 29 +++++++-- isjkhrs/routers/general.py | 15 +---- .../filter.py => isjkhrs/routers/isjkhrsto.py | 14 ++-- isjkhrs/schemas.py | 32 +++++++++ kv/__pycache__/isapi.cpython-39.pyc | Bin 2202 -> 2139 bytes kv/crud.py | 23 ++----- kv/isapi.py | 4 +- .../__pycache__/recalculation.cpython-39.pyc | Bin 1417 -> 1711 bytes kv/routers/recalculation.py | 4 ++ kv/schemas.py | 47 +++++++------- main.py | 4 +- 14 files changed, 220 insertions(+), 74 deletions(-) create mode 100644 isjkhrs/crud.py create mode 100644 isjkhrs/database.py create mode 100644 isjkhrs/isapi.py rename kv/routers/filter.py => isjkhrs/routers/isjkhrsto.py (86%) create mode 100644 isjkhrs/schemas.py diff --git a/isjkhrs/crud.py b/isjkhrs/crud.py new file mode 100644 index 0000000..b2b89e8 --- /dev/null +++ b/isjkhrs/crud.py @@ -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') \ No newline at end of file diff --git a/isjkhrs/database.py b/isjkhrs/database.py new file mode 100644 index 0000000..8199b26 --- /dev/null +++ b/isjkhrs/database.py @@ -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() diff --git a/isjkhrs/isapi.py b/isjkhrs/isapi.py new file mode 100644 index 0000000..08aed6a --- /dev/null +++ b/isjkhrs/isapi.py @@ -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"}} +) diff --git a/isjkhrs/ismain.py b/isjkhrs/ismain.py index 80d5a28..e44dd5b 100644 --- a/isjkhrs/ismain.py +++ b/isjkhrs/ismain.py @@ -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"]) \ No newline at end of file diff --git a/isjkhrs/routers/general.py b/isjkhrs/routers/general.py index ba81aae..126ba42 100644 --- a/isjkhrs/routers/general.py +++ b/isjkhrs/routers/general.py @@ -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) \ No newline at end of file + return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall() \ No newline at end of file diff --git a/kv/routers/filter.py b/isjkhrs/routers/isjkhrsto.py similarity index 86% rename from kv/routers/filter.py rename to isjkhrs/routers/isjkhrsto.py index fdd9c0f..065995e 100644 --- a/kv/routers/filter.py +++ b/isjkhrs/routers/isjkhrsto.py @@ -1,14 +1,12 @@ -import kv.schemas as schemas -import kv.crud as crud -from kv.database import get_db -from sqlalchemy.orm import Session 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() -"""post""" - - @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) @@ -21,4 +19,4 @@ async def get_filter_list(request: schemas.FilterListInit, db: Session = Depends @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) + return crud.FilterViewSet.set_filter_list(db, request) \ No newline at end of file diff --git a/isjkhrs/schemas.py b/isjkhrs/schemas.py new file mode 100644 index 0000000..39d2207 --- /dev/null +++ b/isjkhrs/schemas.py @@ -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 \ No newline at end of file diff --git a/kv/__pycache__/isapi.cpython-39.pyc b/kv/__pycache__/isapi.cpython-39.pyc index 143b8d76564303f187b3622605ec066ac741b96b..560a1d13ffda56fdcda67339c5d4db26472ddc35 100644 GIT binary patch delta 595 zcmY+=%T60H6b9fq6J|2GOfr*@fk1|EQxOEH*wd=Js;rROm03gs$6SJk5GSF^3Zx)* zAR%{E@eq}Gg1$vXU#7xHgP_MMG7w9;(x>JS7UWq{el(9sXwsuxMubM!pDcq zcW5lqcgiJQDpXj$-xKZgNJepAE~xibPzd#2Qs&gI^#NMy&g!m}NuR9Vkjv3iCK6)R zlp6^RqJ6=i^Dl>1>?Ulf&-QOMpKU{^uCjaEtZ;g>Yp3HfP(f@l#%oGB_7)b`rj_JB-hi4xWcY!WJ@N>mEh z9ME2>s&Byyw68%A?Xi#1u>&gJ!)W*0*`3+_<$d#=$Z>3qhWB@N+`VyH@a5*k+pE}R zE@-IXg79LW`Ei9+(zPL~alnFfZi>Y?WFcr=pK7dz&-fDNzXKM~zBX8$*ZK`C@_>i^ z<+_HYna+XxQ#b*>fDYxA(Y-dNz?ziV;%2{w9{OFt%IqpfmnLWtRxwEN!SZB_7-pP%?*<^KWWUNTGjLnQWWG!qzwtZeE?BJ8f$X&9hxRS9F*($C*7+UYO&2{w^Ho#Ut z;GJcj^u(CU+k!3u+P9x`pP;!)-!0dYP^G}^(YZJ}i)0j!W?-a}Lu+)E~18ZS}_b za3IS`_2TKpHb!(sG~&`t3a53<@#R@>(3O5tK|j5am1JVd;e=iz8%f@l`fasd?AA^%DX@?MRXw}k{W5K8nF~{uo{^Z#$X0biOmL#Sxicb z`st}9@rlXFMWu;3#qr6BdGSf9@kOc0i8;xoIf*5yDU)TH?GzOVsw!X>oh-n@!Yc=K ze=!rt7feMWlczCPiHQQ)%1ELhzNYMEH5P8hXk|yJ&CZE=PN_ji)&{2*WhUliR;3o* zlEtaWGcU8GNCar!E&lM#l8lt1#PZC%^x(v@)FRQz&a7&T3X`)~W!Ra87-d*E7y)Ry BWEKDb delta 125 zcmZ3_+sVzB$ji&c00gejdXuiROyrYcWSFRZS7U)-iqJyFRIXIkX2vweRK_fcRQ42} zIZP?SDIzUEu_(zD#$X0b(amv;Sxl3QS<1vjfQHBeaWNCfIHn>HUsG!He->`W$-!)b Vj3Sd$+0+