brilliance-admin 0.43.4__tar.gz → 0.43.6__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 (127) hide show
  1. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/PKG-INFO +1 -1
  2. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/auth.py +2 -2
  3. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/fields.py +4 -5
  4. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/create.py +3 -3
  5. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/delete.py +1 -1
  6. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/list.py +4 -4
  7. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +14 -5
  8. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/update.py +5 -5
  9. brilliance_admin-0.43.6/brilliance_admin/locales/en.yml +25 -0
  10. brilliance_admin-0.43.6/brilliance_admin/locales/ru.yml +26 -0
  11. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin.egg-info/PKG-INFO +1 -1
  12. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/pyproject.toml +1 -1
  13. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_sqlalcmeny_crud.py +2 -0
  14. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_sqlalcmeny_schema.py +12 -0
  15. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/uv.lock +1 -1
  16. brilliance_admin-0.43.4/brilliance_admin/locales/en.yml +0 -22
  17. brilliance_admin-0.43.4/brilliance_admin/locales/ru.yml +0 -22
  18. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.configs/docker/Dockerfile +0 -0
  19. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.configs/docker/docker-compose.yml +0 -0
  20. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.configs/nginx/example.conf +0 -0
  21. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.env +0 -0
  22. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.github/workflows/certbot.yml +0 -0
  23. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.github/workflows/deploy.yml +0 -0
  24. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.github/workflows/install-docker.yml +0 -0
  25. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.gitignore +0 -0
  26. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.isort.cfg +0 -0
  27. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/.python-version +0 -0
  28. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/LICENSE +0 -0
  29. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/README.md +0 -0
  30. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/__init__.py +0 -0
  31. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/__init__.py +0 -0
  32. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/routers.py +0 -0
  33. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/utils.py +0 -0
  34. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/__init__.py +0 -0
  35. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/auth.py +0 -0
  36. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/autocomplete.py +0 -0
  37. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/graphs.py +0 -0
  38. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/index.py +0 -0
  39. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/schema.py +0 -0
  40. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/settings.py +0 -0
  41. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/api/views/table.py +0 -0
  42. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/auth.py +0 -0
  43. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/docs.py +0 -0
  44. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/exceptions.py +0 -0
  45. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/__init__.py +0 -0
  46. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/__init__.py +0 -0
  47. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +0 -0
  48. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
  49. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
  50. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
  51. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/__init__.py +0 -0
  52. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/admin_schema.py +0 -0
  53. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/category.py +0 -0
  54. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/graphs/__init__.py +0 -0
  55. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/graphs/category_graphs.py +0 -0
  56. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/group.py +0 -0
  57. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/__init__.py +0 -0
  58. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/admin_action.py +0 -0
  59. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/category_table.py +0 -0
  60. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/fields/__init__.py +0 -0
  61. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/fields/base.py +0 -0
  62. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/fields/function_field.py +0 -0
  63. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/fields_schema.py +0 -0
  64. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/schema/table/table_models.py +0 -0
  65. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/index-D9axz5zK.js +0 -0
  66. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/index-vlBToOhT.css +0 -0
  67. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
  68. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
  69. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
  70. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
  71. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
  72. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
  73. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
  74. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
  75. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/img/example.png +0 -0
  76. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
  77. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
  78. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
  79. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
  80. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
  81. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
  82. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
  83. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
  84. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
  85. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
  86. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
  87. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/templates/index.html +0 -0
  88. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/translations.py +0 -0
  89. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin/utils.py +0 -0
  90. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin.egg-info/SOURCES.txt +0 -0
  91. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin.egg-info/dependency_links.txt +0 -0
  92. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin.egg-info/requires.txt +0 -0
  93. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/brilliance_admin.egg-info/top_level.txt +0 -0
  94. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/README.md +0 -0
  95. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/__init__.py +0 -0
  96. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/locales/en.yml +0 -0
  97. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/locales/ru.yml +0 -0
  98. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/main.py +0 -0
  99. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/__init__.py +0 -0
  100. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/currency.py +0 -0
  101. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/graphs.py +0 -0
  102. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/merchant.py +0 -0
  103. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/models.py +0 -0
  104. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/payments.py +0 -0
  105. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/terminal.py +0 -0
  106. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sections/users.py +0 -0
  107. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/sqlite.py +0 -0
  108. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/static/favicon.ico +0 -0
  109. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/static/favicon.jpg +0 -0
  110. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/static/logo-outline.png +0 -0
  111. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/static/logo.png +0 -0
  112. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/example/utils.py +0 -0
  113. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/screenshots/PC-graphs.jpeg +0 -0
  114. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/screenshots/PC-table.jpeg +0 -0
  115. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/screenshots/iPad-edit.jpeg +0 -0
  116. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/screenshots/iPhone 15-edit.jpeg +0 -0
  117. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/screenshots/iPhone 15-login.jpeg +0 -0
  118. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/screenshots/websitemockupgenerator.png +0 -0
  119. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/setup.cfg +0 -0
  120. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/__init__.py +0 -0
  121. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/conftest.py +0 -0
  122. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_action.py +0 -0
  123. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_payments_fields_schema.py +0 -0
  124. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_settings.py +0 -0
  125. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_sqlalcmeny_auth.py +0 -0
  126. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_sqlalcmeny_filters.py +0 -0
  127. {brilliance_admin-0.43.4 → brilliance_admin-0.43.6}/tests/test_translations.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brilliance-admin
