brilliance-admin 0.44.5__py3-none-any.whl → 0.44.7__py3-none-any.whl
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/api/views/autocomplete.py +1 -1
- brilliance_admin/api/views/table.py +5 -5
- brilliance_admin/exceptions.py +1 -0
- brilliance_admin/integrations/sqlalchemy/autocomplete.py +6 -1
- brilliance_admin/integrations/sqlalchemy/table/create.py +2 -0
- brilliance_admin/integrations/sqlalchemy/table/delete.py +1 -1
- brilliance_admin/integrations/sqlalchemy/table/list.py +41 -12
- brilliance_admin/integrations/sqlalchemy/table/retrieve.py +31 -13
- brilliance_admin/integrations/sqlalchemy/table/update.py +2 -0
- brilliance_admin/locales/en.yml +5 -2
- brilliance_admin/locales/ru.yml +5 -2
- brilliance_admin/schema/admin_schema.py +4 -2
- brilliance_admin/schema/table/category_table.py +10 -7
- brilliance_admin/schema/table/fields_schema.py +7 -1
- {brilliance_admin-0.44.5.dist-info → brilliance_admin-0.44.7.dist-info}/METADATA +1 -1
- {brilliance_admin-0.44.5.dist-info → brilliance_admin-0.44.7.dist-info}/RECORD +19 -19
- {brilliance_admin-0.44.5.dist-info → brilliance_admin-0.44.7.dist-info}/WHEEL +0 -0
- {brilliance_admin-0.44.5.dist-info → brilliance_admin-0.44.7.dist-info}/licenses/LICENSE +0 -0
- {brilliance_admin-0.44.5.dist-info → brilliance_admin-0.44.7.dist-info}/top_level.txt +0 -0
|
@@ -23,7 +23,7 @@ async def autocomplete(request: Request, group: str, category: str, data: Autoco
|
|
|
23
23
|
context = {'language_context': language_context}
|
|
24
24
|
|
|
25
25
|
try:
|
|
26
|
-
result: AutocompleteResult = await schema_category.autocomplete(data, user, language_context)
|
|
26
|
+
result: AutocompleteResult = await schema_category.autocomplete(data, user, language_context, schema)
|
|
27
27
|
except AdminAPIException as e:
|
|
28
28
|
return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
|
|
29
29
|
except Exception as e:
|
|
@@ -30,7 +30,7 @@ async def table_list(request: Request, group: str, category: str, list_data: Lis
|
|
|
30
30
|
context = {'language_context': language_context}
|
|
31
31
|
|
|
32
32
|
try:
|
|
33
|
-
result: TableListResult = await schema_category.get_list(list_data, user, language_context)
|
|
33
|
+
result: TableListResult = await schema_category.get_list(list_data, user, language_context, schema)
|
|
34
34
|
except AdminAPIException as e:
|
|
35
35
|
return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
|
|
36
36
|
|
|
@@ -54,7 +54,7 @@ async def table_retrieve(request: Request, group: str, category: str, pk: Any) -
|
|
|
54
54
|
context = {'language_context': language_context}
|
|
55
55
|
|
|
56
56
|
try:
|
|
57
|
-
result: RetrieveResult = await schema_category.retrieve(pk, user, language_context)
|
|
57
|
+
result: RetrieveResult = await schema_category.retrieve(pk, user, language_context, schema)
|
|
58
58
|
except AdminAPIException as e:
|
|
59
59
|
return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
|
|
60
60
|
|
|
@@ -77,7 +77,7 @@ async def table_create(request: Request, group: str, category: str) -> CreateRes
|
|
|
77
77
|
context = {'language_context': language_context}
|
|
78
78
|
|
|
79
79
|
try:
|
|
80
|
-
result: CreateResult = await schema_category.create(await request.json(), user, language_context)
|
|
80
|
+
result: CreateResult = await schema_category.create(await request.json(), user, language_context, schema)
|
|
81
81
|
except AdminAPIException as e:
|
|
82
82
|
return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
|
|
83
83
|
|
|
@@ -100,7 +100,7 @@ async def table_update(request: Request, group: str, category: str, pk: Any) ->
|
|
|
100
100
|
context = {'language_context': language_context}
|
|
101
101
|
|
|
102
102
|
try:
|
|
103
|
-
result: UpdateResult = await schema_category.update(pk, await request.json(), user, language_context)
|
|
103
|
+
result: UpdateResult = await schema_category.update(pk, await request.json(), user, language_context, schema)
|
|
104
104
|
except AdminAPIException as e:
|
|
105
105
|
return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
|
|
106
106
|
|
|
@@ -129,7 +129,7 @@ async def table_action(
|
|
|
129
129
|
try:
|
|
130
130
|
# pylint: disable=protected-access
|
|
131
131
|
result: ActionResult = await schema_category._perform_action(
|
|
132
|
-
request, action, action_data, language_context, user,
|
|
132
|
+
request, action, action_data, language_context, user, schema,
|
|
133
133
|
)
|
|
134
134
|
except AdminAPIException as e:
|
|
135
135
|
return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
|
brilliance_admin/exceptions.py
CHANGED
|
@@ -10,6 +10,7 @@ from brilliance_admin.utils import DataclassBase, SupportsStr
|
|
|
10
10
|
class FieldError(DataclassBase, Exception):
|
|
11
11
|
message: SupportsStr = None
|
|
12
12
|
code: str | None = None
|
|
13
|
+
field_slug: str | None = None
|
|
13
14
|
|
|
14
15
|
def __post_init__(self):
|
|
15
16
|
if not self.message and not self.code:
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
from brilliance_admin.auth import UserABC
|
|
2
|
+
from brilliance_admin.schema.admin_schema import AdminSchema
|
|
2
3
|
from brilliance_admin.schema.table.table_models import AutocompleteData, AutocompleteResult
|
|
3
4
|
from brilliance_admin.translations import LanguageContext
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
class SQLAlchemyAdminAutocompleteMixin:
|
|
7
8
|
async def autocomplete(
|
|
8
|
-
self,
|
|
9
|
+
self,
|
|
10
|
+
data: AutocompleteData,
|
|
11
|
+
user: UserABC,
|
|
12
|
+
language_context: LanguageContext,
|
|
13
|
+
admin_schema: AdminSchema,
|
|
9
14
|
) -> AutocompleteResult:
|
|
10
15
|
form_schema = None
|
|
11
16
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from brilliance_admin import schema
|
|
2
2
|
from brilliance_admin.auth import UserABC
|
|
3
3
|
from brilliance_admin.exceptions import AdminAPIException, APIError
|
|
4
|
+
from brilliance_admin.schema.admin_schema import AdminSchema
|
|
4
5
|
from brilliance_admin.translations import LanguageContext
|
|
5
6
|
from brilliance_admin.translations import TranslateText as _
|
|
6
7
|
from brilliance_admin.utils import get_logger
|
|
@@ -16,6 +17,7 @@ class SQLAlchemyAdminCreate:
|
|
|
16
17
|
data: dict,
|
|
17
18
|
user: UserABC,
|
|
18
19
|
language_context: LanguageContext,
|
|
20
|
+
admin_schema: AdminSchema,
|
|
19
21
|
) -> schema.CreateResult:
|
|
20
22
|
if not self.has_create:
|
|
21
23
|
raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
|
|
@@ -12,7 +12,7 @@ class SQLAlchemyDeleteAction:
|
|
|
12
12
|
base_color='red-lighten-2',
|
|
13
13
|
variant='outlined',
|
|
14
14
|
)
|
|
15
|
-
async def delete(self, action_data: ActionData):
|
|
15
|
+
async def delete(self, *args, action_data: ActionData, **kwargs):
|
|
16
16
|
if not self.has_delete:
|
|
17
17
|
raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
|
|
18
18
|
return ActionResult(message=ActionMessage(_('deleted_successfully')))
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from brilliance_admin import auth, schema
|
|
2
2
|
from brilliance_admin.exceptions import AdminAPIException, APIError, FieldError
|
|
3
3
|
from brilliance_admin.integrations.sqlalchemy.fields_schema import SQLAlchemyFieldsSchema
|
|
4
|
+
from brilliance_admin.schema.admin_schema import AdminSchema
|
|
4
5
|
from brilliance_admin.translations import LanguageContext
|
|
5
6
|
from brilliance_admin.translations import TranslateText as _
|
|
6
7
|
from brilliance_admin.utils import get_logger
|
|
@@ -30,12 +31,12 @@ class SQLAlchemyAdminListMixin:
|
|
|
30
31
|
|
|
31
32
|
if list_data.ordering and ordering not in self.ordering_fields:
|
|
32
33
|
msg = f'Ordering "{ordering}" is not allowed; available options: {self.ordering_fields} default_ordering: {self.default_ordering}'
|
|
33
|
-
raise FieldError(message=msg)
|
|
34
|
+
raise FieldError(message=msg, field_slug='ordering')
|
|
34
35
|
|
|
35
36
|
column = getattr(self.model, ordering, None)
|
|
36
37
|
if not isinstance(column, InstrumentedAttribute):
|
|
37
38
|
msg = f'{type(self).__name__} ordering field "{ordering}" not found in model {self.model}'
|
|
38
|
-
raise FieldError(message=msg)
|
|
39
|
+
raise FieldError(message=msg, field_slug='ordering')
|
|
39
40
|
|
|
40
41
|
return stmt.order_by(direction(column))
|
|
41
42
|
|
|
@@ -88,6 +89,7 @@ class SQLAlchemyAdminListMixin:
|
|
|
88
89
|
list_data: schema.ListData,
|
|
89
90
|
user: auth.UserABC,
|
|
90
91
|
language_context: LanguageContext,
|
|
92
|
+
admin_schema: AdminSchema,
|
|
91
93
|
) -> schema.TableListResult:
|
|
92
94
|
# pylint: disable=import-outside-toplevel
|
|
93
95
|
from sqlalchemy import exc, func, select
|
|
@@ -120,20 +122,15 @@ class SQLAlchemyAdminListMixin:
|
|
|
120
122
|
'list_data': list_data,
|
|
121
123
|
}
|
|
122
124
|
)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
msg = _('errors.filters_exception') % {
|
|
126
|
+
'error': str(e) if admin_schema.debug else type(e).__name__,
|
|
127
|
+
}
|
|
128
|
+
raise AdminAPIException(APIError(message=msg, code='filters_exception'), status_code=500) from e
|
|
126
129
|
|
|
127
130
|
try:
|
|
128
131
|
async with self.db_async_session() as session:
|
|
129
132
|
total_count = await session.scalar(count_stmt)
|
|
130
133
|
records = (await session.execute(stmt)).scalars().all()
|
|
131
|
-
for record in records:
|
|
132
|
-
line = await self.table_schema.serialize(
|
|
133
|
-
record,
|
|
134
|
-
extra={"record": record, "user": user},
|
|
135
|
-
)
|
|
136
|
-
data.append(line)
|
|
137
134
|
|
|
138
135
|
except ConnectionRefusedError as e:
|
|
139
136
|
logger.exception(
|
|
@@ -171,9 +168,41 @@ class SQLAlchemyAdminListMixin:
|
|
|
171
168
|
'list_data': list_data,
|
|
172
169
|
}
|
|
173
170
|
)
|
|
174
|
-
msg = _('errors.db_error_list') % {
|
|
171
|
+
msg = _('errors.db_error_list') % {
|
|
172
|
+
'error_type': str(e) if admin_schema.debug else type(e).__name__,
|
|
173
|
+
}
|
|
175
174
|
raise AdminAPIException(
|
|
176
175
|
APIError(message=msg, code='db_error_list'), status_code=500,
|
|
177
176
|
) from e
|
|
178
177
|
|
|
178
|
+
try:
|
|
179
|
+
data = []
|
|
180
|
+
for record in records:
|
|
181
|
+
line = await self.table_schema.serialize(
|
|
182
|
+
record,
|
|
183
|
+
extra={"record": record, "user": user},
|
|
184
|
+
)
|
|
185
|
+
data.append(line)
|
|
186
|
+
|
|
187
|
+
except FieldError as e:
|
|
188
|
+
logger.exception(
|
|
189
|
+
'SQLAlchemy %s list %s serialize field error: %s',
|
|
190
|
+
type(self).__name__, self.model.__name__, e,
|
|
191
|
+
)
|
|
192
|
+
msg = _('serialize_error.field_error') % {
|
|
193
|
+
'error': e.message,
|
|
194
|
+
'field_slug': e.field_slug,
|
|
195
|
+
}
|
|
196
|
+
raise AdminAPIException(APIError(message=msg, code='field_error'), status_code=500) from e
|
|
197
|
+
|
|
198
|
+
except Exception as e:
|
|
199
|
+
logger.exception(
|
|
200
|
+
'SQLAlchemy %s list %s serialize error: %s',
|
|
201
|
+
type(self).__name__, self.model.__name__, e,
|
|
202
|
+
)
|
|
203
|
+
msg = _('serialize_error.unexpected_error') % {
|
|
204
|
+
'error': str(e) if admin_schema.debug else type(e).__name__,
|
|
205
|
+
}
|
|
206
|
+
raise AdminAPIException(APIError(message=msg, code='unexpected_error'), status_code=500) from e
|
|
207
|
+
|
|
179
208
|
return schema.TableListResult(data=data, total_count=int(total_count or 0))
|
|
@@ -3,6 +3,7 @@ from typing import Any
|
|
|
3
3
|
from brilliance_admin import auth, schema
|
|
4
4
|
from brilliance_admin.exceptions import AdminAPIException, APIError, FieldError
|
|
5
5
|
from brilliance_admin.integrations.sqlalchemy.fields_schema import SQLAlchemyFieldsSchema
|
|
6
|
+
from brilliance_admin.schema.admin_schema import AdminSchema
|
|
6
7
|
from brilliance_admin.translations import LanguageContext
|
|
7
8
|
from brilliance_admin.translations import TranslateText as _
|
|
8
9
|
from brilliance_admin.utils import get_logger
|
|
@@ -20,6 +21,7 @@ class SQLAlchemyAdminRetrieveMixin:
|
|
|
20
21
|
pk: Any,
|
|
21
22
|
user: auth.UserABC,
|
|
22
23
|
language_context: LanguageContext,
|
|
24
|
+
admin_schema: AdminSchema,
|
|
23
25
|
) -> schema.RetrieveResult:
|
|
24
26
|
if not self.has_delete:
|
|
25
27
|
raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
|
|
@@ -36,25 +38,15 @@ class SQLAlchemyAdminRetrieveMixin:
|
|
|
36
38
|
try:
|
|
37
39
|
async with self.db_async_session() as session:
|
|
38
40
|
record = (await session.execute(stmt)).scalars().first()
|
|
39
|
-
data = await self.table_schema.serialize(
|
|
40
|
-
record,
|
|
41
|
-
extra={"record": record, "user": user},
|
|
42
|
-
)
|
|
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
41
|
|
|
52
42
|
except Exception as e:
|
|
53
43
|
logger.exception(
|
|
54
44
|
'SQLAlchemy %s retrieve %s #%s db error: %s',
|
|
55
45
|
type(self).__name__, self.model.__name__, pk, e,
|
|
56
46
|
)
|
|
57
|
-
msg = _('errors.db_error_retrieve') % {
|
|
47
|
+
msg = _('errors.db_error_retrieve') % {
|
|
48
|
+
'error_type': str(e) if admin_schema.debug else type(e).__name__,
|
|
49
|
+
}
|
|
58
50
|
raise AdminAPIException(
|
|
59
51
|
APIError(message=msg, code='db_error_retrieve'), status_code=500,
|
|
60
52
|
) from e
|
|
@@ -66,6 +58,32 @@ class SQLAlchemyAdminRetrieveMixin:
|
|
|
66
58
|
status_code=400,
|
|
67
59
|
)
|
|
68
60
|
|
|
61
|
+
try:
|
|
62
|
+
data = await self.table_schema.serialize(
|
|
63
|
+
record,
|
|
64
|
+
extra={"record": record, "user": user},
|
|
65
|
+
)
|
|
66
|
+
except FieldError as e:
|
|
67
|
+
logger.exception(
|
|
68
|
+
'SQLAlchemy %s retrieve %s #%s serialize field error: %s',
|
|
69
|
+
type(self).__name__, self.model.__name__, pk, e,
|
|
70
|
+
)
|
|
71
|
+
msg = _('serialize_error.field_error') % {
|
|
72
|
+
'error': e.message,
|
|
73
|
+
'field_slug': e.field_slug,
|
|
74
|
+
}
|
|
75
|
+
raise AdminAPIException(APIError(message=msg, code='field_error'), status_code=500) from e
|
|
76
|
+
|
|
77
|
+
except Exception as e:
|
|
78
|
+
logger.exception(
|
|
79
|
+
'SQLAlchemy %s list %s #%s serialize error: %s',
|
|
80
|
+
type(self).__name__, self.model.__name__, pk, e,
|
|
81
|
+
)
|
|
82
|
+
msg = _('serialize_error.unexpected_error') % {
|
|
83
|
+
'error': str(e) if admin_schema.debug else type(e).__name__,
|
|
84
|
+
}
|
|
85
|
+
raise AdminAPIException(APIError(message=msg, code='unexpected_error'), status_code=500) from e
|
|
86
|
+
|
|
69
87
|
logger.debug(
|
|
70
88
|
'%s model %s #%s retrieved by %s',
|
|
71
89
|
type(self).__name__, self.table_schema.model.__name__, pk, user.username,
|
|
@@ -2,6 +2,7 @@ from typing import Any
|
|
|
2
2
|
|
|
3
3
|
from brilliance_admin import auth, schema
|
|
4
4
|
from brilliance_admin.exceptions import AdminAPIException, APIError
|
|
5
|
+
from brilliance_admin.schema.admin_schema import AdminSchema
|
|
5
6
|
from brilliance_admin.translations import LanguageContext
|
|
6
7
|
from brilliance_admin.translations import TranslateText as _
|
|
7
8
|
from brilliance_admin.utils import get_logger
|
|
@@ -19,6 +20,7 @@ class SQLAlchemyAdminUpdate:
|
|
|
19
20
|
data: dict,
|
|
20
21
|
user: auth.UserABC,
|
|
21
22
|
language_context: LanguageContext,
|
|
23
|
+
admin_schema: AdminSchema,
|
|
22
24
|
) -> schema.UpdateResult:
|
|
23
25
|
if not self.has_update:
|
|
24
26
|
raise AdminAPIException(APIError(message=_('errors.method_not_allowed')), status_code=500)
|
brilliance_admin/locales/en.yml
CHANGED
|
@@ -12,12 +12,15 @@ errors:
|
|
|
12
12
|
db_error_list: 'Failed to retrieve table data from the database: %(error_type)s'
|
|
13
13
|
|
|
14
14
|
connection_refused_error: 'Database connection error: %(error)s'
|
|
15
|
-
filters_exception: 'An unknown technical error occurred while filtering data
|
|
15
|
+
filters_exception: 'An unknown technical error occurred while filtering data: %(error_type)s'
|
|
16
16
|
method_not_allowed: 'Error, method not allowed. This action is not permitted.'
|
|
17
17
|
filter_error: 'An error occurred during filtering: {error}'
|
|
18
|
-
serialize_field_error: 'Serialize error: %(error)s'
|
|
19
18
|
bad_type_error: 'Invalid data type: %(type)s but %(expected)s expected'
|
|
20
19
|
|
|
20
|
+
serialize_error:
|
|
21
|
+
field_error: 'Field %(field_slug)s serialize error: %(error)s'
|
|
22
|
+
unexpected_error: 'Unexpected serialize error: %(error)s'
|
|
23
|
+
|
|
21
24
|
search_help: 'Available search fields: %(fields)s'
|
|
22
25
|
sqlalchemy_search_help: |
|
|
23
26
|
<b>Available search fields:</b>
|
brilliance_admin/locales/ru.yml
CHANGED
|
@@ -12,12 +12,15 @@ errors:
|
|
|
12
12
|
db_error_list: 'Ошибка получения данных таблицы из базы данных: %(error_type)s'
|
|
13
13
|
|
|
14
14
|
connection_refused_error: 'Ошибка подключения к базе данных: %(error)s'
|
|
15
|
-
filters_exception: 'Произошла неизвестная техническая ошибка при фильтрации
|
|
15
|
+
filters_exception: 'Произошла неизвестная техническая ошибка при фильтрации данных: %(error_type)s'
|
|
16
16
|
method_not_allowed: 'Ошибка, данный метод недоступен.'
|
|
17
17
|
filter_error: 'Проишла ошибка при фильтрации: %(error)s'
|
|
18
|
-
serialize_field_error: 'Ошибка чтения данных: %(error)s'
|
|
19
18
|
bad_type_error: 'Некорректный тип данных: %(type)s; ожидается %(expected)s'
|
|
20
19
|
|
|
20
|
+
serialize_error:
|
|
21
|
+
field_error: 'ошибка чтения поля %(field_slug)s: %(error)s'
|
|
22
|
+
unexpected_error: 'Ошибка обработки данных: %(error)s'
|
|
23
|
+
|
|
21
24
|
search_help: 'Доступные поля для поиска: %(fields)s'
|
|
22
25
|
sqlalchemy_search_help: |
|
|
23
26
|
<b>Доступные поля для поиска:</b>
|
|
@@ -68,6 +68,8 @@ class AdminSchema:
|
|
|
68
68
|
|
|
69
69
|
language_manager: LanguageManager | None = None
|
|
70
70
|
|
|
71
|
+
debug: bool = False
|
|
72
|
+
|
|
71
73
|
def __post_init__(self):
|
|
72
74
|
for category in self.categories:
|
|
73
75
|
if not issubclass(category.__class__, BaseCategory):
|
|
@@ -122,8 +124,6 @@ class AdminSchema:
|
|
|
122
124
|
languages=languages,
|
|
123
125
|
)
|
|
124
126
|
|
|
125
|
-
# pylint: disable=too-many-arguments
|
|
126
|
-
# pylint: disable=too-many-positional-arguments
|
|
127
127
|
def generate_app(
|
|
128
128
|
self,
|
|
129
129
|
debug=False,
|
|
@@ -133,6 +133,8 @@ class AdminSchema:
|
|
|
133
133
|
include_docs=False,
|
|
134
134
|
include_redoc=False,
|
|
135
135
|
) -> FastAPI:
|
|
136
|
+
self.debug = debug
|
|
137
|
+
|
|
136
138
|
# pylint: disable=unused-variable
|
|
137
139
|
language_context = self.get_language_context(language_slug=None)
|
|
138
140
|
|
|
@@ -8,8 +8,8 @@ from pydantic import Field
|
|
|
8
8
|
|
|
9
9
|
from brilliance_admin.auth import UserABC
|
|
10
10
|
from brilliance_admin.exceptions import AdminAPIException, APIError
|
|
11
|
-
from brilliance_admin.schema.
|
|
12
|
-
from brilliance_admin.schema.category import TableInfoSchemaData
|
|
11
|
+
from brilliance_admin.schema.admin_schema import AdminSchema
|
|
12
|
+
from brilliance_admin.schema.category import BaseCategory, TableInfoSchemaData
|
|
13
13
|
from brilliance_admin.schema.table.admin_action import ActionData, ActionResult
|
|
14
14
|
from brilliance_admin.schema.table.fields_schema import FieldsSchema
|
|
15
15
|
from brilliance_admin.schema.table.table_models import AutocompleteData, AutocompleteResult, ListData, TableListResult
|
|
@@ -130,6 +130,7 @@ class CategoryTable(BaseCategory):
|
|
|
130
130
|
action_data: ActionData,
|
|
131
131
|
language_context: LanguageContext,
|
|
132
132
|
user: UserABC,
|
|
133
|
+
admin_schema: AdminSchema,
|
|
133
134
|
) -> ActionResult:
|
|
134
135
|
action_fn = self._get_action_fn(action)
|
|
135
136
|
if action_fn is None:
|
|
@@ -156,7 +157,7 @@ class CategoryTable(BaseCategory):
|
|
|
156
157
|
|
|
157
158
|
return result
|
|
158
159
|
|
|
159
|
-
async def autocomplete(self, data: AutocompleteData, user: UserABC) -> AutocompleteResult:
|
|
160
|
+
async def autocomplete(self, data: AutocompleteData, user: UserABC, schema: AdminSchema) -> AutocompleteResult:
|
|
160
161
|
"""
|
|
161
162
|
Retrieves list of found options to select.
|
|
162
163
|
"""
|
|
@@ -164,14 +165,16 @@ class CategoryTable(BaseCategory):
|
|
|
164
165
|
|
|
165
166
|
# pylint: disable=too-many-arguments
|
|
166
167
|
@abc.abstractmethod
|
|
167
|
-
async def get_list(
|
|
168
|
+
async def get_list(
|
|
169
|
+
self, list_data: ListData, user: UserABC, language_context: LanguageContext, admin_schema: AdminSchema
|
|
170
|
+
) -> TableListResult:
|
|
168
171
|
raise NotImplementedError()
|
|
169
172
|
|
|
170
|
-
# async def retrieve(self, pk: Any, user: UserABC) -> RetrieveResult:
|
|
173
|
+
# async def retrieve(self, pk: Any, user: UserABC, language_context: LanguageContext, admin_schema: AdminSchema) -> RetrieveResult:
|
|
171
174
|
# raise NotImplementedError()
|
|
172
175
|
|
|
173
|
-
# async def create(self, data: dict, user: UserABC) -> CreateResult:
|
|
176
|
+
# async def create(self, data: dict, user: UserABC, language_context: LanguageContext, admin_schema: AdminSchema) -> CreateResult:
|
|
174
177
|
# raise NotImplementedError()
|
|
175
178
|
|
|
176
|
-
# async def update(self, pk: Any, data: dict, user: UserABC) -> UpdateResult:
|
|
179
|
+
# async def update(self, pk: Any, data: dict, user: UserABC, language_context: LanguageContext, admin_schema: AdminSchema) -> UpdateResult:
|
|
177
180
|
# raise NotImplementedError()
|
|
@@ -159,7 +159,13 @@ class FieldsSchema:
|
|
|
159
159
|
result = {}
|
|
160
160
|
for field_slug, field in self.get_fields().items():
|
|
161
161
|
value = data.get(field_slug)
|
|
162
|
-
|
|
162
|
+
|
|
163
|
+
try:
|
|
164
|
+
result[field_slug] = await field.serialize(value, extra)
|
|
165
|
+
except FieldError as e:
|
|
166
|
+
e.field_slug = field_slug
|
|
167
|
+
raise e
|
|
168
|
+
|
|
163
169
|
return result
|
|
164
170
|
|
|
165
171
|
async def deserialize(self, data: dict, action: DeserializeAction, extra) -> dict:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brilliance-admin
|
|
3
|
-
Version: 0.44.
|
|
3
|
+
Version: 0.44.7
|
|
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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
brilliance_admin/__init__.py,sha256=qxGzLVhFNm2FKL2lVt7bEFb6pTPqyXEQvUsDfyfv6SM,183
|
|
2
2
|
brilliance_admin/auth.py,sha256=d57XRfLJIbOosLP1-0SCFkePPT8M5WhLcwxu4yW92RA,673
|
|
3
3
|
brilliance_admin/docs.py,sha256=fKeJKuiCCi1jHRmNcmkuDD6_2di7bwc6-w8V1VCTu0s,1231
|
|
4
|
-
brilliance_admin/exceptions.py,sha256=
|
|
4
|
+
brilliance_admin/exceptions.py,sha256=CJGvpo7EiaX3RVAEUDpwgH_Tuw8kY7tMy57pVcnBxak,947
|
|
5
5
|
brilliance_admin/translations.py,sha256=I_iSfj05Qv5fbZqDvnnHZGUFsi1wk-J0EXSftKBLw5Q,3850
|
|
6
6
|
brilliance_admin/utils.py,sha256=M_0WANlb-1NW4aOA33MxOgoRx0GIVJ6w6PCGKAwmflk,5971
|
|
7
7
|
brilliance_admin/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -9,36 +9,36 @@ brilliance_admin/api/routers.py,sha256=GXz-GFXRH5VbDH1r5O9LLnnmaMhbQq4RctzVEubHn
|
|
|
9
9
|
brilliance_admin/api/utils.py,sha256=ezvHK49OlpCdT9fLB41Y1nswZDLdzC3zTcQtGtuTYUk,999
|
|
10
10
|
brilliance_admin/api/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
brilliance_admin/api/views/auth.py,sha256=Qmd9KuFqCeNhQukYl0W62kcUYPMtgMekjkaTvz1AArM,1133
|
|
12
|
-
brilliance_admin/api/views/autocomplete.py,sha256=
|
|
12
|
+
brilliance_admin/api/views/autocomplete.py,sha256=lpFDq46OCuiPhkUedv4y6GmJQVy3iX4P-di_-GMzabY,1516
|
|
13
13
|
brilliance_admin/api/views/graphs.py,sha256=nn91zoFRZ0FvSkFJoTy7ZQEr8B2cUj43nd8OxPsSmTQ,1351
|
|
14
14
|
brilliance_admin/api/views/index.py,sha256=DkMshrs5zmqpbbF9G2RhqeLGFKMrkrAmQ6nnba7aLl8,1400
|
|
15
15
|
brilliance_admin/api/views/schema.py,sha256=MS9v9Qy3cRO9gGs4uW2PNRBS6Uw48sLRGRe49jnJ2yM,1019
|
|
16
16
|
brilliance_admin/api/views/settings.py,sha256=2A9suZQONEtW9LkFban29Fe5ipQaaGT0CzpxnbuotJQ,1166
|
|
17
|
-
brilliance_admin/api/views/table.py,sha256=
|
|
17
|
+
brilliance_admin/api/views/table.py,sha256=dLo_ic9LPeAvkeelbkHZs9oC9g9ZlXPPMiQMszlwDIQ,5979
|
|
18
18
|
brilliance_admin/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
19
|
brilliance_admin/integrations/sqlalchemy/__init__.py,sha256=AmQHOvegS6_uaE4xYDHzRMdA9PyHn0cCt1s1IWc9G2U,318
|
|
20
20
|
brilliance_admin/integrations/sqlalchemy/auth.py,sha256=N9CjFfnXmKeNbJBxHMDlbPaTQPmYWlYTz_73PYBkaNk,4931
|
|
21
|
-
brilliance_admin/integrations/sqlalchemy/autocomplete.py,sha256=
|
|
21
|
+
brilliance_admin/integrations/sqlalchemy/autocomplete.py,sha256=IKZwdjb5tM_pA5PBUhwYo4n_8nEfy_WcSu8Yu4ftarI,1572
|
|
22
22
|
brilliance_admin/integrations/sqlalchemy/fields.py,sha256=7D0E4-12rqraqHek2yNuHzRdO7hhxjp0edhJu-mTnWQ,9897
|
|
23
23
|
brilliance_admin/integrations/sqlalchemy/fields_schema.py,sha256=7WkOrt5dVvrsZppNZEZS8QaQPMSrfcWChwOaOFSRVOg,11419
|
|
24
24
|
brilliance_admin/integrations/sqlalchemy/table/__init__.py,sha256=g_in2pLTi8UQnT5uNFA8mLW5mxlT84irQ7yVaP_OSS4,605
|
|
25
25
|
brilliance_admin/integrations/sqlalchemy/table/base.py,sha256=-osqhTvqE7YcBxsAjqIUMWyYk1df04GIDmdvtieTXcg,4885
|
|
26
|
-
brilliance_admin/integrations/sqlalchemy/table/create.py,sha256=
|
|
27
|
-
brilliance_admin/integrations/sqlalchemy/table/delete.py,sha256=
|
|
28
|
-
brilliance_admin/integrations/sqlalchemy/table/list.py,sha256=
|
|
29
|
-
brilliance_admin/integrations/sqlalchemy/table/retrieve.py,sha256=
|
|
30
|
-
brilliance_admin/integrations/sqlalchemy/table/update.py,sha256=
|
|
31
|
-
brilliance_admin/locales/en.yml,sha256=
|
|
32
|
-
brilliance_admin/locales/ru.yml,sha256=
|
|
26
|
+
brilliance_admin/integrations/sqlalchemy/table/create.py,sha256=MJauwTe9armKyfGAdurVNrLKMAdC6tpHiEgAelgMCno,2871
|
|
27
|
+
brilliance_admin/integrations/sqlalchemy/table/delete.py,sha256=kcDEM7WDNu3lFdfdltN7nO2zQKHW3TQCYvGn1QcAyZc,755
|
|
28
|
+
brilliance_admin/integrations/sqlalchemy/table/list.py,sha256=Y76B5CFqQb2nfV0i0MrMrK3_kn9cyDvx10gEF8smrIA,8008
|
|
29
|
+
brilliance_admin/integrations/sqlalchemy/table/retrieve.py,sha256=N3QQwR_90xO4QYuJCHIsWBtIBfVcWzGWL5WigdXIc0M,3506
|
|
30
|
+
brilliance_admin/integrations/sqlalchemy/table/update.py,sha256=PUmV5gRW52nRYJNouhQ1gnu0qp_3NLrKqIN5ZvdP-ng,3735
|
|
31
|
+
brilliance_admin/locales/en.yml,sha256=YBjkq2Tm0KjXKOMgnIM5etO42Pkm8mDdQlvmpITwsA4,1453
|
|
32
|
+
brilliance_admin/locales/ru.yml,sha256=9MKJaJyx6dALP6CQkLQMJvgZdp8nwgnBxDsRZiYhlnc,2052
|
|
33
33
|
brilliance_admin/schema/__init__.py,sha256=tZIRTSKFsNOmDqjoAgtYthYrT8ljPvLnYRzfupBLT00,290
|
|
34
|
-
brilliance_admin/schema/admin_schema.py,sha256=
|
|
34
|
+
brilliance_admin/schema/admin_schema.py,sha256=h139gje5vZAv8x3fDgpVTBNF0bY86Y0N9kmdmSENJZA,6683
|
|
35
35
|
brilliance_admin/schema/category.py,sha256=D2aIpDyL-2CibkpenNu8uyh4AzOdQ2ArTDltVYS7xZQ,6592
|
|
36
36
|
brilliance_admin/schema/graphs/__init__.py,sha256=qvmZv9QWdiutPtN5VYQLYbsjY2SOg8p_XRaz2rUlIxY,44
|
|
37
37
|
brilliance_admin/schema/graphs/category_graphs.py,sha256=iTjwjQoZocEfJWJEAdYcJTGCLXWexJVpOiKSfGzrRS8,1486
|
|
38
38
|
brilliance_admin/schema/table/__init__.py,sha256=vuRw8HBuak2LaTZi2dNn5YOrJPalQps-O3Ht-d0AZV4,378
|
|
39
39
|
brilliance_admin/schema/table/admin_action.py,sha256=0ymRL9DKkBK-AF6wKy7K9R4hkmblh55eHuZA_rjO1Lk,2018
|
|
40
|
-
brilliance_admin/schema/table/category_table.py,sha256=
|
|
41
|
-
brilliance_admin/schema/table/fields_schema.py,sha256=
|
|
40
|
+
brilliance_admin/schema/table/category_table.py,sha256=AHR6fatZTdRKvUnks7DzQm0V0OwID-59khTxosEXoHE,6817
|
|
41
|
+
brilliance_admin/schema/table/fields_schema.py,sha256=E6U0oLREyCU-8HnwNB8Sf40al2bIzgs0-g5fOpqbQkw,8475
|
|
42
42
|
brilliance_admin/schema/table/table_models.py,sha256=xidraifRYbXGkiVLn6dJ96dkOhW8-22ynE-fbiOjfAU,1018
|
|
43
43
|
brilliance_admin/schema/table/fields/__init__.py,sha256=RW-sIFTAaSQo4mMR6iWtnefogWPjmg6KAsDwe9mKW1k,291
|
|
44
44
|
brilliance_admin/schema/table/fields/base.py,sha256=HTOMWjuiTSV7lP1F5huUoit06j8Xd8v82cZ3Qz8Y7TI,9182
|
|
@@ -66,8 +66,8 @@ brilliance_admin/static/tinymce/plugins/codesample/css/prism.css,sha256=exAdMtHb
|
|
|
66
66
|
brilliance_admin/static/tinymce/plugins/customLink/plugin.js,sha256=illBNpnHDkBsLG6wo_jDPF6z7CGnO1MQWUoDwZKy6vQ,5589
|
|
67
67
|
brilliance_admin/static/tinymce/plugins/customLink/css/link.css,sha256=gh5nvY8Z92hJfCEBPnIm4jIPCcKKbJnab-30oIfX7Hc,56
|
|
68
68
|
brilliance_admin/templates/index.html,sha256=T1d7BYLJOmL6eTICyxH82aCStGXq-bom_dJG5aVxfKA,1294
|
|
69
|
-
brilliance_admin-0.44.
|
|
70
|
-
brilliance_admin-0.44.
|
|
71
|
-
brilliance_admin-0.44.
|
|
72
|
-
brilliance_admin-0.44.
|
|
73
|
-
brilliance_admin-0.44.
|
|
69
|
+
brilliance_admin-0.44.7.dist-info/licenses/LICENSE,sha256=rgWE5Cxk53W0PhTOVmcQedABEWN1QMG-PRz3fz531sE,1074
|
|
70
|
+
brilliance_admin-0.44.7.dist-info/METADATA,sha256=pJUw3SoXYzHE-W5sqe1HR6NG3n-9kkOfvGQd2bAvV9Y,6951
|
|
71
|
+
brilliance_admin-0.44.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
72
|
+
brilliance_admin-0.44.7.dist-info/top_level.txt,sha256=almFFSWrVYieI3i54hYL0fMUaeuIYiazS2Kx4wtK-ns,17
|
|
73
|
+
brilliance_admin-0.44.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|