brilliance-admin 0.44.15__py3-none-any.whl → 0.44.17__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.
@@ -22,7 +22,7 @@ async def login(request: Request, auth_data: AuthData) -> AuthResult:
22
22
 
23
23
  auth: AdminAuthentication = schema.auth
24
24
  try:
25
- result: AuthResult = await auth.login(auth_data)
25
+ result: AuthResult = await auth.login(auth_data, debug=schema.debug)
26
26
  except AdminAPIException as e:
27
27
  return JSONResponse(e.get_error().model_dump(mode='json', context=context), status_code=e.status_code)
28
28
 
brilliance_admin/auth.py CHANGED
@@ -25,7 +25,7 @@ class AuthResult(BaseModel):
25
25
 
26
26
 
27
27
  class AdminAuthentication(abc.ABC):
28
- async def login(self, data: AuthData) -> AuthResult:
28
+ async def login(self, data: AuthData, debug: bool = False) -> AuthResult:
29
29
  raise NotImplementedError('Login is not implemented')
30
30
 
31
31
  async def authenticate(self, headers: dict) -> UserABC:
@@ -1,3 +1,6 @@
1
+ import inspect
2
+ from typing import Callable
3
+
1
4
  from brilliance_admin.auth import AdminAuthentication, AuthData, AuthResult, UserABC, UserResult
2
5
  from brilliance_admin.exceptions import AdminAPIException, APIError
3
6
  from brilliance_admin.translations import TranslateText as _
@@ -12,11 +15,18 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
12
15
  user_model = None
13
16
  pk_name = None
14
17
 
15
- def __init__(self, secret: str, db_async_session, user_model, pk_name='id'):
18
+ password_validator = None
19
+
20
+ def __init__(self, secret: str, db_async_session, user_model, pk_name='id', password_validator=None):
16
21
  self.pk_name = pk_name
17
22
  self.secret = secret
18
23
  self.db_async_session = db_async_session
19
24
  self.user_model = user_model
25
+ self.password_validator = password_validator
26
+
27
+ if self.password_validator:
28
+ if not callable(self.password_validator):
29
+ raise ValueError("password_validator must be callable")
20
30
 
21
31
  if not isinstance(secret, str) or not secret:
22
32
  raise ValueError("JWT secret must be a non-empty string")
@@ -41,7 +51,7 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
41
51
  msg = f"user_model is missing required columns: {', '.join(sorted(missing))}"
42
52
  raise ValueError(msg)
43
53
 
44
- async def login(self, data: AuthData) -> AuthResult:
54
+ async def login(self, data: AuthData, debug: bool = False) -> AuthResult:
45
55
  # pylint: disable=import-outside-toplevel
46
56
  from sqlalchemy import select
47
57
 
@@ -65,6 +75,24 @@ class SQLAlchemyJWTAdminAuthentication(AdminAuthentication):
65
75
  if not user:
66
76
  raise AdminAPIException(APIError(code="user_not_found"), status_code=401)
67
77
 
78
+ try:
79
+ if self.password_validator:
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:
86
+ raise AdminAPIException(APIError(code="user_not_found"), status_code=401)
87
+
88
+ except AdminAPIException as e:
89
+ raise e
90
+ except Exception as e:
91
+ msg = _('errors.password_exception') % {
92
+ 'error_type': str(e) if debug else type(e).__name__,
93
+ }
94
+ raise AdminAPIException(APIError(message=msg, code="password_exception"), status_code=500) from e
95
+
68
96
  if not user.is_admin:
69
97
  raise AdminAPIException(APIError(code="not_an_admin"), status_code=401)
70
98
 
@@ -11,6 +11,8 @@ errors:
11
11
  db_error_retrieve: 'Ошибка получения записи из базы данных: %(error_type)s'
12
12
  db_error_list: 'Ошибка получения данных таблицы из базы данных: %(error_type)s'
13
13
 
14
+ password_exception: 'Произошла неизвестная ошибка при проверке пароля: %(error_type)s'
15
+
14
16
  connection_refused_error: 'Ошибка подключения к базе данных: %(error)s'
15
17
  filters_exception: 'Произошла неизвестная техническая ошибка при фильтрации данных: %(error_type)s'
16
18
  method_not_allowed: 'Ошибка, данный метод недоступен.'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brilliance-admin
3
- Version: 0.44.15
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,5 +1,5 @@
1
1
  brilliance_admin/__init__.py,sha256=qxGzLVhFNm2FKL2lVt7bEFb6pTPqyXEQvUsDfyfv6SM,183
2
- brilliance_admin/auth.py,sha256=d57XRfLJIbOosLP1-0SCFkePPT8M5WhLcwxu4yW92RA,673
2
+ brilliance_admin/auth.py,sha256=3I844ZF87f-V73LoQf62BY6AqrqoU986_gGJq0X4poo,694
3
3
  brilliance_admin/docs.py,sha256=fKeJKuiCCi1jHRmNcmkuDD6_2di7bwc6-w8V1VCTu0s,1231
4
4
  brilliance_admin/exceptions.py,sha256=CJGvpo7EiaX3RVAEUDpwgH_Tuw8kY7tMy57pVcnBxak,947
