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.
Files changed (86) hide show
  1. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/PKG-INFO +1 -1
  2. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/auth.py +9 -3
  3. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/PKG-INFO +1 -1
  4. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/pyproject.toml +1 -1
  5. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_auth.py +56 -5
  6. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/LICENSE +0 -0
  7. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/README.md +0 -0
  8. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/__init__.py +0 -0
  9. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/__init__.py +0 -0
  10. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/routers.py +0 -0
  11. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/utils.py +0 -0
  12. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/__init__.py +0 -0
  13. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/auth.py +0 -0
  14. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/autocomplete.py +0 -0
  15. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/dashboard.py +0 -0
  16. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/index.py +0 -0
  17. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/schema.py +0 -0
  18. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/settings.py +0 -0
  19. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/api/views/table.py +0 -0
  20. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/auth.py +0 -0
  21. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/docs.py +0 -0
  22. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/exceptions.py +0 -0
  23. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/__init__.py +0 -0
  24. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/__init__.py +0 -0
  25. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/autocomplete.py +0 -0
  26. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/fields.py +0 -0
  27. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/fields_schema.py +0 -0
  28. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/__init__.py +0 -0
  29. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/base.py +0 -0
  30. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/create.py +0 -0
  31. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/delete.py +0 -0
  32. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/list.py +0 -0
  33. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/retrieve.py +0 -0
  34. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/integrations/sqlalchemy/table/update.py +0 -0
  35. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/locales/en.yml +0 -0
  36. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/locales/ru.yml +0 -0
  37. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/__init__.py +0 -0
  38. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/admin_schema.py +0 -0
  39. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/category.py +0 -0
  40. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/dashboard/__init__.py +0 -0
  41. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/dashboard/category_dashboard.py +0 -0
  42. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/__init__.py +0 -0
  43. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/admin_action.py +0 -0
  44. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/category_table.py +0 -0
  45. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/__init__.py +0 -0
  46. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/base.py +0 -0
  47. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields/function_field.py +0 -0
  48. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/fields_schema.py +0 -0
  49. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/schema/table/table_models.py +0 -0
  50. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/index-EybvSE2q.js +0 -0
  51. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/index-wIukkQjw.css +0 -0
  52. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-CYDMK1kx.woff2 +0 -0
  53. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-CgCzGbLl.woff +0 -0
  54. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-D3kAzl71.ttf +0 -0
  55. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/materialdesignicons-webfont-DttUABo4.eot +0 -0
  56. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-first/content.min.css +0 -0
  57. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-first/skin.min.css +0 -0
  58. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-slim/content.min.css +0 -0
  59. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/dark-slim/skin.min.css +0 -0
  60. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/img/example.png +0 -0
  61. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/img/tinymce.woff2 +0 -0
  62. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/lightgray/content.min.css +0 -0
  63. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/lightgray/fonts/tinymce.woff +0 -0
  64. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/lightgray/skin.min.css +0 -0
  65. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/accordion/css/accordion.css +0 -0
  66. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/accordion/plugin.js +0 -0
  67. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/codesample/css/prism.css +0 -0
  68. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/customLink/css/link.css +0 -0
  69. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/plugins/customLink/plugin.js +0 -0
  70. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/tinymce/tinymce.min.js +0 -0
  71. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/static/vanilla-picker-B6E6ObS_.js +0 -0
  72. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/templates/index.html +0 -0
  73. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/translations.py +0 -0
  74. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin/utils.py +0 -0
  75. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/SOURCES.txt +0 -0
  76. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/dependency_links.txt +0 -0
  77. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/requires.txt +0 -0
  78. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/brilliance_admin.egg-info/top_level.txt +0 -0
  79. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/setup.cfg +0 -0
  80. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_action.py +0 -0
  81. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_payments_fields_schema.py +0 -0
  82. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_settings.py +0 -0
  83. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_crud.py +0 -0
  84. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_filters.py +0 -0
  85. {brilliance_admin-0.44.16 → brilliance_admin-0.44.17}/tests/test_sqlalcmeny_schema.py +0 -0
  86. {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.16
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: Callable[[UserABC, str], bool] | None = None
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 not self.password_validator(user, data.password):
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 schema.debug else type(e).__name__,
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.16
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.16"
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 test_login_valid_password(sqlite_sessionmaker):
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=lambda user, password: password == 'correct_password',
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'), debug=True)
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 test_login_invalid_password(sqlite_sessionmaker):
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
- assert e.value.get_error().code == 'user_not_found'
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
+ }