brilliance-admin 0.44.10__py3-none-any.whl → 0.44.11__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,7 +4,7 @@ from .views.schema import router as schema_router
4
4
  from .views.table import router as schema_table
5
5
  from .views.auth import router as schema_auth
6
6
  from .views.autocomplete import router as schema_autocomplete
7
- from .views.graphs import router as schema_graphs
7
+ from .views.dashboard import router as schema_dashboard
8
8
  from .views.settings import router as schema_settings
9
9
  from .views.index import router as schema_index
10
10
 
@@ -13,6 +13,6 @@ brilliance_admin_router.include_router(schema_router)
13
13
  brilliance_admin_router.include_router(schema_table)
14
14
  brilliance_admin_router.include_router(schema_auth)
15
15
  brilliance_admin_router.include_router(schema_autocomplete)
16
- brilliance_admin_router.include_router(schema_graphs)
16
+ brilliance_admin_router.include_router(schema_dashboard)
17
17
  brilliance_admin_router.include_router(schema_settings)
18
18
  brilliance_admin_router.include_router(schema_index)
@@ -4,21 +4,21 @@ from fastapi.responses import JSONResponse
4
4
  from brilliance_admin.api.utils import get_category
5
5
  from brilliance_admin.exceptions import AdminAPIException
6
6
  from brilliance_admin.schema.admin_schema import AdminSchema
7
- from brilliance_admin.schema.graphs.category_graphs import CategoryGraphs, GraphData, GraphsDataResult
7
+ from brilliance_admin.schema.dashboard.category_dashboard import CategoryDashboard, DashboardData, DashboardContainer
8
8
  from brilliance_admin.translations import LanguageContext
9
9
  from brilliance_admin.utils import get_logger
10
10
 
11
- router = APIRouter(prefix="/graph", tags=["Category - Graph"])
11
+ router = APIRouter(prefix="/dashboard", tags=["Category - Dashboard"])
12
12
 
13
13
  logger = get_logger()
14
14
 
15
15
 
16
16
  @router.post(path='/{group}/{category}/')
17
- async def graph_data(request: Request, group: str, category: str, data: GraphData) -> GraphsDataResult:
17
+ async def dashboard_data(request: Request, group: str, category: str, data: DashboardData) -> DashboardContainer:
18
18
  schema: AdminSchema = request.app.state.schema
19
- schema_category, user = await get_category(request, group, category, check_type=CategoryGraphs)
19
+ schema_category, user = await get_category(request, group, category, check_type=CategoryDashboard)
20
20
 
21
- result: GraphsDataResult = await schema_category.get_data(data, user)
21
+ result: DashboardContainer = await schema_category.get_data(data, user)
22
22
 
23
23
  language_slug = request.headers.get('Accept-Language')
24
24
  language_context: LanguageContext = schema.get_language_context(language_slug)
@@ -2,6 +2,6 @@
2
2
  # flake8: noqa: F405
3
3
  from .admin_schema import AdminSchema, AdminSchemaData
4
4
  from .category import CategoryGroup, CategoryLink
5
- from .graphs import *
5
+ from .dashboard import *
6
6
  from .table import *
7
7
  from .table.category_table import CategoryTable
@@ -40,6 +40,7 @@ class AdminSettingsData(DataclassBase):
40
40
  login_greetings_message: SupportsStr | None
41
41
  navbar_density: str
42
42
  languages: Dict[str, str] | None
43
+ main_page: str | None = None
43
44
 
44
45
 
45
46
  @dataclass
@@ -54,6 +55,8 @@ class AdminSchema:
54
55
  categories: List[BaseCategory]
55
56
  auth: Any
56
57
 
58
+ main_page: str | None = None
59
+
57
60
  title: SupportsStr | None = 'Admin'
58
61
  description: SupportsStr | None = None
59
62
  login_greetings_message: SupportsStr | None = None
@@ -118,6 +121,7 @@ class AdminSchema:
118
121
 
