openadmin-dev 0.3.0__py3-none-any.whl → 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,8 +4,6 @@
4
4
 
5
5
  from .admin_page import AdminPage
6
6
  from .admin_panel import AdminPanel
7
+ from .deps import PageDep, SearchQueryDep
7
8
 
8
- __all__ = [
9
- "AdminPage",
10
- "AdminPanel",
11
- ]
9
+ __all__ = ["AdminPage", "AdminPanel", "PageDep", "SearchQueryDep"]
@@ -0,0 +1,26 @@
1
+ # SPDX-FileCopyrightText: 2026 OpenAdmin
2
+ #
3
+ # SPDX-License-Identifier: AGPL-3.0-or-later
4
+
5
+ from typing import Annotated
6
+
7
+ from fastapi import Depends, Query
8
+
9
+ from .types import PaginationParams
10
+
11
+
12
+ def pagination_params(
13
+ page: int = Query(default=0, ge=0, description="Page number"),
14
+ per_page: int = Query(default=10, ge=1, description="Number of items per page"),
15
+ ) -> PaginationParams:
16
+ return PaginationParams(page=page, per_page=per_page)
17
+
18
+
19
+ def get_search_query(
20
+ search: str | None = Query(None, min_length=1, description="Search query"),
21
+ ) -> str | None:
22
+ return search
23
+
24
+
25
+ PageDep = Annotated[PaginationParams, Depends(pagination_params)]
26
+ SearchQueryDep = Annotated[str | None, Depends(get_search_query)]
@@ -11,6 +11,7 @@ from .form import Form
11
11
  from .line_chart import LineChart
12
12
  from .markdown import Markdown
13
13
  from .page_protocol import PageProtocol
14
+ from .pagination_params import PaginationParams
14
15
  from .pie_chart import PieChart
15
16
  from .section import Section
16
17
  from .stat import Stat
@@ -33,4 +34,5 @@ __all__ = [
33
34
  "PieChart",
34
35
  "Component",
35
36
  "Markdown",
37
+ "PaginationParams",
36
38
  ]
@@ -3,18 +3,16 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class Action(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class Action:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
17
  is_hidden: bool
20
- func: Callable | None = None
18
+ func: Callable | None = field(default=None)
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class AreaChart(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class AreaChart:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class BarChart(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class BarChart:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -3,18 +3,16 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class Form(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class Form:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
17
  is_hiden: bool
20
- func: Callable | None = None
18
+ func: Callable | None = field(default=None)
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class LineChart(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class LineChart:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class Markdown(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class Markdown:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -0,0 +1,10 @@
1
+ # SPDX-FileCopyrightText: 2026 OpenAdmin
2
+ #
3
+ # SPDX-License-Identifier: AGPL-3.0-or-later
4
+
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class PaginationParams(BaseModel):
9
+ page: int
10
+ per_page: int
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class PieChart(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class PieChart:
15
13
  function_name: str
16
14
  name: str
17
15
  description: str | None
18
16
  method: spec.HttpMethod
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class Stat(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class Stat:
15
13
  function_name: str
16
14
  method: spec.HttpMethod
17
15
  name: str
18
16
  description: str | None
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -3,17 +3,15 @@
3
3
  # SPDX-License-Identifier: AGPL-3.0-or-later
4
4
 
5
5
  from collections.abc import Callable
6
-
7
- from pydantic import BaseModel, ConfigDict
6
+ from dataclasses import dataclass, field
8
7
 
9
8
  from openadmin import spec
10
9
 
11
10
 
12
- class Table(BaseModel):
13
- model_config = ConfigDict(arbitrary_types_allowed=True)
14
-
11
+ @dataclass
12
+ class Table:
15
13
  function_name: str
16
14
  method: spec.HttpMethod
17
15
  name: str
18
16
  description: str | None
19
- func: Callable | None = None
17
+ func: Callable | None = field(default=None)
@@ -8,6 +8,7 @@ from typing import Annotated, get_args, get_origin, get_type_hints
8
8
  import pydantic
9
9
 
10
10
  from fastapi.params import Body as BodyParam
11
+ from fastapi.params import Depends as DependsParam
11
12
  from fastapi.params import Form as FormParam
12
13
  from fastapi.params import Query as QueryParam
13
14
  from openadmin import spec
@@ -131,10 +132,14 @@ def extract_params(
131
132
  marker = None
132
133
  actual_type = annotation
133
134
 
135
+ depends_marker = None
134
136
  if get_origin(annotation) is Annotated:
135
137
  args = get_args(annotation)
136
138
  actual_type = args[0]
137
139
  for arg in args[1:]:
140
+ if isinstance(arg, DependsParam):
141
+ depends_marker = arg
142
+ break
138
143
  if isinstance(arg, (QueryParam, BodyParam, FormParam)):
139
144
  marker = arg
140
145
  break
@@ -142,6 +147,18 @@ def extract_params(
142
147
  if marker is None and isinstance(default, (QueryParam, BodyParam, FormParam)):
143
148
  marker = default
144
149
 
150
+ if depends_marker is not None:
151
+ dep_fn = depends_marker.dependency
152
+ if callable(dep_fn):
153
+ dep_query, dep_body, dep_form = extract_params(dep_fn)
154
+ if dep_query:
155
+ query.extend(dep_query)
156
+ if dep_body:
157
+ body.extend(dep_body)
158
+ if dep_form:
159
+ form.extend(dep_form)
160
+ continue
161
+
145
162
  # FormParam must be checked before BodyParam — Form is a subclass of Body
146
163
  if isinstance(marker, QueryParam):
147
164
  query.append(_make_property(param_name, actual_type, marker))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openadmin-dev
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Add your description here
5
5
  Project-URL: Homepage, https://github.com/openadmin-team/openadmin-py
6
6
  Project-URL: Issues, https://github.com/openadmin-team/openadmin-py/issues
@@ -27,7 +27,7 @@ Description-Content-Type: text/markdown
27
27
  # 🚧 Project is under development 🚧
28
28
  ---
29
29
 
30
- **OpenAdmin** is a FastAPI-native library for building admin dashboards. Define pages with typed decorators — no frontend code, no templates, no configuration files. Every page is just a router; every widget is just an endpoint.
30
+ **OpenAdmin** is a FastAPI-native library for building admin dashboards. Define pages with typed decorators — no frontend code, no templates, no configuration files. Every page is just a router; every widget is just an endpoint
31
31
 
32
32
  ## Features
33
33
 
@@ -1,19 +1,21 @@
1
- openadmin/fastapi/__init__.py,sha256=RiqYntBCCLt9snCMc3D-h3Y-1mTrqc9lHNmkFIjw9FI,209
1
+ openadmin/fastapi/__init__.py,sha256=ssQtgZVSRIZfh7I2mpsj2wdlUryjPoEB3sLwDmMVv5I,269
2
2
  openadmin/fastapi/admin_page.py,sha256=kwEBjxB9iso6mtJmm41goEY-a8RTuF6fcDMzEq0Fk1E,15478
3
3
  openadmin/fastapi/admin_panel.py,sha256=LzpEjIL17Xxf1rXq4e6W2pzG9SErdlFB8NjQxEj7lys,2609
4
- openadmin/fastapi/utils.py,sha256=eleWv0kWZgndSJI2vFTR3C4vlNabL0Nxz1QnuxP6XhA,5180
5
- openadmin/fastapi/types/__init__.py,sha256=VQRRr668R0npyVWYvDSKXoAx4JHbutynHUqOdgEX34E,754
6
- openadmin/fastapi/types/action.py,sha256=MzFtamoavThIXrFkujBJMntZkJGv4JT5IrqOt_Blaxg,432
7
- openadmin/fastapi/types/area_chart.py,sha256=aoLAR6oWSI3vw14zGxRKlnlrnxJLqDDYI8BCk8oOAM8,415
8
- openadmin/fastapi/types/bar_chart.py,sha256=Gl9n93moh7sfFPf4CvZLmjLEuWjy5AdQaOWFi06ACPU,414
9
- openadmin/fastapi/types/form.py,sha256=0Ww-7vrFJP9c5J1_oGbug3fDzrWXOp7M3pYC9LRuhAo,429
10
- openadmin/fastapi/types/line_chart.py,sha256=OWYhEXHPFob-SPnu7shz6Zqf5x1NlqEUt__YW1Gc4jc,415
11
- openadmin/fastapi/types/markdown.py,sha256=2g8uX_n2Shx-6r8ukehv9LMA4iD6i7ynuph65gRgFaQ,414
4
+ openadmin/fastapi/deps.py,sha256=WJzO6zahevIPqAollimsha-2bRF5es-UcaXzllfkktM,722
5
+ openadmin/fastapi/utils.py,sha256=IPG2uSJSe8AeIW4iYSLrMx_8DoDiMr3z_dzG1Gxr4wo,5806
6
+ openadmin/fastapi/types/__init__.py,sha256=v9OMUIeYzS6NNVRqQJQUNCim6Hd8Zi0hbqqssTCrCWw,826
7
+ openadmin/fastapi/types/action.py,sha256=gfGQDHAey8ldg7JIUXFLqidiCmsEfBmYO0H-TRtRsTo,383
8
+ openadmin/fastapi/types/area_chart.py,sha256=gRb3N-XgBJZwYMMQ-uvhdCCeIrQT0fmf6CFLAcQ0DRQ,366
9
+ openadmin/fastapi/types/bar_chart.py,sha256=ZHnK8oE3s0YSWXYwTyh-hziXgiIH5SvL2L1-0DKJMkg,365
10
+ openadmin/fastapi/types/form.py,sha256=tq6J3zdWT_S4y_j8UwclLqx2k8eYWhPmAht_E_1YCE0,380
11
+ openadmin/fastapi/types/line_chart.py,sha256=61Igaw_3_S65ZQZctrfLADZEo9rKhWH9iVUwOfhAc0M,366
12
+ openadmin/fastapi/types/markdown.py,sha256=iXTkZX4_L_-zCAWA7F6j5h0YR6BYjbl4tL6BPpfO0-g,365
12
13
  openadmin/fastapi/types/page_protocol.py,sha256=zMio8SamTFO6_Dxp_8_xnErTC6VEfryVtW_5jOM6oDw,265
13
- openadmin/fastapi/types/pie_chart.py,sha256=MYp1mg7YlEgAA4RiPaz0g-0ynlSRflPc4nZz85soG2M,414
14
+ openadmin/fastapi/types/pagination_params.py,sha256=oVI5VkYYwqpZkJBErQTCbDzGgvjRJFY0rl50rbWII5g,189
15
+ openadmin/fastapi/types/pie_chart.py,sha256=oUpOpCrgsnhsr742f10W3MoVQvtchsDJktLvmEuOLMk,365
14
16
  openadmin/fastapi/types/section.py,sha256=oWo5caUkLrdmvXnc3pdCC3cwLk8iMT4slrH5GnxI0E8,296
15
- openadmin/fastapi/types/stat.py,sha256=fWit9vyIEkVzkf3IxkV73lAtttxgPfWOMfsVQDP44q8,410
16
- openadmin/fastapi/types/table.py,sha256=JzYkV8zTa5rMmMh-tnmVm8Vl_LJefFXPsT0tJvTMjJo,411
17
+ openadmin/fastapi/types/stat.py,sha256=eHLHzjld1E1RtiC6iVa-vdxIysNUtUynurHlxes1c-4,361
18
+ openadmin/fastapi/types/table.py,sha256=3DrRzt7QDQBzVU4bXNsDjr6QKtMKExaEkVQDDUs_tow,362
17
19
  openadmin/spec/__init__.py,sha256=9ZZnQz67JN7TyZhoI43G7aNKkOidXFX5Lxjkr41lYQ8,660
18
20
  openadmin/spec/page.py,sha256=XCiQM_37lTQjjMQjWhrWSHof-pD_j69HZu5n27iHfcA,279
19
21
  openadmin/spec/section.py,sha256=9qZny4rGqHeMpl2VApF8vqLuR-oMsc2kE1DmQdO62BI,261
@@ -31,7 +33,7 @@ openadmin/spec/components/property.py,sha256=svoPxt3miGmK_ySFPFJmGdfZIAYBxaK37Vs
31
33
  openadmin/spec/components/property_type.py,sha256=m1eJ7H5YIP4dhaa899Qc9BCRkZOwP_DELl6vPZB31HY,306
32
34
  openadmin/spec/components/stat.py,sha256=sXQttzMJulS68foVeJ2Y0W4-UH_FSa4nOnxiLfQSGGE,400
33
35
  openadmin/spec/components/table.py,sha256=8dJFnKNj-yOE85mFWQVdoku5tTWA4UZHwV8zId0z6j8,500
34
- openadmin_dev-0.3.0.dist-info/METADATA,sha256=9dbag5eKVKq6sp_uij7wg5hq6KpAKTWEDIbWZ3QH9_4,8941
35
- openadmin_dev-0.3.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
36
- openadmin_dev-0.3.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
37
- openadmin_dev-0.3.0.dist-info/RECORD,,
36
+ openadmin_dev-0.4.0.dist-info/METADATA,sha256=Jn-MNBsy7UfQdNkISX2MCqswjW8xwDafTbsir0GQkNQ,8940
37
+ openadmin_dev-0.4.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
38
+ openadmin_dev-0.4.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
39
+ openadmin_dev-0.4.0.dist-info/RECORD,,