add request to parse_value

This commit is contained in:
long2ice
2021-05-06 20:07:52 +08:00
parent 1e70bd09d2
commit 064eceea57
8 changed files with 33 additions and 32 deletions

View File

@ -1,7 +1,7 @@
name: deploy
on: [ push, pull_request ]
jobs:
example:
examples:
runs-on: ubuntu-latest
steps:
- name: Deploy

View File

@ -62,10 +62,10 @@ class AdminResource(Model):
return {"class": "bg-danger text-white"}
return await super().cell_attributes(request, obj, field)
def get_actions(self) -> List[Action]:
async def get_actions(self, request: Request) -> List[Action]:
return []
def get_bulk_actions(self) -> List[Action]:
async def get_bulk_actions(self, request: Request) -> List[Action]:
return []
@ -124,7 +124,7 @@ class ConfigResource(Model):
async def row_attributes(self, request: Request, obj: dict) -> dict:
if obj.get("status") == enums.Status.on:
return {"class": "bg-green text-white"}
return await super().row_attributes(obj)
return await super().row_attributes(request, obj)
@app.register
@ -138,7 +138,7 @@ class GithubLink(Link):
@app.register
class DocumentationLink(Link):
label = "Documentation"
url = "https://long2ice.github.io/fastadmin"
url = "https://fastapi-admin-docs.long2ice.cn"
icon = "fas fa-file-code"
target = "_blank"

View File

@ -19,12 +19,12 @@ def get_model(resource: Optional[str] = Path(...)):
return model
def get_model_resource(request: Request, model=Depends(get_model)):
async def get_model_resource(request: Request, model=Depends(get_model)):
model_resource = request.app.get_model_resource(model) # type:Model
if not model_resource:
raise HTTPException(status_code=HTTP_404_NOT_FOUND)
actions = model_resource.get_actions()
bulk_actions = model_resource.get_bulk_actions()
actions = await model_resource.get_actions(request)
bulk_actions = await model_resource.get_bulk_actions(request)
model_resource.actions = actions
model_resource.bulk_actions = bulk_actions
return model_resource

View File

