brilliance-admin 0.43.5__tar.gz → 0.43.7__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.43.5 → brilliance_admin-0.43.7}/PKG-INFO +18 -15
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/README.md +16 -13
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/__init__.py +1 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +6 -2
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/fields.py +11 -12
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/category.py +2 -2
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/group.py +2 -2
- brilliance_admin-0.43.5/brilliance_admin/static/index-D9axz5zK.js → brilliance_admin-0.43.7/brilliance_admin/static/index-BnnESruI.js +130 -130
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/templates/index.html +1 -1
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin.egg-info/PKG-INFO +18 -15
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin.egg-info/SOURCES.txt +1 -1
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/models.py +4 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/payments.py +0 -3
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/terminal.py +2 -1
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/pyproject.toml +2 -2
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_sqlalcmeny_crud.py +2 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_sqlalcmeny_schema.py +12 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/uv.lock +1 -1
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.configs/docker/Dockerfile +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.configs/docker/docker-compose.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.configs/nginx/example.conf +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.env +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.github/workflows/certbot.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.github/workflows/deploy.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.github/workflows/install-docker.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.gitignore +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.isort.cfg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/.python-version +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/LICENSE +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/routers.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/utils.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/auth.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/autocomplete.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/graphs.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/index.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/schema.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/settings.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/api/views/table.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/auth.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/docs.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/exceptions.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/auth.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/create.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/delete.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/list.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/integrations/sqlalchemy/table/update.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/locales/en.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/locales/ru.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/admin_schema.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/graphs/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/graphs/category_graphs.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/admin_action.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/category_table.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/fields/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/fields/base.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/fields/function_field.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/fields_schema.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/schema/table/table_models.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/index-vlBToOhT.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/img/example.png +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/translations.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin/utils.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin.egg-info/dependency_links.txt +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin.egg-info/requires.txt +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/brilliance_admin.egg-info/top_level.txt +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/README.md +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/locales/en.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/locales/ru.yml +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/main.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/currency.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/graphs.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/merchant.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sections/users.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/sqlite.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/static/favicon.ico +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/static/favicon.jpg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/static/logo-outline.png +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/static/logo.png +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/example/utils.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/screenshots/PC-graphs.jpeg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/screenshots/PC-table.jpeg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/screenshots/iPad-edit.jpeg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/screenshots/iPhone 15-edit.jpeg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/screenshots/iPhone 15-login.jpeg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/screenshots/websitemockupgenerator.png +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/setup.cfg +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/__init__.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/conftest.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_action.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_payments_fields_schema.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_settings.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_sqlalcmeny_auth.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_sqlalcmeny_filters.py +0 -0
- {brilliance_admin-0.43.5 → brilliance_admin-0.43.7}/tests/test_translations.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brilliance-admin
|
|
3
|
-
Version: 0.43.
|
|
4
|
-
Summary: Simple and lightweight admin panel framework powered by FastAPI and Vue3 Vuetify together
|
|
3
|
+
Version: 0.43.7
|
|
4
|
+
Summary: Simple and lightweight admin panel framework powered by FastAPI and Vue3 Vuetify together. Some call it heavenly in its brilliance.
|
|
5
5
|
License-Expression: AGPL-3.0
|
|
6
6
|
Requires-Python: >=3.10
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
@@ -76,9 +76,11 @@ Focused on simplified, but rich configuration.
|
|
|
76
76
|
* **SQLAlchemy** - schema autogeneration for tables + CRUD operations + authorization
|
|
77
77
|
|
|
78
78
|
**Planned:**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
79
|
+
* Dashboard features
|
|
80
|
+
* Role-based access permissions system via interface
|
|
81
|
+
* Backend interface for storing and viewing action history in the admin interface
|
|
82
|
+
* Nested data support for creation and detail views (inline editing), nested CRUD workflows
|
|
83
|
+
* Django ORM integration
|
|
82
84
|
|
|
83
85
|
## How to use it
|
|
84
86
|
|
|
@@ -202,13 +204,14 @@ auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
|
|
|
202
204
|
|
|
203
205
|
## Comparison of Similar Projects
|
|
204
206
|
|
|
205
|
-
| Criterion | Brilliance Admin | Django Admin
|
|
206
|
-
|
|
207
|
-
| Base framework | FastAPI | Django | FastAPI | Starlette / FastAPI |
|
|
208
|
-
| Rendering model | Prebuilt Vue 3 + Vuetify SPA + Jinja2 | Server-side Django templates | Server-side Jinja2 templates + Tabler UI | Server-side Jinja2 templates + Tabler UI |
|
|
209
|
-
| Frontend architecture | Separate frontend (SPA) | Classic server-rendered UI | Server-rendered UI with JS interactivity | Server-rendered UI with JS interactivity |
|
|
210
|
-
| Data source | Any source + SQLAlchemy | Django ORM | Tortoise ORM | Any source + SQLAlchemy, MongoDB |
|
|
211
|
-
| Multiple databases per model | Yes | Database routers | No (global engine) | Yes (session per ModelView) |
|
|
212
|
-
| Schema generation | User-defined format | From Django models | From ORM models | User-defined format |
|
|
213
|
-
| Async support | Yes | No | Yes | Yes |
|
|
214
|
-
| API-first approach | Yes | No | Partially | Partially |
|
|
207
|
+
| Criterion | Brilliance Admin | Django Admin | FastAPI Admin | Starlette Admin | SQLAdmin |
|
|
208
|
+
|---------|------------------|---------------------|---------------|-----------------|----------|
|
|
209
|
+
| Base framework | FastAPI | Django | FastAPI | Starlette / FastAPI | FastAPI / Starlette |
|
|
210
|
+
| Rendering model | Prebuilt Vue 3 + Vuetify SPA + Jinja2 | Server-side Django templates | Server-side Jinja2 templates + Tabler UI | Server-side Jinja2 templates + Tabler UI | Server-side Jinja2 templates + Bootstrap |
|
|
211
|
+
| Frontend architecture | Separate frontend (SPA) | Classic server-rendered UI | Server-rendered UI with JS interactivity | Server-rendered UI with JS interactivity | Server-rendered UI |
|
|
212
|
+
| Data source | Any source + SQLAlchemy | Django ORM | Tortoise ORM | Any source + SQLAlchemy, MongoDB | SQLAlchemy |
|
|
213
|
+
| Multiple databases per model | Yes | Database routers | No (global engine) | Yes (session per ModelView) | No (single engine per Admin) |
|
|
214
|
+
| Schema generation | User-defined format | From Django models | From ORM models | User-defined format | From SQLAlchemy models |
|
|
215
|
+
| Async support | Yes | No | Yes | Yes | Yes |
|
|
216
|
+
| API-first approach | Yes | No | Partially | Partially | No |
|
|
217
|
+
| Built-in Localization | Yes | Yes | No | No | No |
|
|
@@ -45,9 +45,11 @@ Focused on simplified, but rich configuration.
|
|
|
45
45
|
* **SQLAlchemy** - schema autogeneration for tables + CRUD operations + authorization
|
|
46
46
|
|
|
47
47
|
**Planned:**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
48
|
+
* Dashboard features
|
|
49
|
+
* Role-based access permissions system via interface
|
|
50
|
+
* Backend interface for storing and viewing action history in the admin interface
|
|
51
|
+
* Nested data support for creation and detail views (inline editing), nested CRUD workflows
|
|
52
|
+
* Django ORM integration
|
|
51
53
|
|
|
52
54
|
## How to use it
|
|
53
55
|
|
|
@@ -171,13 +173,14 @@ auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
|
|
|
171
173
|
|
|
172
174
|
## Comparison of Similar Projects
|
|
173
175
|
|
|
174
|
-
| Criterion | Brilliance Admin | Django Admin
|
|
175
|
-
|
|
176
|
-
| Base framework | FastAPI | Django | FastAPI | Starlette / FastAPI |
|
|
177
|
-
| Rendering model | Prebuilt Vue 3 + Vuetify SPA + Jinja2 | Server-side Django templates | Server-side Jinja2 templates + Tabler UI | Server-side Jinja2 templates + Tabler UI |
|
|
178
|
-
| Frontend architecture | Separate frontend (SPA) | Classic server-rendered UI | Server-rendered UI with JS interactivity | Server-rendered UI with JS interactivity |
|
|
179
|
-
| Data source | Any source + SQLAlchemy | Django ORM | Tortoise ORM | Any source + SQLAlchemy, MongoDB |
|
|
180
|
-
| Multiple databases per model | Yes | Database routers | No (global engine) | Yes (session per ModelView) |
|
|
181
|
-
| Schema generation | User-defined format | From Django models | From ORM models | User-defined format |
|
|
182
|
-
| Async support | Yes | No | Yes | Yes |
|
|
183
|
-
| API-first approach | Yes | No | Partially | Partially |
|
|
176
|
+
| Criterion | Brilliance Admin | Django Admin | FastAPI Admin | Starlette Admin | SQLAdmin |
|
|
177
|
+
|---------|------------------|---------------------|---------------|-----------------|----------|
|
|
178
|
+
| Base framework | FastAPI | Django | FastAPI | Starlette / FastAPI | FastAPI / Starlette |
|
|
179
|
+
| Rendering model | Prebuilt Vue 3 + Vuetify SPA + Jinja2 | Server-side Django templates | Server-side Jinja2 templates + Tabler UI | Server-side Jinja2 templates + Tabler UI | Server-side Jinja2 templates + Bootstrap |
|
|
180
|
+
| Frontend architecture | Separate frontend (SPA) | Classic server-rendered UI | Server-rendered UI with JS interactivity | Server-rendered UI with JS interactivity | Server-rendered UI |
|
|
181
|
+
| Data source | Any source + SQLAlchemy | Django ORM | Tortoise ORM | Any source + SQLAlchemy, MongoDB | SQLAlchemy |
|
|
182
|
+
| Multiple databases per model | Yes | Database routers | No (global engine) | Yes (session per ModelView) | No (single engine per Admin) |
|
|
183
|
+
| Schema generation | User-defined format | From Django models | From ORM models | User-defined format | From SQLAlchemy models |
|
|
184
|
+
| Async support | Yes | No | Yes | Yes | Yes |
|
|
185
|
+
| API-first approach | Yes | No | Partially | Partially | No |
|
|
186
|
+
| Built-in Localization | Yes | Yes | No | No | No |
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# pylint: disable=wildcard-import, unused-wildcard-import, unused-import
|
|
2
2
|
# flake8: noqa: F405
|
|
3
|
+
from .fields import SQLAlchemyRelatedField
|
|
3
4
|
from .auth import SQLAlchemyJWTAdminAuthentication
|
|
4
5
|
from .autocomplete import SQLAlchemyAdminAutocompleteMixin
|
|
5
6
|
from .fields_schema import SQLAlchemyFieldsSchema
|
|
@@ -32,7 +32,11 @@ class SQLAlchemyAdminAutocompleteMixin:
|
|
|
32
32
|
if not field:
|
|
33
33
|
raise Exception(f'Field "{data.field_slug}" is not found')
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
results = await field.autocomplete(
|
|
36
|
+
self.model,
|
|
37
|
+
data,
|
|
38
|
+
user,
|
|
39
|
+
extra={'db_async_session': self.db_async_session},
|
|
40
|
+
)
|
|
37
41
|
|
|
38
42
|
return AutocompleteResult(results=results)
|
|
@@ -43,7 +43,7 @@ class SQLAlchemyRelatedField(TableField):
|
|
|
43
43
|
# - для доступа к связи через ORM
|
|
44
44
|
# getattr(record, rel_name)
|
|
45
45
|
# - для записи и чтения связанных объектов
|
|
46
|
-
rel_name: str | None
|
|
46
|
+
rel_name: str | None
|
|
47
47
|
|
|
48
48
|
# Класс связанной SQLAlchemy-модели.
|
|
49
49
|
# Откуда берётся:
|
|
@@ -101,11 +101,11 @@ class SQLAlchemyRelatedField(TableField):
|
|
|
101
101
|
from sqlalchemy import select
|
|
102
102
|
from sqlalchemy.sql import expression
|
|
103
103
|
|
|
104
|
-
if extra is None or extra.get('
|
|
105
|
-
msg = f'SQLAlchemyRelatedField.autocomplete {type(self).__name__} requires extra["
|
|
104
|
+
if extra is None or extra.get('db_async_session') is None:
|
|
105
|
+
msg = f'SQLAlchemyRelatedField.autocomplete {type(self).__name__} requires extra["db_async_session"] (AsyncSession)'
|
|
106
106
|
raise AttributeError(msg)
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
db_async_session = extra['db_async_session']
|
|
109
109
|
|
|
110
110
|
results = []
|
|
111
111
|
|
|
@@ -125,7 +125,9 @@ class SQLAlchemyRelatedField(TableField):
|
|
|
125
125
|
if existed_choices and hasattr(target_model, 'id'):
|
|
126
126
|
stmt = stmt.where(getattr(target_model, 'id').in_(existed_choices) | expression.true())
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
async with db_async_session() as session:
|
|
129
|
+
records = (await session.execute(stmt)).scalars().all()
|
|
130
|
+
|
|
129
131
|
for record in records:
|
|
130
132
|
results.append(Record(key=getattr(record, 'id'), title=str(record)))
|
|
131
133
|
|
|
@@ -146,18 +148,15 @@ class SQLAlchemyRelatedField(TableField):
|
|
|
146
148
|
if record is None:
|
|
147
149
|
raise FieldError(f'Missing record in serialize context in value: {value}')
|
|
148
150
|
|
|
151
|
+
related = getattr(record, self.rel_name, None)
|
|
152
|
+
|
|
149
153
|
if self.many:
|
|
150
|
-
related = getattr(record, self.rel_name, None)
|
|
151
154
|
if related is None:
|
|
152
|
-
|
|
153
|
-
raise FieldError(msg)
|
|
154
|
-
|
|
155
|
+
raise FieldError(f'Many Related field "{self.rel_name}" is missing on record "{record}"')
|
|
155
156
|
return [{'key': get_pk(obj), 'title': str(obj)} for obj in related]
|
|
156
157
|
|
|
157
|
-
related = getattr(record, self.rel_name, None)
|
|
158
158
|
if related is None:
|
|
159
|
-
|
|
160
|
-
raise FieldError(msg)
|
|
159
|
+
return None
|
|
161
160
|
|
|
162
161
|
return {'key': get_pk(related), 'title': str(related)}
|
|
163
162
|
|
|
@@ -7,7 +7,7 @@ from pydantic_core import core_schema
|
|
|
7
7
|
|
|
8
8
|
from brilliance_admin.auth import UserABC
|
|
9
9
|
from brilliance_admin.translations import LanguageContext
|
|
10
|
-
from brilliance_admin.utils import DataclassBase, SupportsStr
|
|
10
|
+
from brilliance_admin.utils import DataclassBase, SupportsStr, humanize_field_name
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
# pylint: disable=too-many-instance-attributes
|
|
@@ -125,7 +125,7 @@ class Category(abc.ABC):
|
|
|
125
125
|
|
|
126
126
|
def generate_schema(self, user: UserABC, language_context: LanguageContext) -> CategorySchemaData:
|
|
127
127
|
return CategorySchemaData(
|
|
128
|
-
title=language_context.get_text(self.title) or self.slug,
|
|
128
|
+
title=language_context.get_text(self.title) or humanize_field_name(self.slug),
|
|
129
129
|
description=language_context.get_text(self.description),
|
|
130
130
|
icon=self.icon,
|
|
131
131
|
type=self._type_slug,
|
|
@@ -6,7 +6,7 @@ from pydantic.dataclasses import dataclass
|
|
|
6
6
|
from brilliance_admin.auth import UserABC
|
|
7
7
|
from brilliance_admin.schema.category import Category, CategorySchemaData
|
|
8
8
|
from brilliance_admin.translations import LanguageContext
|
|
9
|
-
from brilliance_admin.utils import DataclassBase, SupportsStr, get_logger
|
|
9
|
+
from brilliance_admin.utils import DataclassBase, SupportsStr, get_logger, humanize_field_name
|
|
10
10
|
|
|
11
11
|
logger = get_logger()
|
|
12
12
|
|
|
@@ -36,7 +36,7 @@ class Group(abc.ABC):
|
|
|
36
36
|
|
|
37
37
|
def generate_schema(self, user: UserABC, language_context: LanguageContext) -> GroupSchemaData:
|
|
38
38
|
result = GroupSchemaData(
|
|
39
|
-
title=language_context.get_text(self.title) or self.slug,
|
|
39
|
+
title=language_context.get_text(self.title) or humanize_field_name(self.slug),
|
|
40
40
|
description=language_context.get_text(self.description),
|
|
41
41
|
icon=self.icon,
|
|
42
42
|
categories={},
|