3
- Version: 0.43.4
3
+ Version: 0.43.6
4
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
@@ -54,7 +54,7 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
54
54
  logger.exception(
55
55
  'SQLAlchemy %s login db error: %s', type(self).__name__, e,
56
56
  )
57
- msg = _('connection_refused_error') % {'error': str(e)}
57
+ msg = _('errors.connection_refused_error') % {'error': str(e)}
58
58
  raise AdminAPIException(
59
59
  APIError(message=msg, code='connection_refused_error'),
60
60
  status_code=500,
@@ -127,7 +127,7 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
127
127
  logger.exception(
128
128
  'SQLAlchemy %s authenticate db error: %s', type(self).__name__, e,
129
129
  )
130
- msg = _('connection_refused_error') % {'error': str(e)}
130
+ msg = _('errors.connection_refused_error') % {'error': str(e)}
131
131
  raise AdminAPIException(
132
132
  APIError(message=msg, code='connection_refused_error'),
133
133
  status_code=500,
@@ -146,16 +146,15 @@ class SQLAlchemyRelatedField(TableField):
146
146
  if record is None:
147
147
  raise FieldError(f'Missing record in serialize context in value: {value}')
148
148
 
149
+ related = getattr(record, self.rel_name, None)
150
+
149
151
  if self.many:
150
- related = getattr(record, self.rel_name, None)
151
152
  if related is None:
152
- raise FieldError(f'Related field "{self.rel_name}" is missing on record "{record}" (many=True)')
153
-
153
+ raise FieldError(f'Many Related field "{self.rel_name}" is missing on record "{record}"')
154
154
  return [{'key': get_pk(obj), 'title': str(obj)} for obj in related]
155
155
 
156
- related = getattr(record, self.rel_name, None)
157
156
  if related is None:
158
- raise FieldError(f'Related field "{self.rel_name}" is missing on record "{record}" (many=False)')
157
+ return None
159
158
 
160
159
  return {'key': get_pk(related), 'title': str(related)}
161
160
 
@@ -18,7 +18,7 @@ class SQLAlchemyAdminCreate:
18
18
  language_context: LanguageContext,
19
19
  ) -> schema.CreateResult:
20
20
  if not self.has_create:
21
- raise AdminAPIException(APIError(message=_('method_not_allowed')), status_code=500)
21
+ raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
22
22
 
23
23
  # pylint: disable=import-outside-toplevel
24
24
  from sqlalchemy.exc import IntegrityError
@@ -37,7 +37,7 @@ class SQLAlchemyAdminCreate:
37
37
  type(self).__name__, self.table_schema.model.__name__, e,
38
38
  extra={'data': data},
39
39
  )
