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.
- brilliance_admin/api/routers.py +2 -2
- brilliance_admin/api/views/{graphs.py → dashboard.py} +5 -5
- brilliance_admin/schema/__init__.py +1 -1
- brilliance_admin/schema/admin_schema.py +4 -0
- brilliance_admin/schema/category.py +2 -2
- brilliance_admin/schema/dashboard/__init__.py +1 -0
- brilliance_admin/schema/dashboard/category_dashboard.py +87 -0
- brilliance_admin/translations.py +3 -0
- {brilliance_admin-0.44.10.dist-info → brilliance_admin-0.44.11.dist-info}/METADATA +1 -1
- {brilliance_admin-0.44.10.dist-info → brilliance_admin-0.44.11.dist-info}/RECORD +13 -13
- brilliance_admin/schema/graphs/__init__.py +0 -1
- brilliance_admin/schema/graphs/category_graphs.py +0 -50
- {brilliance_admin-0.44.10.dist-info → brilliance_admin-0.44.11.dist-info}/WHEEL +0 -0
- {brilliance_admin-0.44.10.dist-info → brilliance_admin-0.44.11.dist-info}/licenses/LICENSE +0 -0
- {brilliance_admin-0.44.10.dist-info → brilliance_admin-0.44.11.dist-info}/top_level.txt +0 -0
brilliance_admin/api/routers.py
CHANGED
|
@@ -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.
|
|
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(
|
|
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.
|
|
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="/
|
|
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
|
|
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=
|
|
19
|
+
schema_category, user = await get_category(request, group, category, check_type=CategoryDashboard)
|
|
20
20
|
|
|
21
|
-
result:
|
|
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)
|
|
@@ -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
|
|
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
|
-
|
|
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')
|
brilliance_admin/translations.py
CHANGED
|
@@ -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.
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
34
|
-
brilliance_admin/schema/admin_schema.py,sha256=
|
|
35
|
-
brilliance_admin/schema/category.py,sha256=
|
|
36
|
-
brilliance_admin/schema/
|
|
37
|
-
brilliance_admin/schema/
|
|
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.
|
|
70
|
-
brilliance_admin-0.44.
|
|
71
|
-
brilliance_admin-0.44.
|
|
72
|
-
brilliance_admin-0.44.
|
|
73
|
-
brilliance_admin-0.44.
|
|
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')
|
|
File without changes
|
|
File without changes
|
|
File without changes
|