119
122
  return AdminSettingsData(
120
123
  title=self.title,
124
+ main_page=self.main_page,
121
125
  description=self.description,
122
126
  login_greetings_message=self.login_greetings_message,
123
127
  navbar_density=self.navbar_density,
@@ -95,7 +95,7 @@ class TableInfoSchemaData(DataclassBase):
95
95
 
96
96
 
97
97
  @dataclass
98
- class GraphInfoSchemaData(DataclassBase):
98
+ class DashboardInfoSchemaData(DataclassBase):
99
99
  search_enabled: bool
100
100
  search_help: str | None
101
101
 
@@ -112,7 +112,7 @@ class CategorySchemaData(DataclassBase):
112
112
  categories: dict = Field(default_factory=dict)
113
113
 
114
114
  table_info: TableInfoSchemaData | None = None
115
- graph_info: GraphInfoSchemaData | None = None
115
+ dashboard_info: DashboardInfoSchemaData | None = None
116
116
 
117
117
  link: str | None = None
118
118
 
@@ -0,0 +1 @@
1
+ from .category_dashboard import CategoryDashboard
@@ -0,0 +1,87 @@
1
+ from typing import Any, Dict, List
2
+
3
+ from pydantic import BaseModel, Field, field_serializer
4
+
5
+ from brilliance_admin.schema.category import BaseCategory, DashboardInfoSchemaData
6
+ from brilliance_admin.schema.table.fields_schema import FieldsSchema
7
+ from brilliance_admin.translations import LanguageContext
8
+ from brilliance_admin.utils import SupportsStr
9
+
10
+
11
+ class DashboardData(BaseModel):
12
+ search: str | None = None
13
+ filters: Dict[str, Any] = Field(default_factory=dict)
14
+
15
+
16
+ class ChartData(BaseModel):
17
+ data: dict
18
+ options: dict
19
+ width: int | None = None
20
+ height: int = 50
21
+ type: str = 'line'
22
+
23
+ component_type: str = 'chart'
24
+
25
+
26
+ class Subcard(BaseModel):
27
+ title: SupportsStr
28
+ value: SupportsStr
29
+ color: str | None = None
30
+
31
+
32
+ class PeriodGraph(BaseModel):
33
+ title: SupportsStr
34
+ value: SupportsStr
35
+ change: int | float | None = None
36
+ subcards: List[Subcard] = Field(default_factory=list)
37
+ values: List[List[int | float]] = Field(default_factory=list)
38
+ vertical: List[SupportsStr] = Field(default_factory=list)
39
+ horizontal: List[SupportsStr] = Field(default_factory=list)
40
+ component_type: str = 'period_graph'
41
+
42
+ @field_serializer('horizontal', 'vertical')
43
+ def serialize_str_list(self, val: list) -> list:
44
+ return [str(v) for v in val]
45
+
46
+
47
+ class SmallGraph(BaseModel):
48
+ title: SupportsStr
49
+ value: SupportsStr
50
+ change: int | float | None = None
51
+ points: Dict[SupportsStr, float | int] = Field(default_factory=list)
52
+ component_type: str = 'small_graph'
53
+
54
+
55
+ class DashboardContainer(BaseModel):
56
+ cols: int | None = None
57
+ md: int | None = None
58
+ lg: int | None = None
59
+ sm: int | None = None
60
+
61
+ component_type: str = 'container'
62
+ components: List[Any] = Field(default_factory=list)
63
+
64
+
65
+ class CategoryDashboard(BaseCategory):
66
+ _type_slug: str = 'dashboard'
67
+
68
+ search_enabled: bool = False
69
+ search_help: SupportsStr | None = None
70
+
71
+ table_filters: FieldsSchema | None = None
72
+
73
+ def generate_schema(self, user, language_context: LanguageContext) -> DashboardInfoSchemaData:
74
+ schema = super().generate_schema(user, language_context)
75
+ dashboard_info = DashboardInfoSchemaData(
76
+ search_enabled=self.search_enabled,
77
+ search_help=language_context.get_text(self.search_help),
78
+ )
79
+
80
+ if self.table_filters:
81
+ dashboard_info.table_filters = self.table_filters.generate_schema(user, language_context)
82
+
83
+ schema.dashboard_info = dashboard_info
84
+ return schema
85
+
86
+ async def get_data(self, data: DashboardData, user) -> DashboardContainer:
87
+ raise NotImplementedError('get_data is not implemented')
@@ -21,6 +21,9 @@ class TranslateText(DataclassBase):
21
21
  def __init__(self, slug: str):
22
22
  self.slug = slug
23
23
 
24
+ def __hash__(self):
25
+ return hash(self.slug)
26
+
24
27
  @pydantic.model_serializer(mode='plain')
25
28
  def serialize_model(self, info: pydantic.SerializationInfo) -> str:
26
29
  ctx = info.context or {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brilliance-admin
3
- Version: 0.44.10
3
+ Version: 0.44.11
4
4
  Summary: Simple and lightweight data managment framework powered by FastAPI and Vue3 Vuetify all-in-one. Some call it heavenly in its brilliance.
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.10
@@ -2,15 +2,15 @@ brilliance_admin/__init__.py,sha256=qxGzLVhFNm2FKL2lVt7bEFb6pTPqyXEQvUsDfyfv6SM,
2
2
  brilliance_admin/auth.py,sha256=d57XRfLJIbOosLP1-0SCFkePPT8M5WhLcwxu4yW92RA,673
3
3
  brilliance_admin/docs.py,sha256=fKeJKuiCCi1jHRmNcmkuDD6_2di7bwc6-w8V1VCTu0s,1231
4
4
  brilliance_admin/exceptions.py,sha256=CJGvpo7EiaX3RVAEUDpwgH_Tuw8kY7tMy57pVcnBxak,947
5
- brilliance_admin/translations.py,sha256=I_iSfj05Qv5fbZqDvnnHZGUFsi1wk-J0EXSftKBLw5Q,3850
5
+ brilliance_admin/translations.py,sha256=r5xy3Iara_7m2E7rgG8goPFDcKdPLUGAKIWIt6TdulA,3906
6
6
  brilliance_admin/utils.py,sha256=M_0WANlb-1NW4aOA33MxOgoRx0GIVJ6w6PCGKAwmflk,5971
7
7
  brilliance_admin/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- brilliance_admin/api/routers.py,sha256=GXz-GFXRH5VbDH1r5O9LLnnmaMhbQq4RctzVEubHnsk,810
8
+ brilliance_admin/api/routers.py,sha256=S8IV7JxA1wLspYn3qxESMI3Qt6UhQK-Gy0PsZi8hcwQ,819
9
9
  brilliance_admin/api/utils.py,sha256=ezvHK49OlpCdT9fLB41Y1nswZDLdzC3zTcQtGtuTYUk,999
10
10
  brilliance_admin/api/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  brilliance_admin/api/views/auth.py,sha256=Qmd9KuFqCeNhQukYl0W62kcUYPMtgMekjkaTvz1AArM,1133
12
12
  brilliance_admin/api/views/autocomplete.py,sha256=lpFDq46OCuiPhkUedv4y6GmJQVy3iX4P-di_-GMzabY,1516
13
- brilliance_admin/api/views/graphs.py,sha256=nn91zoFRZ0FvSkFJoTy7ZQEr8B2cUj43nd8OxPsSmTQ,1351
13
+ brilliance_admin/api/views/dashboard.py,sha256=tLFdbKrePH-A91HNCN4F_FXdlRQ1tA9D2tGLvzDOoFM,1389
14
14
  brilliance_admin/api/views/index.py,sha256=DkMshrs5zmqpbbF9G2RhqeLGFKMrkrAmQ6nnba7aLl8,1400
15
15
  brilliance_admin/api/views/schema.py,sha256=MS9v9Qy3cRO9gGs4uW2PNRBS6Uw48sLRGRe49jnJ2yM,1019
16
16
  brilliance_admin/api/views/settings.py,sha256=2A9suZQONEtW9LkFban29Fe5ipQaaGT0CzpxnbuotJQ,1166
@@ -30,11 +30,11 @@ brilliance_admin/integrations/sqlalchemy/table/retrieve.py,sha256=EKwGH8Mz3Jd-uR
30
30
  brilliance_admin/integrations/sqlalchemy/table/update.py,sha256=NxcYPqRZbm_BM-4QHzEbhgAhYSs3SXzYMMzKCalqahU,3800
31
31
  brilliance_admin/locales/en.yml,sha256=YBjkq2Tm0KjXKOMgnIM5etO42Pkm8mDdQlvmpITwsA4,1453
32
32
  brilliance_admin/locales/ru.yml,sha256=9MKJaJyx6dALP6CQkLQMJvgZdp8nwgnBxDsRZiYhlnc,2052
33
- brilliance_admin/schema/__init__.py,sha256=tZIRTSKFsNOmDqjoAgtYthYrT8ljPvLnYRzfupBLT00,290
34
- brilliance_admin/schema/admin_schema.py,sha256=cYfyYko5lDh1ysBhTTrxDjMDJ3r01yAd3_R1Lsy-7WU,6707
35
- brilliance_admin/schema/category.py,sha256=D2aIpDyL-2CibkpenNu8uyh4AzOdQ2ArTDltVYS7xZQ,6592
36
- brilliance_admin/schema/graphs/__init__.py,sha256=qvmZv9QWdiutPtN5VYQLYbsjY2SOg8p_XRaz2rUlIxY,44
37
- brilliance_admin/schema/graphs/category_graphs.py,sha256=iTjwjQoZocEfJWJEAdYcJTGCLXWexJVpOiKSfGzrRS8,1486
33
+ brilliance_admin/schema/__init__.py,sha256=H5UFO5dub_k5id8WdGRVy9G8RnqZuBSjw9XgPafj1VQ,293
34
+ brilliance_admin/schema/admin_schema.py,sha256=SGdNuYUKrwAc6SA4RYh8TgSrod5RuY7lpXKzmY1SHZ4,6812
35
+ brilliance_admin/schema/category.py,sha256=UTnUexbCHe9vfwi3ygX34YkLAH2ixfMWqe4H6xos0fI,6604
36
+ brilliance_admin/schema/dashboard/__init__.py,sha256=RxE5nNs5X3iWGXBOA518hFyJMSRLEcXr0PNb8HZrjxs,50
37
+ brilliance_admin/schema/dashboard/category_dashboard.py,sha256=rsEuWLpcfcrnzMeKIQCMFDYNF9H7LEfqEKlm63Sh7PE,2650
38
38
  brilliance_admin/schema/table/__init__.py,sha256=vuRw8HBuak2LaTZi2dNn5YOrJPalQps-O3Ht-d0AZV4,378
39
39
  brilliance_admin/schema/table/admin_action.py,sha256=0ymRL9DKkBK-AF6wKy7K9R4hkmblh55eHuZA_rjO1Lk,2018
40
40
  brilliance_admin/schema/table/category_table.py,sha256=AHR6fatZTdRKvUnks7DzQm0V0OwID-59khTxosEXoHE,6817
@@ -66,8 +66,8 @@ brilliance_admin/static/tinymce/plugins/codesample/css/prism.css,sha256=exAdMtHb
66
66
  brilliance_admin/static/tinymce/plugins/customLink/plugin.js,sha256=illBNpnHDkBsLG6wo_jDPF6z7CGnO1MQWUoDwZKy6vQ,5589
67
67
  brilliance_admin/static/tinymce/plugins/customLink/css/link.css,sha256=gh5nvY8Z92hJfCEBPnIm4jIPCcKKbJnab-30oIfX7Hc,56
68
68
  brilliance_admin/templates/index.html,sha256=Grsp-PTotLZkMmph8PJjxpnVpRZNx7B7F5VVmOoSpfA,1294
69
- brilliance_admin-0.44.10.dist-info/licenses/LICENSE,sha256=rgWE5Cxk53W0PhTOVmcQedABEWN1QMG-PRz3fz531sE,1074
70
- brilliance_admin-0.44.10.dist-info/METADATA,sha256=k6P6yu_Tj26u157thb1YBlfDlgC7YigBQFc3QhtEtaY,7393
71
- brilliance_admin-0.44.10.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
72
- brilliance_admin-0.44.10.dist-info/top_level.txt,sha256=almFFSWrVYieI3i54hYL0fMUaeuIYiazS2Kx4wtK-ns,17
73
- brilliance_admin-0.44.10.dist-info/RECORD,,
69
+ brilliance_admin-0.44.11.dist-info/licenses/LICENSE,sha256=rgWE5Cxk53W0PhTOVmcQedABEWN1QMG-PRz3fz531sE,1074
70
+ brilliance_admin-0.44.11.dist-info/METADATA,sha256=Rl2WPj1vJnkb3eHudwsUfjlT9lXfVHvlhRW4CTwChIQ,7393
71
+ brilliance_admin-0.44.11.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
72
+ brilliance_admin-0.44.11.dist-info/top_level.txt,sha256=almFFSWrVYieI3i54hYL0fMUaeuIYiazS2Kx4wtK-ns,17
73
+ brilliance_admin-0.44.11.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- from .category_graphs import CategoryGraphs
@@ -1,50 +0,0 @@
1
- from typing import Any, Dict, List
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- from brilliance_admin.schema.category import BaseCategory, GraphInfoSchemaData
6
- from brilliance_admin.schema.table.fields_schema import FieldsSchema
7
- from brilliance_admin.translations import LanguageContext
8
- from brilliance_admin.utils import SupportsStr
9
-
10
-
11
- class GraphData(BaseModel):
12
- search: str | None = None
13
- filters: Dict[str, Any] = Field(default_factory=dict)
14
-
15
-
16
- class ChartData(BaseModel):
17
- data: dict
18
- options: dict
19
- width: int | None = None
20
- height: int = 50
21
- type: str = 'line'
22
-
23
-
24
- class GraphsDataResult(BaseModel):
25
- charts: List[ChartData]
26
-
27
-
28
- class CategoryGraphs(BaseCategory):
29
- _type_slug: str = 'graphs'
30
-
31
- search_enabled: bool = False
32
- search_help: SupportsStr | None = None
33
-
34
- table_filters: FieldsSchema | None = None
35
-
36
- def generate_schema(self, user, language_context: LanguageContext) -> GraphInfoSchemaData:
37
- schema = super().generate_schema(user, language_context)
38
- graph = GraphInfoSchemaData(
39
- search_enabled=self.search_enabled,
40
- search_help=language_context.get_text(self.search_help),
41
- )
42
-
43
- if self.table_filters:
44
- graph.table_filters = self.table_filters.generate_schema(user, language_context)
45
-
46
- schema.graph_info = graph
47
- return schema
48
-
49
- async def get_data(self, data: GraphData, user) -> GraphsDataResult:
50
- raise NotImplementedError('get_data is not implemented')