40
- msg = _('connection_refused_error') % {'error': str(e)}
40
+ msg = _('errors.connection_refused_error') % {'error': str(e)}
41
41
  raise AdminAPIException(
42
42
  APIError(message=msg, code='connection_refused_error'),
43
43
  status_code=500,
@@ -62,7 +62,7 @@ class SQLAlchemyAdminCreate:
62
62
  extra={'data': data},
63
63
  )
64
64
  raise AdminAPIException(
65
- APIError(message=_('db_error_create'), code='db_error_create'), status_code=500,
65
+ APIError(message=_('errors.db_error_create'), code='db_error_create'), status_code=500,
66
66
  ) from e
67
67
 
68
68
  logger.info(
@@ -14,5 +14,5 @@ class SQLAlchemyDeleteAction:
14
14
  )
15
15
  async def delete(self, action_data: ActionData):
16
16
  if not self.has_delete:
17
- raise AdminAPIException(APIError(message=_('method_not_allowed')), status_code=500)
17
+ raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
18
18
  return ActionResult(message=ActionMessage(_('deleted_successfully')))
@@ -109,7 +109,7 @@ class SQLAlchemyAdminListMixin:
109
109
  'list_data': list_data,
110
110
  }
111
111
  )
112
- msg = _('filter_error') % {'error': e.message}
112
+ msg = _('errors.filter_error') % {'error': e.message}
113
113
  raise AdminAPIException(APIError(message=msg, code='filters_exception'), status_code=500) from e
114
114
 
115
115
  except Exception as e:
@@ -120,7 +120,7 @@ class SQLAlchemyAdminListMixin:
120
120
  'list_data': list_data,
121
121
  }
122
122
  )
123
- raise AdminAPIException(APIError(message=_('filters_exception'), code='filters_exception'), status_code=500) from e
123
+ raise AdminAPIException(APIError(message=_('errors.filters_exception'), code='filters_exception'), status_code=500) from e
124
124
 
125
125
  data = []
126
126
 
@@ -143,7 +143,7 @@ class SQLAlchemyAdminListMixin:
143
143
  'list_data': list_data,
144
144
  }
145
145
  )
146
- msg = _('connection_refused_error') % {'error': str(e)}
146
+ msg = _('errors.connection_refused_error') % {'error': str(e)}
147
147
  raise AdminAPIException(
148
148
  APIError(message=msg, code='connection_refused_error'),
149
149
  status_code=500,
@@ -172,7 +172,7 @@ class SQLAlchemyAdminListMixin:
172
172
  }
173
173
  )
174
174
  raise AdminAPIException(
175
- APIError(message=_('db_error_list'), code='db_error_list'), status_code=500,
175
+ APIError(message=_('errors.db_error_list'), code='db_error_list'), status_code=500,
176
176
  ) from e
177
177
 
178
178
  return schema.TableListResult(data=data, total_count=int(total_count or 0))
@@ -1,7 +1,7 @@
1
1
  from typing import Any
2
2
 
3
3
  from brilliance_admin import auth, schema
4
- from brilliance_admin.exceptions import AdminAPIException, APIError
4
+ from brilliance_admin.exceptions import AdminAPIException, APIError, FieldError
5
5
  from brilliance_admin.integrations.sqlalchemy.fields_schema import SQLAlchemyFieldsSchema
6
6
  from brilliance_admin.translations import LanguageContext
7
7
  from brilliance_admin.translations import TranslateText as _
@@ -22,7 +22,7 @@ class SQLAlchemyAdminRetrieveMixin:
22
22
  language_context: LanguageContext,
23
23
  ) -> schema.RetrieveResult:
24
24
  if not self.has_delete:
25
- raise AdminAPIException(APIError(message=_('method_not_allowed')), status_code=500)
25
+ raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
26
26
 