@ -77,13 +77,13 @@ class Model(Resource):
async def cell_attributes(self, request: Request, obj: dict, field: Field) -> dict:
return {}
def get_actions(self) -> List[Action]:
async def get_actions(self, request: Request) -> List[Action]:
return [
Action(label=_("update"), icon="ti ti-edit", name="update", ajax=False),
Action(label=_("delete"), icon="ti ti-trash", name="delete", method="DELETE"),
]
def get_bulk_actions(self) -> List[Action]:
async def get_bulk_actions(self, request: Request) -> List[Action]:
return [
Action(
label=_("delete_selected"),
@ -94,7 +94,7 @@ class Model(Resource):
]
@classmethod
async def get_inputs(cls, obj: Optional[TortoiseModel] = None):
async def get_inputs(cls, request: Request, obj: Optional[TortoiseModel] = None):
ret = []
for field in cls.get_fields(is_display=False):
input_ = field.input
@ -103,21 +103,21 @@ class Model(Resource):
if isinstance(input_, inputs.File):
cls.enctype = "multipart/form-data"
name = input_.context.get("name")
ret.append(await input_.render(getattr(obj, name, None)))
ret.append(await input_.render(request, getattr(obj, name, None)))
return ret
@classmethod
async def resolve_query_params(cls, values: dict):
async def resolve_query_params(cls, request: Request, values: dict):
ret = {}
for f in cls.filters:
name = f.context.get("name")
v = values.get(name)
if v is not None and v != "":
ret[name] = await f.parse_value(v)
ret[name] = await f.parse_value(request, v)
return ret
@classmethod
async def resolve_data(cls, data: FormData):
async def resolve_data(cls, request: Request, data: FormData):
ret = {}
m2m_ret = {}
for field in cls.get_fields(is_display=False):
@ -127,11 +127,11 @@ class Model(Resource):
name = input_.context.get("name")
if isinstance(input_, inputs.ManyToMany):
v = data.getlist(name)
value = await input_.parse_value(v)
value = await input_.parse_value(request, v)
m2m_ret[name] = await input_.model.filter(pk__in=value)
else:
v = data.get(name)
value = await input_.parse_value(v)
value = await input_.parse_value(request, v)
ret[name] = value
return ret, m2m_ret

View File

@ -28,7 +28,7 @@ async def list_view(
fields_name = model_resource.get_fields_name()
fields_label = model_resource.get_fields_label()
fields = model_resource.get_fields()
params = await model_resource.resolve_query_params(dict(request.query_params))
params = await model_resource.resolve_query_params(request, dict(request.query_params))
filters = await model_resource.get_filters(request, params)
qs = model.filter(**params)
total = await qs.count()
@ -84,7 +84,7 @@ async def update(
model=Depends(get_model),
):
form = await request.form()
data, m2m_data = await model_resource.resolve_data(form)
data, m2m_data = await model_resource.resolve_data(request, form)
async with in_transaction() as conn:
obj = (
await model.filter(pk=pk)
@ -172,7 +172,7 @@ async def create_view(
resources=Depends(get_resources),
model_resource: ModelResource = Depends(get_model_resource),
):
inputs = await model_resource.get_inputs()
inputs = await model_resource.get_inputs(request)
context = {
"request": request,
"resources": resources,
@ -203,9 +203,9 @@ async def create(
model_resource: ModelResource = Depends(get_model_resource),
model=Depends(get_model),
):
inputs = await model_resource.get_inputs()
inputs = await model_resource.get_inputs(request)
form = await request.form()
data, m2m_data = await model_resource.resolve_data(form)
data, m2m_data = await model_resource.resolve_data(request, form)
async with in_transaction() as conn:
obj = await model.create(**data, using_db=conn)
for k, items in m2m_data.items():

View File

@ -20,9 +20,9 @@ class DatetimeDisplay(Display):
self.format_ = format_
async def render(self, request: Request, value: datetime):
if value:
value = value.strftime(self.format_)
return await super(DatetimeDisplay, self).render(request, value)
return await super(DatetimeDisplay, self).render(
request, value.strftime(self.format_) if value else None
)
class DateDisplay(DatetimeDisplay):

View File

@ -63,8 +63,9 @@ class Datetime(Filter):
)
self.context.update(format=format_)
async def parse_value(self, value: Optional[str]):
return value.split(" - ")
async def parse_value(self, request: Request, value: Optional[str]):
if value:
return value.split(" - ")
async def render(self, request: Request, value: Any):
if value is not None:
@ -122,7 +123,7 @@ class Enum(Select):
self.enum = enum
self.enum_type = enum_type
async def parse_value(self, value: Any):
async def parse_value(self, request: Request, value: Any):
return self.enum(self.enum_type(value))
async def get_options(self):

View File

@ -18,7 +18,7 @@ class Input(Widget):
super().__init__(null=null, **context)
self.default = default
async def parse_value(self, value: Any):
async def parse_value(self, request: Request, value: Any):
"""
Parse value from frontend
:param value:
@ -139,7 +139,7 @@ class Enum(Select):
self.enum = enum
self.enum_type = enum_type
async def parse_value(self, value: Any):
async def parse_value(self, request: Request, value: Any):
return self.enum(self.enum_type(value))
async def get_options(self):
@ -203,7 +203,7 @@ class File(Input):
)
self.upload_provider = upload_provider
async def parse_value(self, value: Optional[UploadFile]):
async def parse_value(self, request: Request, value: Optional[UploadFile]):
if value:
return await self.upload_provider.upload(value)
@ -230,7 +230,7 @@ class RadioEnum(Enum):
class Switch(Input):
template = "widgets/inputs/switch.html"
async def parse_value(self, value: str):
async def parse_value(self, request: Request, value: str):
if value == "on":
return True
return False