brilliance-admin 0.43.7__tar.gz → 0.44.1__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 (126) hide show
  1. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.configs/docker/docker-compose.yml +19 -14
  2. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.github/workflows/certbot.yml +12 -3
  3. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.gitignore +1 -0
  4. brilliance_admin-0.44.1/LICENSE +21 -0
  5. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/PKG-INFO +48 -108
  6. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/README.md +43 -105
  7. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/table.py +2 -1
  8. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/locales/en.yml +4 -2
  9. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/locales/ru.yml +1 -0
  10. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/__init__.py +2 -2
  11. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/admin_schema.py +21 -19
  12. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/category.py +85 -10
  13. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/graphs/category_graphs.py +2 -3
  14. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/category_table.py +4 -2
  15. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/fields/base.py +21 -6
  16. brilliance_admin-0.43.7/brilliance_admin/static/index-vlBToOhT.css → brilliance_admin-0.44.1/brilliance_admin/static/index-P_wdMBbz.css +1 -1
  17. brilliance_admin-0.43.7/brilliance_admin/static/index-BnnESruI.js → brilliance_admin-0.44.1/brilliance_admin/static/index-rBvEkjGg.js +57 -57
  18. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/templates/index.html +2 -2
  19. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/utils.py +38 -0
  20. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin.egg-info/PKG-INFO +48 -108
  21. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin.egg-info/SOURCES.txt +2 -4
  22. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin.egg-info/requires.txt +2 -0
  23. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/locales/en.yml +1 -1
  24. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/locales/ru.yml +1 -0
  25. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/main.py +23 -12
  26. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/merchant.py +2 -0
  27. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/models.py +19 -1
  28. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sqlite.py +7 -1
  29. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/pyproject.toml +5 -3
  30. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_action.py +1 -1
  31. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_payments_fields_schema.py +2 -0
  32. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_settings.py +1 -1
  33. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_sqlalcmeny_auth.py +2 -2
  34. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_sqlalcmeny_crud.py +3 -0
  35. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_sqlalcmeny_schema.py +12 -1
  36. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/uv.lock +549 -444
  37. brilliance_admin-0.43.7/.env +0 -0
  38. brilliance_admin-0.43.7/LICENSE +0 -17
  39. brilliance_admin-0.43.7/brilliance_admin/schema/group.py +0 -67
  40. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.configs/docker/Dockerfile +0 -0
  41. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.configs/nginx/example.conf +0 -0
  42. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.github/workflows/deploy.yml +0 -0
  43. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.github/workflows/install-docker.yml +0 -0
  44. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.isort.cfg +0 -0
  45. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/.python-version +0 -0
  46. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/__init__.py +0 -0
  47. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/__init__.py +0 -0
  48. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/routers.py +0 -0
  49. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/utils.py +0 -0
  50. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/__init__.py +0 -0
  51. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/auth.py +0 -0
  52. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/autocomplete.py +0 -0
  53. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/graphs.py +0 -0
  54. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/index.py +0 -0
  55. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/schema.py +0 -0
  56. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/api/views/settings.py +0 -0
  57. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/auth.py +0 -0
  58. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/docs.py +0 -0
  59. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/exceptions.py +0 -0
  60. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/__init__.py +0 -0
  61. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/__init__.py +0 -0
  62. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/auth.py +0 -0
  63. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +0 -0
  64. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/fields.py +0 -0
  65. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
  66. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
  67. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
  68. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/create.py +0 -0
  69. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/delete.py +0 -0
  70. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/list.py +0 -0
  71. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +0 -0
  72. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/integrations/sqlalchemy/table/update.py +0 -0
  73. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/graphs/__init__.py +0 -0
  74. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/__init__.py +0 -0
  75. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/admin_action.py +0 -0
  76. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/fields/__init__.py +0 -0
  77. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/fields/function_field.py +0 -0
  78. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/fields_schema.py +0 -0
  79. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/schema/table/table_models.py +0 -0
  80. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
  81. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
  82. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
  83. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
  84. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
  85. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
  86. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
  87. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
  88. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/img/example.png +0 -0
  89. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
  90. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
  91. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
  92. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
  93. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
  94. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
  95. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
  96. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
  97. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
  98. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
  99. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
  100. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin/translations.py +0 -0
  101. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin.egg-info/dependency_links.txt +0 -0
  102. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/brilliance_admin.egg-info/top_level.txt +0 -0
  103. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/README.md +0 -0
  104. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/__init__.py +0 -0
  105. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/__init__.py +0 -0
  106. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/currency.py +0 -0
  107. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/graphs.py +0 -0
  108. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/payments.py +0 -0
  109. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/terminal.py +0 -0
  110. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/sections/users.py +0 -0
  111. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/static/favicon.ico +0 -0
  112. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/static/favicon.jpg +0 -0
  113. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/static/logo-outline.png +0 -0
  114. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/static/logo.png +0 -0
  115. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/example/utils.py +0 -0
  116. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/screenshots/PC-graphs.jpeg +0 -0
  117. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/screenshots/PC-table.jpeg +0 -0
  118. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/screenshots/iPad-edit.jpeg +0 -0
  119. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/screenshots/iPhone 15-edit.jpeg +0 -0
  120. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/screenshots/iPhone 15-login.jpeg +0 -0
  121. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/screenshots/websitemockupgenerator.png +0 -0
  122. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/setup.cfg +0 -0
  123. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/__init__.py +0 -0
  124. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/conftest.py +0 -0
  125. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_sqlalcmeny_filters.py +0 -0
  126. {brilliance_admin-0.43.7 → brilliance_admin-0.44.1}/tests/test_translations.py +0 -0
