1- from datetime import datetime
21from typing import Any , List , Optional
32
43from fastapi import APIRouter , Depends
5- from fastapi .params import Path
64from pydantic import BaseModel
75from starlette .requests import Request
8- from starlette .responses import RedirectResponse
96
107from fast_tmp .depends .auth import get_current_active_user
118from fast_tmp .site import ModelAdmin , get_model_site
@@ -32,7 +29,7 @@ async def list_view(
3229 page : int = 1 ,
3330 user : Optional [User ] = Depends (__get_user ),
3431):
35- datas = await page_model .list (request , perPage , page - 1 )
32+ datas = await page_model .list (request , perPage , page )
3633 return BaseRes (
3734 data = ListDataWithPage (
3835 total = datas ["total" ],
@@ -41,16 +38,37 @@ async def list_view(
4138 )
4239
4340
41+ @router .get ("/{resource}/prefetch/{field_name}" )
42+ async def prefetch_view (
43+ request : Request ,
44+ field_name : str ,
45+ pk : Optional [str ] = None ,
46+ perPage : Optional [int ] = None ,
47+ page : Optional [int ] = None ,
48+ page_model : ModelAdmin = Depends (get_model_site ),
49+ user : Optional [User ] = Depends (__get_user ),
50+ ):
51+ """
52+ 对多对多外键进行额外的加载
53+ """
54+ datas = await page_model .select_options (request , field_name , pk , perPage , page )
55+ return BaseRes (data = datas )
56+
57+
4458@router .get ("/{resource}/select/{field_name}" )
45- async def list_view (
59+ async def select_view (
4660 request : Request ,
4761 field_name : str ,
62+ pk : Optional [str ] = None ,
4863 perPage : Optional [int ] = None ,
4964 page : Optional [int ] = None ,
5065 page_model : ModelAdmin = Depends (get_model_site ),
5166 user : Optional [User ] = Depends (__get_user ),
5267):
53- datas = await page_model .select_options (field_name , request , perPage , page )
68+ """
69+ 枚举字段的额外加载,主要用于外键
70+ """
71+ datas = await page_model .select_options (request , field_name , pk , perPage , page )
5472 return BaseRes (data = datas )
5573
5674
@@ -61,6 +79,9 @@ async def patch_data(
6179 page_model : ModelAdmin = Depends (get_model_site ),
6280 user : Optional [User ] = Depends (__get_user ),
6381):
82+ """
83+ 内联模式快速修改需要的接口
84+ """
6485 data = await request .json ()
6586 await page_model .patch (request , pk , data )
6687 return BaseRes ().dict ()
@@ -100,24 +121,15 @@ async def create(
100121 return BaseRes (data = data )
101122
102123
103- #
104- #
105- # @router.delete("/{resource}/delete")
106- # def delete_one(
107- # request: Request,
108- # page_model: ModelAdmin = Depends(get_model_site),
109- # session: Session = Depends(get_db_session),
110- # user: Optional[User] = Depends(decode_access_token_from_data),
111- # ):
112- # if not user:
113- # return RedirectResponse(request.url_for("admin:login"))
114- #
115- # w = search_pk_list(page_model.model, request)
116- # if isinstance(w, BaseRes):
117- # return w
118- # session.execute(delete(page_model.model).where(*w))
119- # session.commit()
120- # return BaseRes()
124+ @router .delete ("/{resource}/delete/{pk}" )
125+ async def delete_func (
126+ request : Request ,
127+ pk : str ,
128+ page_model : ModelAdmin = Depends (get_model_site ),
129+ user : Optional [User ] = Depends (__get_user ),
130+ ):
131+ await page_model .delete (request , pk )
132+ return BaseRes ()
121133
122134
123135# def clean_param(field_type, param: str):
@@ -176,81 +188,3 @@ async def get_schema(
176188 user : Optional [User ] = Depends (__get_user ),
177189):
178190 return BaseRes (data = await page .get_app_page (request ))
179-
180-
181- # @router.get("/{resource}/selects/{field}")
182- # def get_selects(
183- # request: Request,
184- # field: str = Path(...), # type: ignore
185- # page_model: ModelAdmin = Depends(get_model_site),
186- # user: Optional[User] = Depends(decode_access_token_from_data),
187- # session: Session = Depends(get_db_session),
188- # perPage: int = 10,
189- # page: int = 1,
190- # ):
191- # items = []
192- # total = 0
193- # for attr in page_model.mapper().attrs:
194- # if attr.key == field:
195- # relation_model = attr.entity.class_
196- # secondary = attr.secondary
197- # for col in secondary.foreign_key_constraints:
198- # if col.referred_table in page_model.mapper().tables:
199- # params = dict(request.query_params)
200- # if len(params) > 1:
201- # raise single_pk
202- # col_name = col.column_keys[0]
203- # for c in secondary.c:
204- # if c.key == col_name:
205- # clean_value = clean_param(c.type, list(params.values())[0])
206- # sql = (
207- # select(*list(get_pk(relation_model).values()))
208- # .join(secondary)
209- # .where(c == clean_value)
210- # .limit(perPage)
211- # .offset((page - 1) * perPage)
212- # )
213- # datas = session.execute(sql)
214- # total_f = session.execute(
215- # select(func.count())
216- # .select_from(relation_model)
217- # .join(secondary)
218- # .where(col == list(params.values())[0])
219- # ).fetchone()
220- # if total_f is not None:
221- # total = total_f[0]
222- # for data in datas:
223- # items.append(dict(data))
224- # return BaseRes(data={"total": total, "rows": items})
225- #
226- #
227- # @router.get("/{resource}/picks/{field}")
228- # def get_picks(
229- # request: Request,
230- # field: str = Path(...), # type: ignore
231- # page_model: ModelAdmin = Depends(get_model_site),
232- # user: Optional[User] = Depends(decode_access_token_from_data),
233- # session: Session = Depends(get_db_session),
234- # perPage: int = 10,
235- # page: int = 1,
236- # ):
237- # """
238- # 枚举选择
239- # """
240- # source_field = getattr(page_model.model, field)
241- # if isinstance(source_field.property, RelationshipProperty):
242- # relation_model = source_field.property.mapper.class_
243- #
244- # else:
245- # relation_model = source_field.property.mapper.class_
246- # datas = session.execute(
247- # select(list(get_pk(relation_model).values())).limit(perPage).offset((page - 1) * perPage)
248- # )
249- # items = []
250- # for data in datas:
251- # items.append(dict(data))
252- # s = session.execute(select(func.count()).select_from(relation_model))
253- # total = 0
254- # for i in s:
255- # total = i[0]
256- # return BaseRes(data={"total": total, "rows": items})
0 commit comments