brilliance-admin 0.44.16__tar.gz → 0.44.17__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.16 → brilliance_admin-0.44.17}/PKG-INFO +1 -1
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/auth.py +9 -3
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/PKG-INFO +1 -1
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/pyproject.toml +1 -1
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_auth.py +56 -5
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/LICENSE +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/README.md +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/routers.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/utils.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/auth.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/autocomplete.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/dashboard.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/index.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/schema.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/settings.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/table.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/auth.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/docs.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/exceptions.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/fields.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/create.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/delete.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/list.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/update.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/locales/en.yml +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/locales/ru.yml +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/admin_schema.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/category.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/dashboard/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/dashboard/category_dashboard.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/admin_action.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/category_table.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/__init__.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/base.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/function_field.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields_schema.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/table_models.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/index-EybvSE2q.js +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/index-wIukkQjw.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/img/example.png +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/templates/index.html +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/translations.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/utils.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/SOURCES.txt +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/dependency_links.txt +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/requires.txt +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/top_level.txt +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/setup.cfg +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_action.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_payments_fields_schema.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_settings.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_crud.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_filters.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_schema.py +0 -0
- {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/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.17
|
|
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,3 +1,4 @@
|
|
|
1
|
+
import inspect
|
|
1
2
|
from typing import Callable
|
|
2
3
|
|
|
3
4
|
from brilliance_admin.auth import AdminAuthentication, AuthData, AuthResult, UserABC, UserResult
|
|
@@ -14,7 +15,7 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
|
|
|
14
15
|
user_model = None
|
|
15
16
|
pk_name = None
|
|
16
17
|
|
|
17
|
-
password_validator
|
|
18
|
+
password_validator = None
|
|
18
19
|
|
|
19
20
|
def __init__(self, secret: str, db_async_session, user_model, pk_name='id', password_validator=None):
|
|
20
21
|
self.pk_name = pk_name
|
|
@@ -76,14 +77,19 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
|
|
|
76
77
|
|
|
77
78
|
try:
|
|
78
79
|
if self.password_validator:
|
|
79
|
-
if
|
|
80
|
+
if inspect.iscoroutinefunction(self.password_validator):
|
|
81
|
+
valid_password = await self.password_validator(user, data.password)
|
|
82
|
+
else:
|
|
83
|
+
valid_password = self.password_validator(user, data.password)
|
|
84
|
+
|
|
85
|
+
if not valid_password:
|
|
80
86
|
raise AdminAPIException(APIError(code="user_not_found"), status_code=401)
|
|
81
87
|
|
|
82
88
|
except AdminAPIException as e:
|
|
83
89
|
raise e
|
|
84
90
|
except Exception as e:
|
|
85
91
|
msg = _('errors.password_exception') % {
|
|
86
|
-
'error_type': str(e) if
|
|
92
|
+
'error_type': str(e) if debug else type(e).__name__,
|
|
87
93
|
}
|
|
88
94
|
raise AdminAPIException(APIError(message=msg, code="password_exception"), status_code=500) from e
|
|
89
95
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brilliance-admin
|
|
3
|
-
Version: 0.44.
|
|
3
|
+
Version: 0.44.17
|
|
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,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "brilliance-admin"
|
|
3
|
-
version = "0.44.
|
|
3
|
+
version = "0.44.17"
|
|
4
4
|
description = 'Simple and lightweight data managment framework powered by FastAPI and Vue3 Vuetify all-in-one. Some call it heavenly in its brilliance.'
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -99,23 +99,69 @@ async def test_authenticate_not_admin(sqlite_sessionmaker):
|
|
|
99
99
|
|
|
100
100
|
|
|
101
101
|
@pytest.mark.asyncio
|
|
102
|
-
async def
|
|
102
|
+
async def test_login_valid_password_sync(sqlite_sessionmaker, language_context):
|
|
103
|
+
def async_password_validator(user, password):
|
|
104
|
+
return password == 'correct_password'
|
|
105
|
+
|
|
103
106
|
auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
|
|
104
107
|
secret='123',
|
|
105
108
|
db_async_session=sqlite_sessionmaker,
|
|
106
109
|
user_model=User,
|
|
107
|
-
password_validator=
|
|
110
|
+
password_validator=async_password_validator,
|
|
111
|
+
)
|
|
112
|
+
await UserFactory(username='admin', password='correct_password', is_admin=True)
|
|
113
|
+
|
|
114
|
+
result = await auth.login(data=AuthData(username='admin', password='correct_password'))
|
|
115
|
+
|
|
116
|
+
assert result.token is not None
|
|
117
|
+
assert result.user.username == 'admin'
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@pytest.mark.asyncio
|
|
121
|
+
async def test_login_valid_password_async(sqlite_sessionmaker, language_context):
|
|
122
|
+
async def async_password_validator(user, password):
|
|
123
|
+
return password == 'correct_password'
|
|
124
|
+
|
|
125
|
+
auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
|
|
126
|
+
secret='123',
|
|
127
|
+
db_async_session=sqlite_sessionmaker,
|
|
128
|
+
user_model=User,
|
|
129
|
+
password_validator=async_password_validator,
|
|
108
130
|
)
|
|
109
131
|
await UserFactory(username='admin', password='correct_password', is_admin=True)
|
|
110
132
|
|
|
111
|
-
result = await auth.login(data=AuthData(username='admin', password='correct_password')
|
|
133
|
+
result = await auth.login(data=AuthData(username='admin', password='correct_password'))
|
|
112
134
|
|
|
113
135
|
assert result.token is not None
|
|
114
136
|
assert result.user.username == 'admin'
|
|
115
137
|
|
|
116
138
|
|
|
117
139
|
@pytest.mark.asyncio
|
|
118
|
-
async def
|
|
140
|
+
async def test_login_invalid_password_async(sqlite_sessionmaker, language_context):
|
|
141
|
+
async def async_password_validator(user, password):
|
|
142
|
+
return password == 'correct_password'
|
|
143
|
+
|
|
144
|
+
auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
|
|
145
|
+
secret='123',
|
|
146
|
+
db_async_session=sqlite_sessionmaker,
|
|
147
|
+
user_model=User,
|
|
148
|
+
password_validator=async_password_validator,
|
|
149
|
+
)
|
|
150
|
+
await UserFactory(username='admin', password='correct_password', is_admin=True)
|
|
151
|
+
|
|
152
|
+
with pytest.raises(AdminAPIException) as e:
|
|
153
|
+
await auth.login(data=AuthData(username='admin', password='wrong_password'), debug=False)
|
|
154
|
+
|
|
155
|
+
context = {'language_context': language_context}
|
|
156
|
+
assert e.value.get_error().model_dump(context=context) == {
|
|
157
|
+
'code': 'user_not_found',
|
|
158
|
+
'field_errors': None,
|
|
159
|
+
'message': None,
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@pytest.mark.asyncio
|
|
164
|
+
async def test_login_invalid_password(sqlite_sessionmaker, language_context):
|
|
119
165
|
auth = sqlalchemy.SQLAlchemyJWTAdminAuthentication(
|
|
120
166
|
secret='123',
|
|
121
167
|
db_async_session=sqlite_sessionmaker,
|
|
@@ -127,4 +173,9 @@ async def test_login_invalid_password(sqlite_sessionmaker):
|
|
|
127
173
|
with pytest.raises(AdminAPIException) as e:
|
|
128
174
|
await auth.login(data=AuthData(username='admin', password='wrong_password'), debug=True)
|
|
129
175
|
|
|
130
|
-
|
|
176
|
+
context = {'language_context': language_context}
|
|
177
|
+
assert e.value.get_error().model_dump(context=context) == {
|
|
178
|
+
'code': 'user_not_found',
|
|
179
|
+
'field_errors': None,
|
|
180
|
+
'message': None,
|
|
181
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/autocomplete.py
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/dashboard.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/settings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/admin_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/dashboard/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/__init__.py
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/admin_action.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/base.py
RENAMED
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields_schema.py
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/table_models.py
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/index-EybvSE2q.js
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/index-wIukkQjw.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/tinymce.min.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/requires.txt
RENAMED
|
File without changes
|
{brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|