@@ -1,8 +1,5 @@
1
1
  name: brilliance
2
2
 
3
- volumes:
4
- db_data:
5
-
6
3
  services:
7
4
  backend:
8
5
  build:
@@ -12,24 +9,32 @@ services:
12
9
  - ./../../:/app
13
10
  - ~/.ssh/id_rsa:/root/.ssh/id_rsa:delegated
14
11
  - ~/.ssh/known_hosts:/root/.ssh/known_hosts:delegated
15
- env_file:
16
- - ./../../.env
12
+ environment:
13
+ POSTGRES_DB: brilliance
14
+ POSTGRES_USER: brilliance
15
+ POSTGRES_PASSWORD: brilliance
16
+ POSTGRES_HOST: postgres
17
17
  tmpfs:
18
18
  - /tmp
19
19
  ports:
20
20
  - 8082:8082
21
21
  command: uv run uvicorn example.main:app --host 0.0.0.0 --port 8082 --reload --proxy-headers --forwarded-allow-ips='*'
22
- healthcheck:
23
- test: ['CMD', 'curl', '-f', 'http://127.0.0.1:8082']
24
- interval: 5s
25
- timeout: 2s
26
- retries: 5
22
+ depends_on:
23
+ postgres:
24
+ condition: service_healthy
27
25
 
28
26
  postgres:
29
27
  image: postgres:alpine
30
- env_file:
31
- - ./../../.env
32
- volumes:
33
- - db_data:/var/lib/postgresql/data
28
+ environment:
29
+ POSTGRES_DB: brilliance
30
+ POSTGRES_USER: brilliance
31
+ POSTGRES_PASSWORD: brilliance
32
+ tmpfs:
33
+ - /var/lib/postgresql/data
34
34
  ports:
35
35
  - 5432:5432
36
+ healthcheck:
37
+ test: ['CMD', 'pg_isready', '-h', 'localhost', '-p', '5432', '-U', 'brilliance']
38
+ interval: 2s
39
+ timeout: 2s
40
+ retries: 10
@@ -7,20 +7,29 @@ jobs:
7
7
  setup-https:
8
8
  runs-on: ubuntu-latest
9
9
  steps:
10
- - name: Setup HTTPS with certbot
10
+ - name: Setup HTTPS with certbot (snap)
11
11
  uses: appleboy/ssh-action@master
12
12
  with:
13
13
  host: ${{ vars.SERVER_HOST }}
14
14
  username: deploy
15
15
  key: ${{ secrets.SERVER_SSH_KEY }}
16
16
  script: |
