brilliance-admin 0.40.0__tar.gz → 0.41.0__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.
- brilliance_admin-0.41.0/PKG-INFO +155 -0
- brilliance_admin-0.41.0/README.md +125 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/admin_schema.py +10 -4
- brilliance_admin-0.41.0/admin_panel/static/favicon.jpg +0 -0
- brilliance_admin-0.40.0/admin_panel/static/index-SCeDXvci.js → brilliance_admin-0.41.0/admin_panel/static/index-BeniOHDv.js +134 -134
- brilliance_admin-0.40.0/admin_panel/static/index-BrXRRuaE.css → brilliance_admin-0.41.0/admin_panel/static/index-vlBToOhT.css +1 -1
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/templates/index.html +2 -2
- brilliance_admin-0.41.0/brilliance_admin.egg-info/PKG-INFO +155 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/brilliance_admin.egg-info/SOURCES.txt +6 -3
- brilliance_admin-0.41.0/example/README.md +32 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/main.py +3 -0
- brilliance_admin-0.41.0/example/static/logo.png +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/pyproject.toml +2 -2
- brilliance_admin-0.41.0/tests/test_index_context_data.py +32 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/uv.lock +1 -1
- brilliance_admin-0.40.0/PKG-INFO +0 -87
- brilliance_admin-0.40.0/README.md +0 -57
- brilliance_admin-0.40.0/admin_panel/static/favicon.ico +0 -0
- brilliance_admin-0.40.0/brilliance_admin.egg-info/PKG-INFO +0 -87
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.configs/docker/Dockerfile +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.configs/docker/docker-compose.yml +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.configs/nginx/example.conf +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.env +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.github/workflows/certbot.yml +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.github/workflows/deploy.yml +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.github/workflows/install-docker.yml +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.gitignore +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.isort.cfg +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/.python-version +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/LICENSE +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/routers.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/utils.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/auth.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/autocomplete.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/graphs.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/index.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/schema.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/settings.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/api/views/table.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/auth.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/docs.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/exceptions.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/auth.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/autocomplete.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/fields.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/fields_schema.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/base.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/create.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/delete.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/list.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/retrieve.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/integrations/sqlalchemy/table/update.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/category.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/graphs/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/graphs/category_graphs.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/group.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/admin_action.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/category_table.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/fields/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/fields/base.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/fields/function_field.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/fields_schema.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/schema/table/table_models.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/dark-first/content.min.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/dark-first/skin.min.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/dark-slim/content.min.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/dark-slim/skin.min.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/img/example.png +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/img/tinymce.woff2 +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/lightgray/content.min.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/lightgray/skin.min.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/plugins/accordion/css/accordion.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/plugins/accordion/plugin.js +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/plugins/codesample/css/prism.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/plugins/customLink/css/link.css +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/plugins/customLink/plugin.js +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/tinymce/tinymce.min.js +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/static/vanilla-picker-B6E6ObS_.js +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/translations.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/admin_panel/utils.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/brilliance_admin.egg-info/dependency_links.txt +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/brilliance_admin.egg-info/requires.txt +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/brilliance_admin.egg-info/top_level.txt +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/phrases.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/currency.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/graphs.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/merchant.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/models.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/payments.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/terminal.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sections/users.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/sqlite.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/example/utils.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/setup.cfg +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/__init__.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/conftest.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_action.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_payments_fields_schema.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_sqlalcmeny_auth.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_sqlalcmeny_crud.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_sqlalcmeny_filters.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_sqlalcmeny_schema.py +0 -0
- {brilliance_admin-0.40.0 → brilliance_admin-0.41.0}/tests/test_translations.py +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: brilliance-admin
|
|
3
|
+
Version: 0.41.0
|
|
4
|
+
Summary: General-purpose admin panel framework powered by FastAPI. Some call it heavenly in its brilliance.
|
|
5
|
+
License-Expression: AGPL-3.0
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: asgiref>=3.11.0
|
|
10
|
+
Requires-Dist: fastapi>=0.115.8
|
|
11
|
+
Requires-Dist: jinja2>=3.1.6
|
|
12
|
+
Provides-Extra: example
|
|
13
|
+
Requires-Dist: uvicorn>=0.34.0; extra == "example"
|
|
14
|
+
Requires-Dist: faker>=38.2.0; extra == "example"
|
|
15
|
+
Requires-Dist: pyjwt>=2.10.1; extra == "example"
|
|
16
|
+
Requires-Dist: structlog>=25.5.0; extra == "example"
|
|
17
|
+
Requires-Dist: rich>=14.2.0; extra == "example"
|
|
18
|
+
Provides-Extra: tests
|
|
19
|
+
Requires-Dist: pytest>=8.4.2; extra == "tests"
|
|
20
|
+
Requires-Dist: pytest-asyncio>=1.2.0; extra == "tests"
|
|
21
|
+
Requires-Dist: httpx>=0.28.1; extra == "tests"
|
|
22
|
+
Requires-Dist: pytest-mock>=3.15.1; extra == "tests"
|
|
23
|
+
Requires-Dist: sqlalchemy>=2.0.41; extra == "tests"
|
|
24
|
+
Requires-Dist: aiosqlite>=0.22.1; extra == "tests"
|
|
25
|
+
Requires-Dist: factory-boy>=3.3.3; extra == "tests"
|
|
26
|
+
Requires-Dist: pyjwt>=2.10.1; extra == "tests"
|
|
27
|
+
Provides-Extra: scalar
|
|
28
|
+
Requires-Dist: scalar-fastapi>=1.5.0; extra == "scalar"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
<div align="center">
|
|
32
|
+
<img src="https://github.com/brilliance-admin/backend-python/blob/main/example/static/logo.png?raw=true"
|
|
33
|
+
alt="Brilliance Admin"
|
|
34
|
+
width="600">
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div align="center">
|
|
38
|
+
|
|
39
|
+
[](https://pypi.org/project/brilliance-admin/)
|
|
40
|
+
[](https://github.com/brilliance-admin/backend-python/blob/main/LICENSE)
|
|
41
|
+
[](https://github.com/brilliance-admin/backend-python/actions)
|
|
42
|
+
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
General-purpose admin panel framework powered by FastAPI. Some call it heavenly in its brilliance.
|
|
46
|
+
|
|
47
|
+
- Serves a prebuilt SPA frontend as static files
|
|
48
|
+
- Generates schemas for frontend sections on the backend
|
|
49
|
+
- Provides a backend-driven API for admin interfaces
|
|
50
|
+
- Designed for fast data management and data viewing from any sources
|
|
51
|
+
- Inspired by Django Admin and Django REST Framework
|
|
52
|
+
- Focused on minimal boilerplate and simplified backend-controlled configuration
|
|
53
|
+
|
|
54
|
+
### [Live Demo](https://brilliance-admin.com/) | [Example App](https://github.com/brilliance-admin/backend-python/tree/main/example) | Documentation (todo)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### Features:
|
|
58
|
+
|
|
59
|
+
* Tables with full CRUD support, including filtering, sorting, and pagination.
|
|
60
|
+
* Ability to define custom table actions with forms, response messages, and file uploads.
|
|
61
|
+
* SQLAlchemy integration with automatic field generation from models.
|
|
62
|
+
* Authorization via any account data source.
|
|
63
|
+
* Localization support with language selection in the interface.
|
|
64
|
+
|
|
65
|
+
## How to use it
|
|
66
|
+
|
|
67
|
+
Installation:
|
|
68
|
+
``` shell
|
|
69
|
+
pip install brilliance-admin
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
You need to generate `AdminSchema` instance:
|
|
73
|
+
``` python
|
|
74
|
+
from admin_panel import schema
|
|
75
|
+
|
|
76
|
+
admin_schema = schema.AdminSchema(
|
|
77
|
+
title='Admin Panel',
|
|
78
|
+
auth=YourAdminAuthentication(),
|
|
79
|
+
groups=[
|
|
80
|
+
schema.Group(
|
|
81
|
+
slug='example',
|
|
82
|
+
title='Example',
|
|
83
|
+
icon='mdi-star',
|
|
84
|
+
categories=[
|
|
85
|
+
CategoryExample(),
|
|
86
|
+
]
|
|
87
|
+
),
|
|
88
|
+
],
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
admin_app = admin_schema.generate_app()
|
|
92
|
+
|
|
93
|
+
# Your FastAPI app
|
|
94
|
+
app = FastAPI()
|
|
95
|
+
app.mount('/admin', admin_app)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### SQLAlchemy integration
|
|
99
|
+
Brilliance Admin supports automatic schema generation from SQLAlchemy and provides a ready-made CRUD implementation for tables.
|
|
100
|
+
|
|
101
|
+
``` python
|
|
102
|
+
from admin_panel import sqlalchemy
|
|
103
|
+
from admin_panel.translations import TranslateText as _
|
|
104
|
+
|
|
105
|
+
from your_project.models import Terminal
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class TerminalAdmin(sqlalchemy.SQLAlchemyAdmin):
|
|
109
|
+
db_async_session = async_sessionmaker
|
|
110
|
+
model = Terminal
|
|
111
|
+
title = _('terminals')
|
|
112
|
+
icon = 'mdi-console-network-outline'
|
|
113
|
+
|
|
114
|
+
ordering_fields = ['id']
|
|
115
|
+
search_fields = ['id', 'title']
|
|
116
|
+
|
|
117
|
+
table_schema = sqlalchemy.SQLAlchemyFieldsSchema(
|
|
118
|
+
model=Terminal,
|
|
119
|
+
list_display=['id', 'merchant_id'],
|
|
120
|
+
)
|
|
121
|
+
table_filters = sqlalchemy.SQLAlchemyFieldsSchema(
|
|
122
|
+
model=Terminal,
|
|
123
|
+
fields=['id', 'created_at'],
|
|
124
|
+
created_at=schema.DateTimeField(range=True),
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
category = TerminalAdmin()
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Now, the `TerminalAdmin` instance can be passed to `categories`.
|
|
132
|
+
|
|
133
|
+
### Can be used both via inheritance and instancing
|
|
134
|
+
|
|
135
|
+
For `SQLAlchemyFieldsSchema`
|
|
136
|
+
|
|
137
|
+
``` python
|
|
138
|
+
class TerminalTableSchema(sqlalchemy.SQLAlchemyFieldsSchema):
|
|
139
|
+
model = Terminal
|
|
140
|
+
fields = ['id', 'created_at']
|
|
141
|
+
|
|
142
|
+
created_at=schema.DateTimeField(range=True)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class TerminalAdmin(sqlalchemy.SQLAlchemyAdmin):
|
|
146
|
+
table_schema = TerminalTableSchema()
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
And `SQLAlchemyAdmin` category schema itself
|
|
150
|
+
|
|
151
|
+
> If `table_schema` is not specified, it will be generated automatically and will include all discovered fields and relationships of the table in the output.
|
|
152
|
+
|
|
153
|
+
``` python
|
|
154
|
+
category = sqlalchemy.SQLAlchemyAdmin(db_async_session=async_sessionmaker, model=Terminal)
|
|
155
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="https://github.com/brilliance-admin/backend-python/blob/main/example/static/logo.png?raw=true"
|
|
3
|
+
alt="Brilliance Admin"
|
|
4
|
+
width="600">
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<div align="center">
|
|
8
|
+
|
|
9
|
+
[](https://pypi.org/project/brilliance-admin/)
|
|
10
|
+
[](https://github.com/brilliance-admin/backend-python/blob/main/LICENSE)
|
|
11
|
+
[](https://github.com/brilliance-admin/backend-python/actions)
|
|
12
|
+
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
General-purpose admin panel framework powered by FastAPI. Some call it heavenly in its brilliance.
|
|
16
|
+
|
|
17
|
+
- Serves a prebuilt SPA frontend as static files
|
|
18
|
+
- Generates schemas for frontend sections on the backend
|
|
19
|
+
- Provides a backend-driven API for admin interfaces
|
|
20
|
+
- Designed for fast data management and data viewing from any sources
|
|
21
|
+
- Inspired by Django Admin and Django REST Framework
|
|
22
|
+
- Focused on minimal boilerplate and simplified backend-controlled configuration
|
|
23
|
+
|
|
24
|
+
### [Live Demo](https://brilliance-admin.com/) | [Example App](https://github.com/brilliance-admin/backend-python/tree/main/example) | Documentation (todo)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Features:
|
|
28
|
+
|
|
29
|
+
* Tables with full CRUD support, including filtering, sorting, and pagination.
|
|
30
|
+
* Ability to define custom table actions with forms, response messages, and file uploads.
|
|
31
|
+
* SQLAlchemy integration with automatic field generation from models.
|
|
32
|
+
* Authorization via any account data source.
|
|
33
|
+
* Localization support with language selection in the interface.
|
|
34
|
+
|
|
35
|
+
## How to use it
|
|
36
|
+
|
|
37
|
+
Installation:
|
|
38
|
+
``` shell
|
|
39
|
+
pip install brilliance-admin
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
You need to generate `AdminSchema` instance:
|
|
43
|
+
``` python
|
|
44
|
+
from admin_panel import schema
|
|
45
|
+
|
|
46
|
+
admin_schema = schema.AdminSchema(
|
|
47
|
+
title='Admin Panel',
|
|
48
|
+
auth=YourAdminAuthentication(),
|
|
49
|
+
groups=[
|
|
50
|
+
schema.Group(
|
|
51
|
+
slug='example',
|
|
52
|
+
title='Example',
|
|
53
|
+
icon='mdi-star',
|
|
54
|
+
categories=[
|
|
55
|
+
CategoryExample(),
|
|
56
|
+
]
|
|
57
|
+
),
|
|
58
|
+
],
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
admin_app = admin_schema.generate_app()
|
|
62
|
+
|
|
63
|
+
# Your FastAPI app
|
|
64
|
+
app = FastAPI()
|
|
65
|
+
app.mount('/admin', admin_app)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### SQLAlchemy integration
|
|
69
|
+
Brilliance Admin supports automatic schema generation from SQLAlchemy and provides a ready-made CRUD implementation for tables.
|
|
70
|
+
|
|
71
|
+
``` python
|
|
72
|
+
from admin_panel import sqlalchemy
|
|
73
|
+
from admin_panel.translations import TranslateText as _
|
|
74
|
+
|
|
75
|
+
from your_project.models import Terminal
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class TerminalAdmin(sqlalchemy.SQLAlchemyAdmin):
|
|
79
|
+
db_async_session = async_sessionmaker
|
|
80
|
+
model = Terminal
|
|
81
|
+
title = _('terminals')
|
|
82
|
+
icon = 'mdi-console-network-outline'
|
|
83
|
+
|
|
84
|
+
ordering_fields = ['id']
|
|
85
|
+
search_fields = ['id', 'title']
|
|
86
|
+
|
|
87
|
+
table_schema = sqlalchemy.SQLAlchemyFieldsSchema(
|
|
88
|
+
model=Terminal,
|
|
89
|
+
list_display=['id', 'merchant_id'],
|
|
90
|
+
)
|
|
91
|
+
table_filters = sqlalchemy.SQLAlchemyFieldsSchema(
|
|
92
|
+
model=Terminal,
|
|
93
|
+
fields=['id', 'created_at'],
|
|
94
|
+
created_at=schema.DateTimeField(range=True),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
category = TerminalAdmin()
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Now, the `TerminalAdmin` instance can be passed to `categories`.
|
|
102
|
+
|
|
103
|
+
### Can be used both via inheritance and instancing
|
|
104
|
+
|
|
105
|
+
For `SQLAlchemyFieldsSchema`
|
|
106
|
+
|
|
107
|
+
``` python
|
|
108
|
+
class TerminalTableSchema(sqlalchemy.SQLAlchemyFieldsSchema):
|
|
109
|
+
model = Terminal
|
|
110
|
+
fields = ['id', 'created_at']
|
|
111
|
+
|
|
112
|
+
created_at=schema.DateTimeField(range=True)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class TerminalAdmin(sqlalchemy.SQLAlchemyAdmin):
|
|
116
|
+
table_schema = TerminalTableSchema()
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
And `SQLAlchemyAdmin` category schema itself
|
|
120
|
+
|
|
121
|
+
> If `table_schema` is not specified, it will be generated automatically and will include all discovered fields and relationships of the table in the output.
|
|
122
|
+
|
|
123
|
+
``` python
|
|
124
|
+
category = sqlalchemy.SQLAlchemyAdmin(db_async_session=async_sessionmaker, model=Terminal)
|
|
125
|
+
```
|
|
@@ -33,7 +33,6 @@ class AdminSettingsData(DataclassBase):
|
|
|
33
33
|
description: str | TranslateText | None
|
|
34
34
|
login_greetings_message: str | TranslateText | None
|
|
35
35
|
navbar_density: str
|
|
36
|
-
logo_image: str | None
|
|
37
36
|
languages: Dict[str, str] | None
|
|
38
37
|
|
|
39
38
|
|
|
@@ -52,9 +51,12 @@ class AdminSchema:
|
|
|
52
51
|
title: str | TranslateText | None = 'Admin'
|
|
53
52
|
description: str | TranslateText | None = None
|
|
54
53
|
login_greetings_message: str | TranslateText | None = None
|
|
54
|
+
|
|
55
|
+
logo_image: str | None = None
|
|
56
|
+
favicon_image: str = '/admin/static/favicon.jpg'
|
|
57
|
+
|
|
55
58
|
navbar_density: str = 'default'
|
|
56
59
|
|
|
57
|
-
favicon_image: str = '/admin/static/favicon.ico'
|
|
58
60
|
backend_prefix = None
|
|
59
61
|
static_prefix = None
|
|
60
62
|
|
|
@@ -107,7 +109,6 @@ class AdminSchema:
|
|
|
107
109
|
description=self.description,
|
|
108
110
|
login_greetings_message=self.login_greetings_message,
|
|
109
111
|
navbar_density=self.navbar_density,
|
|
110
|
-
logo_image=None,
|
|
111
112
|
languages=languages,
|
|
112
113
|
)
|
|
113
114
|
|
|
@@ -171,11 +172,16 @@ class AdminSchema:
|
|
|
171
172
|
if not static_prefix:
|
|
172
173
|
static_prefix = urljoin(str(request.base_url), '/admin/static/')
|
|
173
174
|
|
|
175
|
+
logo_image = self.logo_image
|
|
176
|
+
if logo_image and logo_image.startswith('/'):
|
|
177
|
+
logo_image = urljoin(str(request.base_url), logo_image)
|
|
178
|
+
|
|
174
179
|
settings_json = {
|
|
175
180
|
'backend_prefix': backend_prefix,
|
|
176
181
|
'static_prefix': static_prefix,
|
|
177
|
-
'version': importlib.metadata.version('admin
|
|
182
|
+
'version': importlib.metadata.version('brilliance-admin'),
|
|
178
183
|
'api_timeout_ms': 1000 * 5,
|
|
184
|
+
'logo_image': logo_image,
|
|
179
185
|
}
|
|
180
186
|
data = AdminIndexContextData(
|
|
181
187
|
title=str(self.title),
|
|
Binary file
|