27
27
  # pylint: disable=import-outside-toplevel
28
28
  from sqlalchemy import inspect
@@ -41,16 +41,25 @@ class SQLAlchemyAdminRetrieveMixin:
41
41
  extra={"record": record, "user": user},
42
42
  )
43
43
 
44
+ except FieldError as e:
45
+ logger.exception(
46
+ 'SQLAlchemy %s retrieve %s #%s field error: %s',
47
+ type(self).__name__, self.model.__name__, pk, e,
48
+ )
49
+ msg = _('errors.serialize_field_error') % {'error': e.message}
50
+ raise AdminAPIException(APIError(message=msg, code='filters_exception'), status_code=500) from e
51
+
44
52
  except Exception as e:
45
53
  logger.exception(
46
- 'SQLAlchemy %s retrieve db error: %s', type(self).__name__, e,
54
+ 'SQLAlchemy %s retrieve %s #%s db error: %s',
55
+ type(self).__name__, self.model.__name__, pk, e,
47
56
  )
48
57
  raise AdminAPIException(
49
- APIError(message=_('db_error_retrieve'), code='db_error_retrieve'), status_code=500,
58
+ APIError(message=_('errors.db_error_retrieve'), code='db_error_retrieve'), status_code=500,
50
59
  ) from e
51
60
 
52
61
  if record is None:
53
- msg = _('record_not_found') % {'pk_name': self.pk_name, 'pk': pk}
62
+ msg = _('errors.record_not_found') % {'pk_name': self.pk_name, 'pk': pk}
54
63
  raise AdminAPIException(
55
64
  APIError(message=msg, code='record_not_found'),
56
65
  status_code=400,
@@ -21,7 +21,7 @@ class SQLAlchemyAdminUpdate:
21
21
  language_context: LanguageContext,
22
22
  ) -> schema.UpdateResult:
23
23
  if not self.has_update:
24
- raise AdminAPIException(APIError(message=_('method_not_allowed')), status_code=500)
24
+ raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
25
25
 
26
26
  # pylint: disable=import-outside-toplevel
27
27
  from sqlalchemy import inspect
@@ -29,7 +29,7 @@ class SQLAlchemyAdminUpdate:
29
29
 
30
30
  if pk is None:
31
31
  raise AdminAPIException(
32
- APIError(message=_('pk_not_found') % {'pk_name': self.pk_name}, code='pk_not_found'),
32
+ APIError(message=_('errors.pk_not_found') % {'pk_name': self.pk_name}, code='pk_not_found'),
33
33
  status_code=400,
34
34
  )
35
35
 
@@ -42,7 +42,7 @@ class SQLAlchemyAdminUpdate:
42
42
  async with self.db_async_session() as session:
43
43
  record = (await session.execute(stmt)).scalars().first()
44
44
  if record is None:
45
- msg = _('record_not_found') % {'pk_name': self.pk_name, 'pk': pk}
45
+ msg = _('errors.record_not_found') % {'pk_name': self.pk_name, 'pk': pk}
46
46
  raise AdminAPIException(
47
47
  APIError(message=msg, code='record_not_found'),
48
48
  status_code=400,
@@ -59,7 +59,7 @@ class SQLAlchemyAdminUpdate:
59
59
  type(self).__name__, self.table_schema.model.__name__, pk, e,
60
60
  extra={'data': data},
61
61
  )
62
- msg = _('connection_refused_error') % {'error': str(e)}
62
+ msg = _('errors.connection_refused_error') % {'error': str(e)}
63
63
  raise AdminAPIException(
64
64
  APIError(message=msg, code='connection_refused_error'),
65
65
  status_code=400,
@@ -84,7 +84,7 @@ class SQLAlchemyAdminUpdate:
84
84
  extra={'data': data}
85
85
  )
86
86
  raise AdminAPIException(
87
- APIError(message=_('db_error_update'), code='db_error_update'), status_code=500,
87
+ APIError(message=_('errors.db_error_update'), code='db_error_update'), status_code=500,
88
88
  ) from e