17
- if ! command -v certbot >/dev/null 2>&1; then
17
+ sudo apt remove -y certbot python3-certbot-nginx || true
18
+
19
+ if ! command -v snap >/dev/null 2>&1; then
18
20
  sudo apt update
19
- sudo apt install -y certbot python3-certbot-nginx
21
+ sudo apt install -y snapd
20
22
  fi
23
+
24
+ sudo snap install core || sudo snap refresh core
25
+ sudo snap install --classic certbot || true
26
+ sudo ln -sf /snap/bin/certbot /usr/bin/certbot
27
+
21
28
  sudo certbot --nginx \
22
29
  -d brilliance-admin.com \
23
30
  -d www.brilliance-admin.com \
31
+ -d docs.brilliance-admin.com \
32
+ --expand \
24
33
  --non-interactive \
25
34
  --agree-tos \
26
35
  -m admin@brilliance-admin.com \
@@ -1,4 +1,5 @@
1
1
  # Python-generated files
2
+ .env
2
3
  test.db
3
4
  __pycache__/
4
5
  *.py[oc]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brilliance Admin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brilliance-admin
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
- License-Expression: AGPL-3.0
3
+ Version: 0.44.1
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
+ License-Expression: MIT
6
6
  Requires-Python: >=3.10
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
@@ -16,6 +16,8 @@ Requires-Dist: faker>=38.2.0; extra == "example"
16
16
  Requires-Dist: pyjwt>=2.10.1; extra == "example"
17
17
  Requires-Dist: structlog>=25.5.0; extra == "example"
18
18
  Requires-Dist: rich>=14.2.0; extra == "example"
19
+ Requires-Dist: asyncpg>=0.31.0; extra == "example"
20
+ Requires-Dist: pydantic-settings>=2.12.0; extra == "example"
19
21
  Provides-Extra: tests
20
22
  Requires-Dist: pytest>=8.4.2; extra == "tests"
21
23
  Requires-Dist: pytest-asyncio>=1.2.0; extra == "tests"
