brilliance-admin 0.44.7__tar.gz → 0.44.9__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.44.7 → brilliance_admin-0.44.9}/PKG-INFO +9 -2
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/README.md +8 -1
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +1 -1
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/update.py +3 -1
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/base.py +44 -5
- brilliance_admin-0.44.7/brilliance_admin/static/index-BV43pxcV.js → brilliance_admin-0.44.9/brilliance_admin/static/index-DToqsJy6.js +140 -140
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/templates/index.html +1 -1
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/PKG-INFO +9 -2
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/SOURCES.txt +1 -1
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/pyproject.toml +1 -1
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_crud.py +4 -3
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/LICENSE +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/routers.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/utils.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/auth.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/autocomplete.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/graphs.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/index.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/schema.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/settings.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/table.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/auth.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/docs.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/exceptions.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/auth.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/fields.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/create.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/delete.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/list.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/locales/en.yml +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/locales/ru.yml +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/admin_schema.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/category.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/graphs/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/graphs/category_graphs.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/admin_action.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/category_table.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/__init__.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/function_field.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields_schema.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/table_models.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/index-P_wdMBbz.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/img/example.png +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/translations.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/utils.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/dependency_links.txt +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/requires.txt +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/top_level.txt +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/setup.cfg +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_action.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_payments_fields_schema.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_settings.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_auth.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_filters.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_schema.py +0 -0
- {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_translations.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brilliance-admin
|
|
3
|
-
Version: 0.44.
|
|
3
|
+
Version: 0.44.9
|
|
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
|
|
@@ -40,7 +40,7 @@ Dynamic: license-file
|
|
|
40
40
|
[](https://pypi.org/project/brilliance-admin/)
|
|
41
41
|
[](https://github.com/brilliance-admin/backend-python/actions)
|
|
42
42
|
|
|
43
|
-
Simple and lightweight data
|
|
43
|
+
Simple and lightweight data management framework powered by `FastAPI` and `Vue3` `Vuetify` all-in-one. \
|
|
44
44
|
Integrated with `SQLAlchemy`. Inspaired by Django Admin and DRF.\
|
|
45
45
|
_Some call it heavenly in its brilliance._
|
|
46
46
|
|
|
@@ -60,6 +60,13 @@ This endpoint can be added to any ASGI compatable backend. For existing project
|
|
|
60
60
|
- API to fetch the UI JSON schema
|
|
61
61
|
- API methods for that UI to work with (to read and modify data)
|
|
62
62
|
|
|
63
|
+
<details open>
|
|
64
|
+
<summary><h2>Screenshots</h2></summary>
|
|
65
|
+
<div align="center"><img src="https://github.com/brilliance-admin/.github/blob/main/screenshots/login.png?raw=true"/></div>
|
|
66
|
+
<div align="center"><img src="https://github.com/brilliance-admin/.github/blob/main/screenshots/table.png?raw=true"/></div>
|
|
67
|
+
<div align="center"><img src="https://github.com/brilliance-admin/.github/blob/main/screenshots/charts.png?raw=true"/></div>
|
|
68
|
+
</details>
|
|
69
|
+
|
|
63
70
|
## Key ideas
|
|
64
71
|
|
|
65
72
|
- **API Oriented** <br>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](https://pypi.org/project/brilliance-admin/)
|
|
7
7
|
[](https://github.com/brilliance-admin/backend-python/actions)
|
|
8
8
|
|
|
9
|
-
Simple and lightweight data
|
|
9
|
+
Simple and lightweight data management 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
|
|
|
@@ -26,6 +26,13 @@ This endpoint can be added to any ASGI compatable backend. For existing project
|
|
|
26
26
|
- API to fetch the UI JSON schema
|
|
27
27
|
- API methods for that UI to work with (to read and modify data)
|
|
28
28
|
|
|
29
|
+
<details open>
|
|
30
|
+
<summary><h2>Screenshots</h2></summary>
|
|
31
|
+
<div align="center"><img src="https://github.com/brilliance-admin/.github/blob/main/screenshots/login.png?raw=true"/></div>
|
|
32
|
+
<div align="center"><img src="https://github.com/brilliance-admin/.github/blob/main/screenshots/table.png?raw=true"/></div>
|
|
33
|
+
<div align="center"><img src="https://github.com/brilliance-admin/.github/blob/main/screenshots/charts.png?raw=true"/></div>
|
|
34
|
+
</details>
|
|
35
|
+
|
|
29
36
|
## Key ideas
|
|
30
37
|
|
|
31
38
|
- **API Oriented** <br>
|
|
@@ -23,7 +23,7 @@ class SQLAlchemyAdminRetrieveMixin:
|
|
|
23
23
|
language_context: LanguageContext,
|
|
24
24
|
admin_schema: AdminSchema,
|
|
25
25
|
) -> schema.RetrieveResult:
|
|
26
|
-
if not self.
|
|
26
|
+
if not self.has_retrieve:
|
|
27
27
|
raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
|
|
28
28
|
|
|
29
29
|
# pylint: disable=import-outside-toplevel
|
|
@@ -85,7 +85,9 @@ class SQLAlchemyAdminUpdate:
|
|
|
85
85
|
type(self).__name__, self.table_schema.model.__name__, pk, e,
|
|
86
86
|
extra={'data': data}
|
|
87
87
|
)
|
|
88
|
-
msg = _('errors.db_error_update') % {
|
|
88
|
+
msg = _('errors.db_error_update') % {
|
|
89
|
+
'error_type': str(e) if admin_schema.debug else type(e).__name__,
|
|
90
|
+
}
|
|
89
91
|
raise AdminAPIException(
|
|
90
92
|
APIError(message=msg, code='db_error_update'), status_code=500,
|
|
91
93
|
) from e
|
{brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/base.py
RENAMED
|
@@ -127,6 +127,18 @@ class BooleanField(TableField):
|
|
|
127
127
|
_type = 'boolean'
|
|
128
128
|
|
|
129
129
|
|
|
130
|
+
def _parse_iso(value: str) -> datetime.datetime:
|
|
131
|
+
if value.endswith('Z'):
|
|
132
|
+
value = value.replace('Z', '+00:00')
|
|
133
|
+
|
|
134
|
+
dt = datetime.datetime.fromisoformat(value)
|
|
135
|
+
|
|
136
|
+
if dt.tzinfo is None:
|
|
137
|
+
dt = dt.replace(tzinfo=datetime.timezone.utc)
|
|
138
|
+
|
|
139
|
+
return dt
|
|
140
|
+
|
|
141
|
+
|
|
130
142
|
@dataclass
|
|
131
143
|
class DateTimeField(TableField):
|
|
132
144
|
_type = 'datetime'
|
|
@@ -155,16 +167,17 @@ class DateTimeField(TableField):
|
|
|
155
167
|
raise FieldError(_('errors.bad_type_error') % {'type': type(value), 'expected': 'datetime'})
|
|
156
168
|
|
|
157
169
|
if isinstance(value, str):
|
|
158
|
-
return
|
|
170
|
+
return _parse_iso(value)
|
|
159
171
|
|
|
160
172
|
if isinstance(value, dict):
|
|
161
173
|
if not value.get('from') or not value.get('to'):
|
|
162
|
-
|
|
163
|
-
|
|
174
|
+
raise FieldError(
|
|
175
|
+
f'{type(self).__name__} value must be dict with from,to values: {value}'
|
|
176
|
+
)
|
|
164
177
|
|
|
165
178
|
return {
|
|
166
|
-
'from':
|
|
167
|
-
'to':
|
|
179
|
+
'from': _parse_iso(value['from']),
|
|
180
|
+
'to': _parse_iso(value['to']),
|
|
168
181
|
}
|
|
169
182
|
|
|
170
183
|
raise FieldError(_('errors.bad_type_error') % {'type': type(value), 'expected': 'datetime'})
|
|
@@ -291,3 +304,29 @@ class ChoiceField(TableField):
|
|
|
291
304
|
'value': value,
|
|
292
305
|
'title': choice.get('title') or value if choice else value.capitalize(),
|
|
293
306
|
}
|
|
307
|
+
|
|
308
|
+
async def deserialize(self, value, action: DeserializeAction, extra: dict, *args, **kwargs) -> Any:
|
|
309
|
+
value = await super().deserialize(value, action, extra, *args, **kwargs)
|
|
310
|
+
|
|
311
|
+
if value is None:
|
|
312
|
+
return
|
|
313
|
+
|
|
314
|
+
if isinstance(value, dict):
|
|
315
|
+
if 'value' not in value:
|
|
316
|
+
raise FieldError(
|
|
317
|
+
f'{type(self).__name__} dict value must contain "value": {value}'
|
|
318
|
+
)
|
|
319
|
+
value = value['value']
|
|
320
|
+
|
|
321
|
+
if not isinstance(value, str):
|
|
322
|
+
raise FieldError(
|
|
323
|
+
f'{type(self).__name__} value must be str, got {type(value)}'
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
choice = self.find_choice(value)
|
|
327
|
+
if not choice:
|
|
328
|
+
raise FieldError(
|
|
329
|
+
f'Invalid choice value "{value}", allowed: {[c["value"] for c in self.choices or []]}'
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
return value
|