89
89
 
90
90
  logger.info(
@@ -0,0 +1,25 @@
1
+ delete: 'Delete'
2
+ delete_confirmation_text: "Are you sure you want to delete those records?\nThis action cannot be undone."
3
+ deleted_successfully: 'The entries were successfully deleted.'
4
+
5
+ errors:
6
+ db_error_create: 'Error creating a record in the database.'
7
+ db_error_update: 'Error updating the record in the database.'
8
+ db_error_retrieve: 'Error retrieving the record from the database.'
9
+ 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
+ connection_refused_error: 'Database connection error: %(error)s'
13
+ filters_exception: 'An unknown technical error occurred while filtering data.'
14
+ method_not_allowed: 'Error, method not allowed. This action is not permitted.'
15
+ filter_error: 'An error occurred during filtering: {error}'
16
+
17
+ search_help: 'Available search fields: %(fields)s'
18
+ sqlalchemy_search_help: |
19
+ <b>Available search fields:</b>
20
+ %(fields)s
21
+
22
+ <b>Available operators:</b>
23
+ <b>""</b> - quotes for exact match
24
+ <b>%%</b> - any sequence of characters
25
+ <b>_</b> - any single character
@@ -0,0 +1,26 @@
1
+ delete: 'Удалить'
2
+ delete_confirmation_text: "Вы уверены, что хотите удалить данные записи?\nДанное действие нельзя отменить."
3
+ deleted_successfully: 'Записи успешно удалены.'
4
+
5
+ errors:
6
+ pk_not_found: 'Поле "%(pk_name)s" не найдено среди переданных данных.'
7
+ record_not_found: 'Запись по ключу %(pk_name)s=%(pk)s не найдена.'
8
+ db_error_create: 'Ошибка создания записи в базе данных.'
9
+ db_error_update: 'Ошибка обновления записи в базе данных.'
10
+ db_error_retrieve: 'Ошибка получения записи из базы данных.'
11
+ db_error_list: 'Ошибка получения данных таблицы из базы данных.'
12
+ connection_refused_error: 'Ошибка подключения к базе данных: %(error)s'
13
+ filters_exception: 'Произошла неизвестная техническая ошибка при фильтрации данных.'
14
+ method_not_allowed: 'Ошибка, данный метод недоступен.'
15
+ filter_error: 'Проишла ошибка при фильтрации: %(error)s'
16
+ serialize_field_error: 'Ошибка чтения данных: %(error)s'
17
+
18
+ search_help: 'Доступные поля для поиска: %(fields)s'
19
+ sqlalchemy_search_help: |
20
+ <b>Доступные поля для поиска:</b>
21
+ %(fields)s
22
+
23
+ <b>Доступные операторы:</b>
24
+ <b>""</b> - кавычки для точного совпадения
25
+ <b>%%</b> - любая последовательность символов
26
+ <b>_</b> - один любой символ
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brilliance-admin
3
- Version: 0.43.4
3
+ Version: 0.43.6
4
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "brilliance-admin"
3
- version = "0.43.4"
3
+ version = "0.43.6"
4
4
  description = 'Simple and lightweight admin panel framework powered by FastAPI and Vue3 Vuetify together.. Some call it heavenly in its brilliance.'
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -74,6 +74,7 @@ async def test_retrieve(sqlite_sessionmaker, language_context):
74
74
  'key': currency.id,
75
75
  'title': mock.ANY,
76
76
  },
77
+ 'fee_id': None,
77
78
  'status': {
78
79
  'title': TranslateText('statuses.process'),
79
80
  'value': 'process',
@@ -169,6 +170,7 @@ async def test_list(sqlite_sessionmaker, language_context):
169
170
  'title': TranslateText('statuses.process'),
170
171
  'value': 'process',
171
172
  },
173
+ 'fee_id': None,
172
174
  'description': 'description',
173
175
  'id': 1,
174
176
  'is_h2h': False,