@@ -37,58 +39,69 @@ Dynamic: license-file
37
39
  [![PyPI](https://img.shields.io/pypi/v/brilliance-admin)](https://pypi.org/project/brilliance-admin/)
38
40
  [![CI](https://github.com/brilliance-admin/backend-python/actions/workflows/deploy.yml/badge.svg)](https://github.com/brilliance-admin/backend-python/actions)
39
41
 
40
- Simple and lightweight admin panel framework powered by `FastAPI` and `Vue3` `Vuetify` together. \
42
+ Simple and lightweight data managment framework powered by `FastAPI` and `Vue3` `Vuetify` all-in-one. \
41
43
  Integrated with `SQLAlchemy`. Inspaired by Django Admin and DRF.\
42
44
  _Some call it heavenly in its brilliance._
43
45
 
44
- ### [Live Demo](https://brilliance-admin.com/) | [Demo Sources](https://github.com/brilliance-admin/backend-python/tree/main/example) | Documentation (todo)
46
+ ### [Live Demo](https://brilliance-admin.com/) | [Demo Sources](https://github.com/brilliance-admin/backend-python/tree/main/example) | [Documentation](https://docs.brilliance-admin.com/)
45
47
 
46
48
  <img src="https://github.com/brilliance-admin/backend-python/blob/main/screenshots/websitemockupgenerator.png?raw=true"
47
49
  alt="Preview">
48
50
 
49
51
  </div>
50
52
 
51
- **Key ideas:**
52
- - **API oriented**\
53
- Works entirely on FastAPI and provides a prebuilt SPA [frontend](https://github.com/brilliance-admin/frontend) via static files (Vue3 + Vuetify). No separate startup is required.
54
- > Data generation/updating API separated from rendering fontend with zero hardcode, this makes it possible to have a single frontend with multiple backend implementations in different languages and makes test coverage easier.
55
- - **Rich visualization**\
53
+ ### Brilliance Admin provides
54
+
55
+ A quick way to create a data management interface using:
56
+
57
+ - Admin page - endpoint with a prebuilt SPA [frontend Vue3 + Vuetify](https://github.com/brilliance-admin/frontend) <br>
58
+ This endpoint can be added to any ASGI compatable backend. For existing project or standalone admin app.
59
+ - API to fetch the UI JSON schema
60
+ - API methods for that UI to work with (to read and modify data)
61
+
62
+ ## Key ideas
63
+
64
+ - **API Oriented** <br>
65
+ Data generation/updating API separated from rendering fontend with zero hardcode, this makes it possible to have a single frontend with multiple backend implementations in different languages and makes test coverage easier.
66
+ - **Rich visualization** <br>
56
67
  Providing rich and convenient ways to display and manage data (tables, charts, etc) from any data source.
57
- - **ORM**\
58
- Automatic schema generation and methods for CRUD operations.
59
- - **Minimal boilerplate**\
68
+ - **UI JSON Schema** <br>
69
+ Represents the data describing the structure of entire admin panel UI. <br>
70
+ You only need to specify what should be rendered. The frontend will display it and automatically request data from the backend for rendering or updates.
71
+ - **ORM** <br>
72
+ Automatic generation from ORM for schema UI frontend and backend methods for CRUD operations.
73
+ - **Minimal boilerplate** <br>
60
74
  Focused on simplified, but rich configuration.
61
75
 
62
- **How it works:**
63
- - After authentication, the user receives the admin panel schema, and the frontend renders it
64
- - The frontend communicates with the backend via API to fetch and modify data
65
-
66
- ### Features:
76
+ ## Features
67
77
 
68
78
  * Tables with full CRUD support, including filtering, sorting, and pagination.
69
79
  * Ability to define custom table actions with forms, response messages, and file downloads.
70
80
  * Graphs via ChartJS
71
81
  * Localization support
72
82
  * Adapted for different screen sizes and mobile devices
73
- * Authorization via any account data source
83
+ * Auth via any account data source
74
84
 
75
85
  **Integrations:**
86
+
76
87
  * **SQLAlchemy** - schema autogeneration for tables + CRUD operations + authorization
77
88
 
78
89
  **Planned:**
90
+
79
91
  * Dashboard features
80
92
  * Role-based access permissions system via interface
81
93
  * Backend interface for storing and viewing action history in the admin interface
82
94
  * Nested data support for creation and detail views (inline editing), nested CRUD workflows
83
95
  * Django ORM integration
96
+ * Support for Oauth providers
84
97
 
85
- ## How to use it
86
-
87
- Installation:
98
+ ## Installation:
88
99
  ``` shell
89
100
  pip install brilliance-admin
90
101
  ```
91
102
 
103
+ ## Usage example
104
+
92
105
  You need to generate `AdminSchema` instance:
93
106
  ``` python
94
107
  from brilliance_admin import schema
@@ -101,11 +114,9 @@ class CategoryExample(schema.CategoryTable):
101
114
  admin_schema = schema.AdminSchema(
102
115
  title='Admin Panel',
103
116
  auth=YourAdminAuthentication(),
104
- groups=[
105
- schema.Group(
117
+ categories=[
118
+ schema.Category(
106
119
  slug='example',
107
- title='Example',
108
- icon='mdi-star',
109
120
  categories=[
110
121
  CategoryExample(),
111
122
  ]
@@ -115,98 +126,27 @@ admin_schema = schema.AdminSchema(
115
126
 
116
127
  admin_app = admin_schema.generate_app()
117
128
 
118
- # Your FastAPI app
129
+ # Your FastAPI app (Any ASGI framework can be used)
119
130
  app = FastAPI()
120
131
  app.mount('/admin', admin_app)
121
132
  ```
122
133
 
123
- ## SQLAlchemy integration
124
-
125
- Supports automatic schema generation for CRUD tables:
126
-
127
- ``` python
128
- category = sqlalchemy.SQLAlchemyAdmin(db_async_session=async_sessionmaker, model=Terminal)
129
- ```
130
-
131
- > [!NOTE]
132
- > If `table_schema` is not specified, it will be generated automatically with all discovered fields and relationships
133
-
134
- Now, the `category` instance can be passed to `categories`.
135
-
136
- ### DRF class style schema
137
-
138
- ``` python
139
- from brilliance_admin import sqlalchemy
140
- from brilliance_admin.translations import TranslateText as _
141
-
142
- from your_project.models import Terminal
143
-
144
-
145
- class TerminalFiltersSchema(sqlalchemy.SQLAlchemyFieldsSchema):
146
- model = Terminal
147
- fields = ['id', 'created_at']
148
- created_at = schema.DateTimeField(range=True)
149
-
150
-
151
- class TerminalSchema(sqlalchemy.SQLAlchemyFieldsSchema):
152
- model = Terminal
153
- list_display = ['id', 'merchant_id']
154
-
155
-
156
- class TerminalAdmin(sqlalchemy.SQLAlchemyAdmin):
157
- db_async_session = async_sessionmaker
158
- model = Terminal
159
- title = _('terminals')
160
- icon = 'mdi-console-network-outline'
161
-
162
- ordering_fields = ['id']
163
- search_fields = ['id', 'title']
164
-
165
- table_schema = TerminalSchema()
166
- table_filters = TerminalFiltersSchema()
167
-
168
-
169
- category = TerminalAdmin()
170
- ```
171
-
172
- ### Can be used both via inheritance and instancing
134
+ For more details, check out our [how-to-start documentation](https://docs.brilliance-admin.com/how-to-start/)
173
135
 
174
- Optionally, functional-style generation can be used to reduce boilerplate code
175
-
176
- Availiable for `SQLAlchemyAdmin` and `SQLAlchemyFieldsSchema`
177
-
178
- ``` python
179
- category = sqlalchemy.SQLAlchemyAdmin(
180
- db_async_session=async_sessionmaker,
181
- model=Terminal,
182
-
183
- table_schema = sqlalchemy.SQLAlchemyFieldsSchema(
184
- model=Terminal,
185
- list_display=['id', 'merchant_id'],
186
- ),
187
- table_filters = sqlalchemy.SQLAlchemyFieldsSchema(
188
- model=Terminal,
189
- fields=['id', 'created_at'],
190
- created_at=schema.DateTimeField(range=True),
191
- ),
192
- )
193
- ```
136
+ ## Comparison of Similar Projects
194
137
 
195
- ### SQLAlchemy JWT Authentication
138
+ The project closest in concept is [React Admin](https://github.com/marmelab/react-admin). <br>
139
+ It is an SPA frontend that store the schema UI inside and works with separate API backend providers.
196
140
 
197
- ``` python
198
- auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
199
- secret='auth_secret',
200
- db_async_session=async_session,
201
- user_model=User,
202
- )
203
- ```
141
+ The key difference of Brilliance Admin is that its all-in-one. <br>
142
+ It is more focused on rapid setup for data management, without the need to work with frontend configuration, while it still available.
204
143
 
205
- ## Comparison of Similar Projects
144
+ ## Comparison of Similar Python Projects
206
145
 
207
146
  | Criterion | Brilliance Admin | Django Admin | FastAPI Admin | Starlette Admin | SQLAdmin |
208
- |---------|------------------|---------------------|---------------|-----------------|----------|
209
- | Base framework | FastAPI | Django | FastAPI | Starlette / FastAPI | FastAPI / Starlette |
147
+ |---------|------------------|--------------|---------------|-----------------|----------|
148
+ | Base framework | FastAPI | Django | FastAPI | Starlette | FastAPI |
149
+ | ASGI compatible | Yes | Partial | Yes | Yes | Yes |
210
150
  | 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
151
  | 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
152
  | Data source | Any source + SQLAlchemy | Django ORM | Tortoise ORM | Any source + SQLAlchemy, MongoDB | SQLAlchemy |
@@ -6,58 +6,69 @@
6
6
  [![PyPI](https://img.shields.io/pypi/v/brilliance-admin)](https://pypi.org/project/brilliance-admin/)
7
7
  [![CI](https://github.com/brilliance-admin/backend-python/actions/workflows/deploy.yml/badge.svg)](https://github.com/brilliance-admin/backend-python/actions)
8
8
 
9
- Simple and lightweight admin panel framework powered by `FastAPI` and `Vue3` `Vuetify` together. \
9
+ Simple and lightweight data managment framework powered by `FastAPI` and `Vue3` `Vuetify` all-in-one. \
10
10
  Integrated with `SQLAlchemy`. Inspaired by Django Admin and DRF.\
11
11
  _Some call it heavenly in its brilliance._
12
12
 
13
- ### [Live Demo](https://brilliance-admin.com/) | [Demo Sources](https://github.com/brilliance-admin/backend-python/tree/main/example) | Documentation (todo)
13
+ ### [Live Demo](https://brilliance-admin.com/) | [Demo Sources](https://github.com/brilliance-admin/backend-python/tree/main/example) | [Documentation](https://docs.brilliance-admin.com/)
14
14
 
15
15
  <img src="https://github.com/brilliance-admin/backend-python/blob/main/screenshots/websitemockupgenerator.png?raw=true"
16
16
  alt="Preview">
17
17
 
18
18
  </div>
19
19
 
20
- **Key ideas:**
21
- - **API oriented**\
22
- Works entirely on FastAPI and provides a prebuilt SPA [frontend](https://github.com/brilliance-admin/frontend) via static files (Vue3 + Vuetify). No separate startup is required.
23
- > Data generation/updating API separated from rendering fontend with zero hardcode, this makes it possible to have a single frontend with multiple backend implementations in different languages and makes test coverage easier.
24
- - **Rich visualization**\
20
+ ### Brilliance Admin provides
21
+
22
+ A quick way to create a data management interface using:
23
+
24
+ - Admin page - endpoint with a prebuilt SPA [frontend Vue3 + Vuetify](https://github.com/brilliance-admin/frontend) <br>
25
+ This endpoint can be added to any ASGI compatable backend. For existing project or standalone admin app.
26
+ - API to fetch the UI JSON schema
27
+ - API methods for that UI to work with (to read and modify data)
28
+
29
+ ## Key ideas
30
+
31
+ - **API Oriented** <br>
32
+ Data generation/updating API separated from rendering fontend with zero hardcode, this makes it possible to have a single frontend with multiple backend implementations in different languages and makes test coverage easier.
33
+ - **Rich visualization** <br>
25
34
  Providing rich and convenient ways to display and manage data (tables, charts, etc) from any data source.
26
- - **ORM**\
27
- Automatic schema generation and methods for CRUD operations.
28
- - **Minimal boilerplate**\
35
+ - **UI JSON Schema** <br>
36
+ Represents the data describing the structure of entire admin panel UI. <br>
37
+ You only need to specify what should be rendered. The frontend will display it and automatically request data from the backend for rendering or updates.
38
+ - **ORM** <br>
39
+ Automatic generation from ORM for schema UI frontend and backend methods for CRUD operations.
40
+ - **Minimal boilerplate** <br>
29
41
  Focused on simplified, but rich configuration.
30
42
 
31
- **How it works:**
32
- - After authentication, the user receives the admin panel schema, and the frontend renders it
33
- - The frontend communicates with the backend via API to fetch and modify data
34
-
35
- ### Features:
43
+ ## Features
36
44
 
37
45
  * Tables with full CRUD support, including filtering, sorting, and pagination.
38
46
  * Ability to define custom table actions with forms, response messages, and file downloads.
39
47
  * Graphs via ChartJS
40
48
  * Localization support
41
49
  * Adapted for different screen sizes and mobile devices
42
- * Authorization via any account data source
50
+ * Auth via any account data source
43
51
 
44
52
  **Integrations:**
53
+
45
54
  * **SQLAlchemy** - schema autogeneration for tables + CRUD operations + authorization
46
55
 
47
56
  **Planned:**
57
+
48
58
  * Dashboard features
49
59
  * Role-based access permissions system via interface
50
60
  * Backend interface for storing and viewing action history in the admin interface
51
61
  * Nested data support for creation and detail views (inline editing), nested CRUD workflows
52
62
  * Django ORM integration
63
+ * Support for Oauth providers
53
64
 
54
- ## How to use it
55
-
56
- Installation:
65
+ ## Installation:
57
66
  ``` shell
58
67
  pip install brilliance-admin
59
68
  ```
60
69
 
70
+ ## Usage example
71
+
61
72
  You need to generate `AdminSchema` instance:
62
73
  ``` python
63
74
  from brilliance_admin import schema
@@ -70,11 +81,9 @@ class CategoryExample(schema.CategoryTable):
70
81
  admin_schema = schema.AdminSchema(
71
82
  title='Admin Panel',
72
83
  auth=YourAdminAuthentication(),
73
- groups=[
74
- schema.Group(
84
+ categories=[
85
+ schema.Category(
75
86
  slug='example',
76
- title='Example',
77
- icon='mdi-star',
78
87
  categories=[
79
88
  CategoryExample(),
80
89
  ]
@@ -84,98 +93,27 @@ admin_schema = schema.AdminSchema(
84
93
 
85
94
  admin_app = admin_schema.generate_app()
86
95
 
87
- # Your FastAPI app
96
+ # Your FastAPI app (Any ASGI framework can be used)
88
97
  app = FastAPI()
89
98
  app.mount('/admin', admin_app)
90
99
  ```
91
100
 
92
- ## SQLAlchemy integration
93
-
94
- Supports automatic schema generation for CRUD tables:
95
-
96
- ``` python
97
- category = sqlalchemy.SQLAlchemyAdmin(db_async_session=async_sessionmaker, model=Terminal)
98
- ```
99
-
100
- > [!NOTE]
101
- > If `table_schema` is not specified, it will be generated automatically with all discovered fields and relationships
102
-
103
- Now, the `category` instance can be passed to `categories`.
104
-
105
- ### DRF class style schema
106
-
107
- ``` python
108
- from brilliance_admin import sqlalchemy
109
- from brilliance_admin.translations import TranslateText as _
110
-
111
- from your_project.models import Terminal
112
-
113
-
114
- class TerminalFiltersSchema(sqlalchemy.SQLAlchemyFieldsSchema):
115
- model = Terminal
116
- fields = ['id', 'created_at']
117
- created_at = schema.DateTimeField(range=True)
118
-
119
-
120
- class TerminalSchema(sqlalchemy.SQLAlchemyFieldsSchema):
121
- model = Terminal
122
- list_display = ['id', 'merchant_id']
123
-
124
-
125
- class TerminalAdmin(sqlalchemy.SQLAlchemyAdmin):
126
- db_async_session = async_sessionmaker
127
- model = Terminal
128
- title = _('terminals')
129
- icon = 'mdi-console-network-outline'
130
-
131
- ordering_fields = ['id']
132
- search_fields = ['id', 'title']
133
-
134
- table_schema = TerminalSchema()
135
- table_filters = TerminalFiltersSchema()
136
-
137
-
138
- category = TerminalAdmin()
139
- ```
140
-
141
- ### Can be used both via inheritance and instancing
101
+ For more details, check out our [how-to-start documentation](https://docs.brilliance-admin.com/how-to-start/)
142
102
 
143
- Optionally, functional-style generation can be used to reduce boilerplate code
144
-
145
- Availiable for `SQLAlchemyAdmin` and `SQLAlchemyFieldsSchema`
146
-
147
- ``` python
148
- category = sqlalchemy.SQLAlchemyAdmin(
149
- db_async_session=async_sessionmaker,
150
- model=Terminal,
151
-
152
- table_schema = sqlalchemy.SQLAlchemyFieldsSchema(
153
- model=Terminal,
154
- list_display=['id', 'merchant_id'],
155
- ),
156
- table_filters = sqlalchemy.SQLAlchemyFieldsSchema(
157
- model=Terminal,
158
- fields=['id', 'created_at'],
159
- created_at=schema.DateTimeField(range=True),
160
- ),
161
- )
162
- ```
103
+ ## Comparison of Similar Projects
163
104
 
164
- ### SQLAlchemy JWT Authentication
105
+ The project closest in concept is [React Admin](https://github.com/marmelab/react-admin). <br>
106
+ It is an SPA frontend that store the schema UI inside and works with separate API backend providers.
165
107
 
166
- ``` python
167
- auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
168
- secret='auth_secret',
169
- db_async_session=async_session,
170
- user_model=User,
171
- )
172
- ```
108
+ The key difference of Brilliance Admin is that its all-in-one. <br>
109
+ It is more focused on rapid setup for data management, without the need to work with frontend configuration, while it still available.
173
110
 
174
- ## Comparison of Similar Projects
111
+ ## Comparison of Similar Python Projects
175
112
 
176
113
  | Criterion | Brilliance Admin | Django Admin | FastAPI Admin | Starlette Admin | SQLAdmin |
177
- |---------|------------------|---------------------|---------------|-----------------|----------|
178
- | Base framework | FastAPI | Django | FastAPI | Starlette / FastAPI | FastAPI / Starlette |
114
+ |---------|------------------|--------------|---------------|-----------------|----------|
115
+ | Base framework | FastAPI | Django | FastAPI | Starlette | FastAPI |
116
+ | ASGI compatible | Yes | Partial | Yes | Yes | Yes |
179
117
  | 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
118
  | 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
119
  | Data source | Any source + SQLAlchemy | Django ORM | Tortoise ORM | Any source + SQLAlchemy, MongoDB | SQLAlchemy |
@@ -8,7 +8,8 @@ from brilliance_admin.exceptions import AdminAPIException, APIError
8
8
  from brilliance_admin.schema import AdminSchema
9
9
  from brilliance_admin.schema.table.admin_action import ActionData, ActionResult
10
10
  from brilliance_admin.schema.table.category_table import CategoryTable
11
- from brilliance_admin.schema.table.table_models import CreateResult, ListData, RetrieveResult, TableListResult, UpdateResult
11
+ from brilliance_admin.schema.table.table_models import (
12
+ CreateResult, ListData, RetrieveResult, TableListResult, UpdateResult)
12
13
  from brilliance_admin.translations import LanguageContext
13
14
  from brilliance_admin.utils import get_logger
14
15
 
@@ -3,16 +3,18 @@ delete_confirmation_text: "Are you sure you want to delete those records?\nThis
3
3
  deleted_successfully: 'The entries were successfully deleted.'
4
4
 
5
5
  errors:
6
+ pk_not_found: 'The "%(pk_name)s" field was not found in the submitted data.'
7
+ record_not_found: 'No record found for %(pk_name)s=%(pk)s.'
6
8
  db_error_create: 'Error creating a record in the database.'
7
9
  db_error_update: 'Error updating the record in the database.'
8
10
  db_error_retrieve: 'Error retrieving the record from the database.'
9
11
  db_error_list: 'Failed to retrieve table data from the database.'
10
- pk_not_found: 'The "%(pk_name)s" field was not found in the submitted data.'
11
- record_not_found: 'No record found for %(pk_name)s=%(pk)s.'
12
12
  connection_refused_error: 'Database connection error: %(error)s'
13
13
  filters_exception: 'An unknown technical error occurred while filtering data.'
14
14
  method_not_allowed: 'Error, method not allowed. This action is not permitted.'
15
15
  filter_error: 'An error occurred during filtering: {error}'
16
+ serialize_field_error: 'Serialize error: %(error)s'
17
+ bad_type_error: 'Invalid data type: %(type)s but %(expected)s expected'
16
18
 
17
19
  search_help: 'Available search fields: %(fields)s'
18
20
  sqlalchemy_search_help: |
@@ -14,6 +14,7 @@ errors:
14
14
  method_not_allowed: 'Ошибка, данный метод недоступен.'
15
15
  filter_error: 'Проишла ошибка при фильтрации: %(error)s'
16
16
  serialize_field_error: 'Ошибка чтения данных: %(error)s'
17
+ bad_type_error: 'Некорректный тип данных: %(type)s; ожидается %(expected)s'
17
18
 
18
19
  search_help: 'Доступные поля для поиска: %(fields)s'
19
20
  sqlalchemy_search_help: |
@@ -1,7 +1,7 @@
1
1
  # pylint: disable=wildcard-import, unused-wildcard-import, unused-import
2
2
  # flake8: noqa: F405
3
3
  from .admin_schema import AdminSchema, AdminSchemaData
4
- from .category import Category
4
+ from .category import CategoryGroup, CategoryLink
5
5
  from .graphs import *
6
- from .group import Group
7
6
  from .table import *
7
+ from .table.category_table import CategoryTable