5
5
  brilliance_admin/translations.py,sha256=r5xy3Iara_7m2E7rgG8goPFDcKdPLUGAKIWIt6TdulA,3906
@@ -8,7 +8,7 @@ brilliance_admin/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
8
8
  brilliance_admin/api/routers.py,sha256=S8IV7JxA1wLspYn3qxESMI3Qt6UhQK-Gy0PsZi8hcwQ,819
9
9
  brilliance_admin/api/utils.py,sha256=ezvHK49OlpCdT9fLB41Y1nswZDLdzC3zTcQtGtuTYUk,999
10
10
  brilliance_admin/api/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- brilliance_admin/api/views/auth.py,sha256=Qmd9KuFqCeNhQukYl0W62kcUYPMtgMekjkaTvz1AArM,1133
11
+ brilliance_admin/api/views/auth.py,sha256=op52EpxxiE7sUoJPFSQXDd-jZc1ff-ZX4g1qoggEbtg,1153
12
12
  brilliance_admin/api/views/autocomplete.py,sha256=lpFDq46OCuiPhkUedv4y6GmJQVy3iX4P-di_-GMzabY,1516
13
13
  brilliance_admin/api/views/dashboard.py,sha256=tLFdbKrePH-A91HNCN4F_FXdlRQ1tA9D2tGLvzDOoFM,1389
14
14
  brilliance_admin/api/views/index.py,sha256=DkMshrs5zmqpbbF9G2RhqeLGFKMrkrAmQ6nnba7aLl8,1400
@@ -17,7 +17,7 @@ brilliance_admin/api/views/settings.py,sha256=2A9suZQONEtW9LkFban29Fe5ipQaaGT0Cz
17
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
- brilliance_admin/integrations/sqlalchemy/auth.py,sha256=N9CjFfnXmKeNbJBxHMDlbPaTQPmYWlYTz_73PYBkaNk,4931
20
+ brilliance_admin/integrations/sqlalchemy/auth.py,sha256=X8AfmGCV9bZnYk61rGJ6Gcy8NUcHyKn0vXylG2QqylE,6058
21
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
@@ -29,7 +29,7 @@ brilliance_admin/integrations/sqlalchemy/table/list.py,sha256=Y76B5CFqQb2nfV0i0M
29
29
  brilliance_admin/integrations/sqlalchemy/table/retrieve.py,sha256=EKwGH8Mz3Jd-uR43WibD3hFiZVGK_ra_5Cu5XeoEf6Y,3508
30
30
  brilliance_admin/integrations/sqlalchemy/table/update.py,sha256=NxcYPqRZbm_BM-4QHzEbhgAhYSs3SXzYMMzKCalqahU,3800
31
31
  brilliance_admin/locales/en.yml,sha256=YBjkq2Tm0KjXKOMgnIM5etO42Pkm8mDdQlvmpITwsA4,1453
32
- brilliance_admin/locales/ru.yml,sha256=9MKJaJyx6dALP6CQkLQMJvgZdp8nwgnBxDsRZiYhlnc,2052
32
+ brilliance_admin/locales/ru.yml,sha256=__reAnXeIo3KDqiyAxL4xp4rbsclWcYS002sK8iRAps,2185
33
33
  brilliance_admin/schema/__init__.py,sha256=H5UFO5dub_k5id8WdGRVy9G8RnqZuBSjw9XgPafj1VQ,293
34
34
  brilliance_admin/schema/admin_schema.py,sha256=SGdNuYUKrwAc6SA4RYh8TgSrod5RuY7lpXKzmY1SHZ4,6812
35
35
  brilliance_admin/schema/category.py,sha256=UTnUexbCHe9vfwi3ygX34YkLAH2ixfMWqe4H6xos0fI,6604
@@ -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=RKvUZ386hjV5EV09vneHhFY3BrwmMsTsm9wUpPV7D08,1294
69
- brilliance_admin-0.44.15.dist-info/licenses/LICENSE,sha256=rgWE5Cxk53W0PhTOVmcQedABEWN1QMG-PRz3fz531sE,1074
70
- brilliance_admin-0.44.15.dist-info/METADATA,sha256=jISDnNtMIhzWRl1vajRqXeIz7WwhmPy7ZZNZ1YDFrus,7449
71
- brilliance_admin-0.44.15.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
72
- brilliance_admin-0.44.15.dist-info/top_level.txt,sha256=almFFSWrVYieI3i54hYL0fMUaeuIYiazS2Kx4wtK-ns,17
73
- brilliance_admin-0.44.15.dist-info/RECORD,,
69
+ brilliance_admin-0.44.17.dist-info/licenses/LICENSE,sha256=rgWE5Cxk53W0PhTOVmcQedABEWN1QMG-PRz3fz531sE,1074
70
+ brilliance_admin-0.44.17.dist-info/METADATA,sha256=a3esQ7mSIDRVEtH9kYvd9fmCsrtxmYOLf68mh94lhec,7449
71
+ brilliance_admin-0.44.17.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
72
+ brilliance_admin-0.44.17.dist-info/top_level.txt,sha256=almFFSWrVYieI3i54hYL0fMUaeuIYiazS2Kx4wtK-ns,17
73
+ brilliance_admin-0.44.17.dist-info/RECORD,,