From 064eceea5749bfe6bb467b99056e47764afbe478 Mon Sep 17 00:00:00 2001 From: long2ice Date: Thu, 6 May 2021 20:07:52 +0800 Subject: [PATCH] add request to parse_value --- .github/workflows/deploy.yml | 2 +- examples/resources.py | 8 ++++---- fastapi_admin/depends.py | 6 +++--- fastapi_admin/resources.py | 18 +++++++++--------- fastapi_admin/routes/resources.py | 10 +++++----- fastapi_admin/widgets/displays.py | 6 +++--- fastapi_admin/widgets/filters.py | 7 ++++--- fastapi_admin/widgets/inputs.py | 8 ++++---- 8 files changed, 33 insertions(+), 32 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c286b86..d698651 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,7 +1,7 @@ name: deploy on: [ push, pull_request ] jobs: - example: + examples: runs-on: ubuntu-latest steps: - name: Deploy diff --git a/examples/resources.py b/examples/resources.py index 8b417dd..90ba9f6 100644 --- a/examples/resources.py +++ b/examples/resources.py @@ -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" diff --git a/fastapi_admin/depends.py b/fastapi_admin/depends.py index 270b782..1445ada 100644 --- a/fastapi_admin/depends.py +++ b/fastapi_admin/depends.py @@ -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 diff --git a/fastapi_admin/resources.py b/fastapi_admin/resources.py index 1eef6ca..3fbd52a 100644 --- a/fastapi_admin/resources.py +++ b/fastapi_admin/resources.py @@ -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 diff --git a/fastapi_admin/routes/resources.py b/fastapi_admin/routes/resources.py index 1609fd9..2056c88 100644 --- a/fastapi_admin/routes/resources.py +++ b/fastapi_admin/routes/resources.py @@ -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(): diff --git a/fastapi_admin/widgets/displays.py b/fastapi_admin/widgets/displays.py index d1c79e2..cf0e987 100644 --- a/fastapi_admin/widgets/displays.py +++ b/fastapi_admin/widgets/displays.py @@ -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): diff --git a/fastapi_admin/widgets/filters.py b/fastapi_admin/widgets/filters.py index 2f780c3..bd6af37 100644 --- a/fastapi_admin/widgets/filters.py +++ b/fastapi_admin/widgets/filters.py @@ -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): diff --git a/fastapi_admin/widgets/inputs.py b/fastapi_admin/widgets/inputs.py index 3816d94..eb25d6b 100644 --- a/fastapi_admin/widgets/inputs.py +++ b/fastapi_admin/widgets/inputs.py @@ -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