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.
Files changed (86) hide show
  1. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/PKG-INFO +9 -2
  2. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/README.md +8 -1
  3. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +1 -1
  4. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/update.py +3 -1
  5. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/base.py +44 -5
  6. brilliance_admin-0.44.7/brilliance_admin/static/index-BV43pxcV.js → brilliance_admin-0.44.9/brilliance_admin/static/index-DToqsJy6.js +140 -140
  7. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/templates/index.html +1 -1
  8. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/PKG-INFO +9 -2
  9. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/SOURCES.txt +1 -1
  10. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/pyproject.toml +1 -1
  11. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_crud.py +4 -3
  12. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/LICENSE +0 -0
  13. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/__init__.py +0 -0
  14. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/__init__.py +0 -0
  15. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/routers.py +0 -0
  16. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/utils.py +0 -0
  17. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/__init__.py +0 -0
  18. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/auth.py +0 -0
  19. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/autocomplete.py +0 -0
  20. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/graphs.py +0 -0
  21. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/index.py +0 -0
  22. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/schema.py +0 -0
  23. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/settings.py +0 -0
  24. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/api/views/table.py +0 -0
  25. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/auth.py +0 -0
  26. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/docs.py +0 -0
  27. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/exceptions.py +0 -0
  28. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/__init__.py +0 -0
  29. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/__init__.py +0 -0
  30. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/auth.py +0 -0
  31. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +0 -0
  32. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/fields.py +0 -0
  33. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
  34. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
  35. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
  36. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/create.py +0 -0
  37. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/delete.py +0 -0
  38. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/integrations/sqlalchemy/table/list.py +0 -0
  39. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/locales/en.yml +0 -0
  40. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/locales/ru.yml +0 -0
  41. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/__init__.py +0 -0
  42. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/admin_schema.py +0 -0
  43. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/category.py +0 -0
  44. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/graphs/__init__.py +0 -0
  45. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/graphs/category_graphs.py +0 -0
  46. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/__init__.py +0 -0
  47. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/admin_action.py +0 -0
  48. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/category_table.py +0 -0
  49. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/__init__.py +0 -0
  50. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields/function_field.py +0 -0
  51. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/fields_schema.py +0 -0
  52. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/schema/table/table_models.py +0 -0
  53. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/index-P_wdMBbz.css +0 -0
  54. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
  55. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
  56. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
  57. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
  58. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
  59. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
  60. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
  61. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
  62. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/img/example.png +0 -0
  63. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
  64. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
  65. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
  66. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
  67. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
  68. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
  69. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
  70. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
  71. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
  72. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
  73. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
  74. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/translations.py +0 -0
  75. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin/utils.py +0 -0
  76. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/dependency_links.txt +0 -0
  77. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/requires.txt +0 -0
  78. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/brilliance_admin.egg-info/top_level.txt +0 -0
  79. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/setup.cfg +0 -0
  80. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_action.py +0 -0
  81. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_payments_fields_schema.py +0 -0
  82. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_settings.py +0 -0
  83. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_auth.py +0 -0
  84. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_filters.py +0 -0
  85. {brilliance_admin-0.44.7 → brilliance_admin-0.44.9}/tests/test_sqlalcmeny_schema.py +0 -0
  86. {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.7
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
  [![PyPI](https://img.shields.io/pypi/v/brilliance-admin)](https://pypi.org/project/brilliance-admin/)
41
41
  [![CI](https://github.com/brilliance-admin/backend-python/actions/workflows/deploy.yml/badge.svg)](https://github.com/brilliance-admin/backend-python/actions)
42
42
 
43
- Simple and lightweight data managment framework powered by `FastAPI` and `Vue3` `Vuetify` all-in-one. \
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
  [![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 data managment framework powered by `FastAPI` and `Vue3` `Vuetify` all-in-one. \
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.has_delete:
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') % {'error_type': type(e).__name__}
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
@@ -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 datetime.datetime.strptime(value, self.format)
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
- msg = f'{type(self).__name__} value must be dict with from,to values: {value}'
163
- raise FieldError(msg)
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': datetime.datetime.strptime(value.get('from'), self.format),
167
- 'to': datetime.datetime.strptime(value.get('to'), self.format),
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