Skip to content

Commit 5f23db4

Browse files
committed
完成增删改查所有信息
1 parent 62cca34 commit 5f23db4

File tree

15 files changed

+376
-239
lines changed

15 files changed

+376
-239
lines changed

fast_tmp/admin/creator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def __init__(
8989
body=Form(
9090
name=f"新增{model.__name__}",
9191
title=f"新增{model.__name__}",
92-
controls=get_controls_from_model(
92+
body=get_controls_from_model(
9393
model, include=create_include, exclude=create_exclude
9494
),
9595
primaryField=model._meta.pk_attr,

fast_tmp/admin/endpoint.py

Lines changed: 36 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
from datetime import datetime
21
from typing import Any, List, Optional
32

43
from fastapi import APIRouter, Depends
5-
from fastapi.params import Path
64
from pydantic import BaseModel
75
from starlette.requests import Request
8-
from starlette.responses import RedirectResponse
96

107
from fast_tmp.depends.auth import get_current_active_user
118
from 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})
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
from starlette.responses import RedirectResponse
44
from tortoise.exceptions import BaseORMException
55

6-
from fast_tmp.responses import BaseRes, NoAuthError
6+
from fast_tmp.responses import BaseRes, FastTmpError, NoAuthError
77

88

9-
async def check_error_middle(request: Request, call_next):
10-
try:
11-
response = await call_next(request)
12-
except BaseORMException as e:
13-
response = JSONResponse(content=BaseRes(msg=str(e), status=400).dict())
14-
return response
9+
async def fasttmp_exception_handler(request: Request, exc: FastTmpError):
10+
return JSONResponse(
11+
status_code=200,
12+
content=exc.detail,
13+
)
14+
15+
16+
async def tortoise_exception_handler(request: Request, exc: BaseORMException):
17+
return JSONResponse(content=BaseRes(msg=str(exc), status=400).dict(), status_code=200)
1518

1619

1720
async def no_auth_middle(request: Request, call_next):

fast_tmp/admin/server.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,36 @@
55
from fastapi import Depends, FastAPI, Form, Request
66
from fastapi.templating import Jinja2Templates
77
from starlette import status
8-
from starlette.responses import RedirectResponse
8+
from starlette.responses import JSONResponse, RedirectResponse
9+
from tortoise.exceptions import BaseORMException
910

1011
from fast_tmp.admin.site import GroupAdmin, UserAdmin
1112
from fast_tmp.conf import settings
1213
from fast_tmp.models import User
13-
from fast_tmp.responses import BaseRes
14+
from fast_tmp.responses import BaseRes, FastTmpError
1415
from fast_tmp.site import model_list, register_model_site
1516
from fast_tmp.utils.token import create_access_token
1617

1718
from ..jinja_extension.tags import register_tags
1819
from .depends import __get_user_or_none
1920
from .endpoint import router
20-
from .middware import check_error_middle, no_auth_middle
21+
from .exception_handlers import (
22+
fasttmp_exception_handler,
23+
no_auth_middle,
24+
tortoise_exception_handler,
25+
)
2126

2227
base_path = os.path.dirname(__file__)
2328
templates = Jinja2Templates(directory=base_path + "/templates")
2429
register_tags(templates)
2530
admin = FastAPI(title="fast-tmp")
26-
register_model_site(
27-
{
28-
"Auth": [
29-
UserAdmin(),
30-
]
31-
}
32-
)
31+
register_model_site({"Auth": [UserAdmin(), GroupAdmin()]})
3332
admin.include_router(router)
34-
# admin.middleware("http")(check_error_middle)
3533
admin.middleware("http")(no_auth_middle)
3634

35+
admin.exception_handler(FastTmpError)(fasttmp_exception_handler)
36+
admin.exception_handler(BaseORMException)(tortoise_exception_handler)
37+
3738

3839
@admin.post("/", name="index")
3940
@admin.get("/", name="index")

fast_tmp/admin/site.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ class UserAdmin(ModelAdmin):
66
model = User
77
list_display = ("id", "username", "is_active")
88
inline = ("is_active",)
9+
create_fields = (
10+
"username",
11+
"password",
12+
"groups",
13+
)
14+
update_fields = ("groups",)
915
# create_fields = (User.username, User.password)
1016
# update_fields = (User.password,)
1117

@@ -25,5 +31,6 @@ class UserAdmin(ModelAdmin):
2531
class GroupAdmin(ModelAdmin):
2632
model = Group
2733
list_display = ("id", "name", "users")
34+
create_fields = ("name",)
2835
# create_fields = (Group.name, Group.users)
2936
# update_fields = (Group.name, Group.users)

fast_tmp/amis/buttons.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313

1414
from fast_tmp.amis.abstract_schema import _Action
1515
from fast_tmp.amis.enums import TypeEnum
16+
from fast_tmp.amis.forms import Column
1617

1718

18-
class Operation(BaseModel):
19+
class Operation(Column):
1920
type = TypeEnum.operation
2021
label = "操作"
2122
buttons: List[_Action] = []
23+
name: str = ""

fast_tmp/amis/forms/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Column(BaseModel):
1818
用于列表等的显示
1919
"""
2020

21-
type: Optional[ControlEnum] # 把这个和schema获取的参数进行融合,保证schema获取的值可以使用
21+
type: Optional[str] # 把这个和schema获取的参数进行融合,保证schema获取的值可以使用
2222
name: str # type: ignore
2323
label: str
2424

fast_tmp/factory.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
# from starlette.middleware.sessions import SessionMiddleware
44
from starlette.middleware.cors import CORSMiddleware
55

6-
from fast_tmp.admin.server import admin
76
from fast_tmp.conf import settings # 放第一个不要变
8-
from fast_tmp.depends.auth import register_app
97

108
settings._init_model()
9+
from fast_tmp.admin.server import admin
10+
from fast_tmp.depends.auth import register_app
1111

1212

1313
def create_app() -> FastAPI:
@@ -30,4 +30,5 @@ def create_app() -> FastAPI:
3030
# app.add_middleware(SessionMiddleware, secret_key=settings.CAS_SESSION_SECRET)
3131

3232
app.mount("/admin", admin, name="admin")
33+
3334
return app

0 commit comments

Comments
 (0)