@@ -136,10 +136,21 @@ category_schema_data = {
136
136
  'type': 'choice',
137
137
  'variant': 'elevated',
138
138
  },
139
+ 'fee_id': {
140
+ 'dual_list': False,
141
+ 'header': {},
142
+ 'label': 'Fee',
143
+ 'many': False,
144
+ 'read_only': False,
145
+ 'rel_name': 'fee',
146
+ 'required': False,
147
+ 'type': 'related',
148
+ },
139
149
  },
140
150
  'list_display': [
141
151
  'id',
142
152
  'title',
153
+ 'fee_id',
143
154
  'status',
144
155
  'description',
145
156
  'secret_key',
@@ -158,6 +169,7 @@ category_schema_data = {
158
169
  FIELDS = [
159
170
  'id',
160
171
  'title',
172
+ 'fee_id',
161
173
  'status',
162
174
  'description',
163
175
  'secret_key',
@@ -65,7 +65,7 @@ wheels = [
65
65
 
66
66
  [[package]]
67
67
  name = "brilliance-admin"
68
- version = "0.43.4"
68
+ version = "0.43.6"
69
69
  source = { editable = "." }
70
70
  dependencies = [
71
71
  { name = "asgiref" },
@@ -1,22 +0,0 @@
1
- delete: 'Delete'
2
- delete_confirmation_text: "Are you sure you want to delete those records?\nThis action cannot be undone."
3
- deleted_successfully: 'The entries were successfully deleted.'
4
- pk_not_found: 'The "%(pk_name)s" field was not found in the submitted data.'
5
- record_not_found: 'No record found for %(pk_name)s=%(pk)s.'
6
- db_error_create: 'Error creating a record in the database.'
7
- db_error_update: 'Error updating the record in the database.'
8
- db_error_retrieve: 'Error retrieving the record from the database.'
9
- db_error_list: 'Failed to retrieve table data from the database.'
10
- connection_refused_error: 'Database connection error: %(error)s'
11
- search_help: 'Available search fields: %(fields)s'
12
- sqlalchemy_search_help: |
13
- <b>Available search fields:</b>
14
- %(fields)s
15
-
16
- <b>Available operators:</b>
17
- <b>""</b> - quotes for exact match
18
- <b>%%</b> - any sequence of characters
19
- <b>_</b> - any single character
20
- filters_exception: 'An unknown technical error occurred while filtering data.'
21
- method_not_allowed: 'Error, method not allowed. This action is not permitted.'
22
- filter_error: 'An error occurred during filtering: {error}'
@@ -1,22 +0,0 @@
1
- delete: 'Удалить'
2
- delete_confirmation_text: "Вы уверены, что хотите удалить данные записи?\nДанное действие нельзя отменить."
3
- deleted_successfully: 'Записи успешно удалены.'
4
- pk_not_found: 'Поле "%(pk_name)s" не найдено среди переданных данных.'
5
- record_not_found: 'Запись по ключу %(pk_name)s=%(pk)s не найдена.'
6
- db_error_create: 'Ошибка создания записи в базе данных.'
7
- db_error_update: 'Ошибка обновления записи в базе данных.'
8
- db_error_retrieve: 'Ошибка получения записи из базы данных.'
9
- db_error_list: 'Ошибка получения данных таблицы из базы данных.'
10
- connection_refused_error: 'Ошибка подключения к базе данных: %(error)s'
11
- search_help: 'Доступные поля для поиска: %(fields)s'
12
- sqlalchemy_search_help: |
13
- <b>Доступные поля для поиска:</b>
14
- %(fields)s
15
-
16
- <b>Доступные операторы:</b>
17
- <b>""</b> - кавычки для точного совпадения
18
- <b>%%</b> - любая последовательность символов
19
- <b>_</b> - один любой символ
20
- filters_exception: 'Произошла неизвестная техническая ошибка при фильтрации данных.'
21
- method_not_allowed: 'Ошибка, данный метод недоступен.'
22
- filter_error: 'Проишла ошибка при фильтрации: {error}'