openadmin-dev 0.6.3__tar.gz → 0.7.3__tar.gz

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.
Files changed (82) hide show
  1. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/PKG-INFO +1 -1
  2. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/analytics.py +3 -2
  3. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/admin_page.py +7 -1
  4. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/stat.py +2 -0
  5. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/__init__.py +5 -2
  6. openadmin_dev-0.7.3/openadmin/spec/colors.py +32 -0
  7. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/component.py +10 -2
  8. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/stat.py +8 -1
  9. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/pyproject.toml +1 -1
  10. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  11. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/ISSUE_TEMPLATE/chore.md +0 -0
  12. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  13. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/branch-name/action.yml +0 -0
  14. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/dependency-cves/action.yml +0 -0
  15. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/format/action.yml +0 -0
  16. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/license/action.yml +0 -0
  17. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/lint/action.yml +0 -0
  18. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/security/action.yml +0 -0
  19. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/spell-check/action.yml +0 -0
  20. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/test/action.yml +0 -0
  21. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/typecheck/action.yml +0 -0
  22. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/actions/unused-code/action.yml +0 -0
  23. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/workflows/ci.yml +0 -0
  24. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.github/workflows/publish.yml +0 -0
  25. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.gitignore +0 -0
  26. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/.python-version +0 -0
  27. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/LICENSE +0 -0
  28. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/LICENSES/AGPL-3.0-or-later.txt +0 -0
  29. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/Makefile +0 -0
  30. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/README.md +0 -0
  31. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/REUSE.toml +0 -0
  32. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/docs/assets/logo.png +0 -0
  33. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/__init__.py +0 -0
  34. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/__init__.py +0 -0
  35. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/authors.py +0 -0
  36. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/books.py +0 -0
  37. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/genres.py +0 -0
  38. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/health.py +0 -0
  39. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/overview.py +0 -0
  40. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/publishers.py +0 -0
  41. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/reports.py +0 -0
  42. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/admin/tags.py +0 -0
  43. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/lib/__init__.py +0 -0
  44. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/lib/database.py +0 -0
  45. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/lib/lifespan.py +0 -0
  46. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/lib/models.py +0 -0
  47. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/lib/seed.py +0 -0
  48. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/examples/main.py +0 -0
  49. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/__init__.py +0 -0
  50. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/action.py +0 -0
  51. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/admin_panel.py +0 -0
  52. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/area_chart.py +0 -0
  53. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/bar_chart.py +0 -0
  54. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/component.py +0 -0
  55. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/counters.py +0 -0
  56. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/deps.py +0 -0
  57. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/form.py +0 -0
  58. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/line_chart.py +0 -0
  59. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/markdown.py +0 -0
  60. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/page_protocol.py +0 -0
  61. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/pagination_params.py +0 -0
  62. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/pie_chart.py +0 -0
  63. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/section.py +0 -0
  64. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/table.py +0 -0
  65. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/fastapi/utils.py +0 -0
  66. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/action.py +0 -0
  67. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/area_chart.py +0 -0
  68. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/bar_chart.py +0 -0
  69. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/form.py +0 -0
  70. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/http_methods.py +0 -0
  71. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/icons.py +0 -0
  72. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/line_chart.py +0 -0
  73. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/markdown.py +0 -0
  74. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/page.py +0 -0
  75. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/pie_chart.py +0 -0
  76. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/property.py +0 -0
  77. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/property_type.py +0 -0
  78. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/section.py +0 -0
  79. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/spec.py +0 -0
  80. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/openadmin/spec/table.py +0 -0
  81. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/tests/test_hello.py +0 -0
  82. {openadmin_dev-0.6.3 → openadmin_dev-0.7.3}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openadmin-dev
3
- Version: 0.6.3
3
+ Version: 0.7.3
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
@@ -4,6 +4,7 @@
4
4
 
5
5
  from sqlalchemy import func, select
6
6
 
7
+ from openadmin import spec
7
8
  from openadmin.fastapi import AdminPage
8
9
 
9
10
  from ..lib import models
@@ -17,13 +18,13 @@ page = AdminPage(
17
18
 
18
19
 
19
20
  @page.stat("Earliest Publication")
20
- async def get_earliest_publication(session: AsyncSessionDep) -> int | str:
21
+ async def get_earliest_publication(session: AsyncSessionDep) -> spec.Stat:
21
22
  result = await session.execute(
22
23
  select(func.min(models.Book.published_year)).where(
23
24
  models.Book.published_year.isnot(None)
24
25
  )
25
26
  )
26
- return result.scalar_one_or_none() or "N/A"
27
+ return {"value": result.scalar_one_or_none() or "N/A", "icon": "sun-medium"}
27
28
 
28
29
 
29
30
  @page.stat("Latest Publication")
@@ -53,9 +53,11 @@ class AdminPage:
53
53
 
54
54
  if isinstance(item, Stat):
55
55
  components.append(
56
- spec.Stat(
56
+ spec.StatComponent(
57
57
  type="stat",
58
58
  id=item.id,
59
+ color=item.color,
60
+ icon=item.icon,
59
61
  name=item.name,
60
62
  description=item.description,
61
63
  method=item.method,
@@ -222,6 +224,8 @@ class AdminPage:
222
224
  self,
223
225
  name: str,
224
226
  *,
227
+ icon: spec.Icon | None = None,
228
+ color: spec.Color | None = None,
225
229
  description: str | None = None,
226
230
  ):
227
231
  kebab_name, unique_name = self.__get_kebab_and_unique_name(name)
@@ -229,6 +233,8 @@ class AdminPage:
229
233
  item = Stat(
230
234
  function_name=unique_name,
231
235
  method="get",
236
+ color=color,
237
+ icon=icon,
232
238
  name=name,
233
239
  description=description,
234
240
  id=kebab_name,
@@ -13,6 +13,8 @@ class Stat:
13
13
  function_name: str
14
14
  method: spec.HttpMethod
15
15
  id: str
16
+ icon: spec.Icon | None
17
+ color: spec.Color | None
16
18
  name: str
17
19
  description: str | None
18
20
  func: Callable | None = field(default=None)
@@ -5,6 +5,7 @@
5
5
  from .action import Action
6
6
  from .area_chart import AreaChart
7
7
  from .bar_chart import BarChart
8
+ from .colors import Color
8
9
  from .component import Component
9
10
  from .form import Form
10
11
  from .http_methods import HttpMethod
@@ -17,7 +18,7 @@ from .property import Property
17
18
  from .property_type import PropertyType
18
19
  from .section import Section
19
20
  from .spec import Spec
20
- from .stat import Stat, StatResponse, StatValue
21
+ from .stat import Stat, StatComponent, StatResponse, StatValue
21
22
  from .table import Table
22
23
 
23
24
  __all__ = [
@@ -34,10 +35,12 @@ __all__ = [
34
35
  "PropertyType",
35
36
  "Section",
36
37
  "Spec",
37
- "Stat",
38
+ "StatComponent",
38
39
  "Table",
39
40
  "Markdown",
40
41
  "Icon",
41
42
  "StatResponse",
42
43
  "StatValue",
44
+ "Stat",
45
+ "Color",
43
46
  ]
@@ -0,0 +1,32 @@
1
+ # SPDX-FileCopyrightText: 2026 OpenAdmin
2
+ #
3
+ # SPDX-License-Identifier: AGPL-3.0-or-later
4
+
5
+ from typing import Literal
6
+
7
+ type Color = Literal[
8
+ "slate",
9
+ "gray",
10
+ "zinc",
11
+ "neutral",
12
+ "stone",
13
+ "red",
14
+ "orange",
15
+ "amber",
16
+ "yellow",
17
+ "lime",
18
+ "green",
19
+ "emerald",
20
+ "teal",
21
+ "cyan",
22
+ "sky",
23
+ "blue",
24
+ "indigo",
25
+ "violet",
26
+ "purple",
27
+ "fuchsia",
28
+ "pink",
29
+ "rose",
30
+ "black",
31
+ "white",
32
+ ]
@@ -11,9 +11,17 @@ from .form import Form
11
11
  from .line_chart import LineChart
12
12
  from .markdown import Markdown
13
13
  from .pie_chart import PieChart
14
- from .stat import Stat
14
+ from .stat import StatComponent
15
15
  from .table import Table
16
16
 
17
17
  type Component = Union[
18
- Stat, Table, AreaChart, BarChart, LineChart, PieChart, Action, Form, Markdown
18
+ StatComponent,
19
+ Table,
20
+ AreaChart,
21
+ BarChart,
22
+ LineChart,
23
+ PieChart,
24
+ Action,
25
+ Form,
26
+ Markdown,
19
27
  ]
@@ -6,14 +6,17 @@ from typing import Literal, NotRequired, TypedDict
6
6
 
7
7
  from pydantic import BaseModel, Field
8
8
 
9
+ from .colors import Color
9
10
  from .http_methods import HttpMethod
10
11
  from .icons import Icon
11
12
  from .property import Property
12
13
 
13
14
 
14
- class Stat(BaseModel):
15
+ class StatComponent(BaseModel):
15
16
  type: Literal["stat"]
16
17
  id: str
18
+ icon: Icon | None
19
+ color: Color | None
17
20
  name: str
18
21
  description: str | None
19
22
  url: str
@@ -27,3 +30,7 @@ type StatValue = str | int | float | bool | None
27
30
  class StatResponse(TypedDict):
28
31
  value: StatValue
29
32
  icon: NotRequired[Icon]
33
+ color: NotRequired[Color]
34
+
35
+
36
+ type Stat = StatValue | StatResponse
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openadmin-dev"
3
- version = "0.6.3"
3
+ version = "0.7.3"
4
4
  description = "Add your description here"
5
5
  authors = [
6
6
  { name="Mykyta Kasianenko", email="mykytakasianenko@gmail.com" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes