arpakitlib 1.8.20__py3-none-any.whl → 1.8.21__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.
Files changed (46) hide show
  1. arpakitlib/_arpakit_project_template_v_5/example.env +1 -3
  2. arpakitlib/_arpakit_project_template_v_5/project/additional_model/common.py +0 -3
  3. arpakitlib/_arpakit_project_template_v_5/project/api/auth.py +59 -20
  4. arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py +1 -5
  5. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py +8 -4
  6. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py +7 -3
  7. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_story_log.py +46 -0
  8. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/main_router.py +12 -1
  9. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py +7 -3
  10. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/reinit_sqlalchemy_db.py +35 -0
  11. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user.py +33 -0
  12. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user_token.py +33 -0
  13. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_errors_info.py +6 -4
  14. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py +11 -1
  15. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/common.py +7 -0
  16. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py +2 -2
  17. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py +2 -2
  18. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py +7 -0
  19. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/{admin → client}/user.py +5 -5
  20. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user_token.py +14 -0
  21. arpakitlib/_arpakit_project_template_v_5/project/core/settings.py +0 -2
  22. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py +13 -3
  23. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +19 -4
  24. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py +1 -1
  25. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py +14 -6
  26. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/const.py +1 -0
  27. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/about.py +1 -1
  28. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/author.py +31 -0
  29. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/support.py +1 -1
  30. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py +4 -3
  31. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py +8 -0
  32. {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/METADATA +1 -1
  33. {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/RECORD +45 -40
  34. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user_token.py +0 -14
  35. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/__init__.py +0 -0
  36. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/error_handler.py +0 -0
  37. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/healthcheck.py +0 -0
  38. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/hello_world.py +0 -0
  39. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_callback_query.py +0 -0
  40. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_inline_query.py +0 -0
  41. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_message.py +0 -0
  42. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/remove_message.py +0 -0
  43. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/start.py +0 -0
  44. {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/LICENSE +0 -0
  45. {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/WHEEL +0 -0
  46. {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/entry_points.txt +0 -0
@@ -11,12 +11,10 @@
11
11
  # api_port=
12
12
  # api_init_sqlalchemy_db=
13
13
  # api_init_json_db=
14
- # api_api_keys=
15
- # api_user_tokens=
14
+ # api_correct_api_keys=
16
15
  # api_enable_sqladmin=
17
16
  # api_start_operation_executor_worker=
18
17
  # api_start_scheduled_operation_creator_worker=
19
- # api_create_story_log_func_before_in_exception_handler=
20
18
  # sqladmin_secret_key=
21
19
  # sqladmin_auth_keys=
22
20
  # sqladmin_port=
@@ -1,8 +1,5 @@
1
- from typing import Any
2
-
3
1
  from pydantic import ConfigDict, BaseModel
4
2
 
5
3
 
6
4
  class BaseAM(BaseModel):
7
5
  model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
8
- additional_data: dict[str, Any] = {}
@@ -1,4 +1,3 @@
1
- import functools
2
1
  from typing import Callable, Any
3
2
 
4
3
  import fastapi
@@ -120,7 +119,9 @@ def api_auth(
120
119
  if get_cached_settings().api_correct_api_keys is None:
121
120
  api_auth_data.is_api_key_correct = None
122
121
  else:
123
- api_auth_data.is_api_key_correct = api_auth_data.api_key_string in get_cached_settings().api_correct_api_keys
122
+ api_auth_data.is_api_key_correct = (
123
+ api_auth_data.api_key_string in get_cached_settings().api_correct_api_keys
124
+ )
124
125
 
125
126
  # api_key_dbm
126
127
 
@@ -133,7 +134,7 @@ def api_auth(
133
134
 
134
135
  # user_token_dbm
135
136
 
136
- if api_auth_data.api_key_string is not None:
137
+ if api_auth_data.user_token_string is not None:
137
138
  if get_cached_sqlalchemy_db() is not None:
138
139
  async with get_cached_sqlalchemy_db().new_async_session() as async_session:
139
140
  api_auth_data.user_token_dbm = await async_session.scalar(
@@ -167,35 +168,36 @@ def api_auth(
167
168
 
168
169
 
169
170
  def require_prod_mode_api_middleware():
170
- @functools.wraps(require_prod_mode_api_middleware)
171
171
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
172
172
  if not get_cached_settings().prod_mode:
173
173
  raise APIException(
174
174
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
175
175
  error_code=APIErrorCodes.cannot_authorize,
176
- error_description=f"prod_mode={get_cached_settings().prod_mode}",
176
+ error_description=f"prod_mode is required, {get_cached_settings().prod_mode=}",
177
177
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
178
178
  )
179
179
 
180
+ func.__name__ = require_prod_mode_api_middleware.__name__
181
+
180
182
  return func
181
183
 
182
184
 
183
185
  def require_not_prod_mode_api_middleware():
184
- @functools.wraps(require_not_prod_mode_api_middleware)
185
186
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
186
187
  if get_cached_settings().prod_mode:
187
188
  raise APIException(
188
189
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
189
190
  error_code=APIErrorCodes.cannot_authorize,
190
- error_description=f"prod_mode={get_cached_settings().prod_mode}",
191
+ error_description=f"not prod_mode is required, {get_cached_settings().prod_mode=}",
191
192
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
192
193
  )
193
194
 
195
+ func.__name__ = require_not_prod_mode_api_middleware.__name__
196
+
194
197
  return func
195
198
 
196
199
 
197
200
  def require_api_key_string_api_middleware():
198
- @functools.wraps(require_api_key_string_api_middleware)
199
201
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
200
202
  if api_auth_data.api_key_string is None:
201
203
  raise APIException(
@@ -205,11 +207,12 @@ def require_api_key_string_api_middleware():
205
207
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
206
208
  )
207
209
 
210
+ func.__name__ = require_api_key_string_api_middleware.__name__
211
+
208
212
  return func
209
213
 
210
214
 
211
215
  def require_user_token_string_api_middleware():
212
- @functools.wraps(require_user_token_string_api_middleware)
213
216
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
214
217
  if api_auth_data.user_token_string is None:
215
218
  raise APIException(
@@ -219,60 +222,96 @@ def require_user_token_string_api_middleware():
219
222
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
220
223
  )
221
224
 
225
+ func.__name__ = require_user_token_string_api_middleware.__name__
226
+
222
227
  return func
223
228
 
224
229
 
225
- def require_correct_api_key_dbm_api_middleware():
226
- @functools.wraps(require_correct_api_key_dbm_api_middleware)
230
+ def require_correct_api_key_api_middleware():
227
231
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
228
232
  if not api_auth_data.is_api_key_correct:
229
233
  raise APIException(
230
234
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
231
235
  error_code=APIErrorCodes.cannot_authorize,
232
- error_description="api_key_string is not correct",
236
+ error_description="correct api_key_string is required",
233
237
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
234
238
  )
235
239
 
240
+ func.__name__ = require_correct_api_key_api_middleware.__name__
241
+
236
242
  return func
237
243
 
238
244
 
239
245
  def require_api_key_dbm_api_middleware(*, require_active: bool = True):
240
- @functools.wraps(require_api_key_dbm_api_middleware)
241
246
  async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
242
247
  if api_auth_data.api_key_dbm is None:
243
248
  raise APIException(
244
249
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
245
250
  error_code=APIErrorCodes.cannot_authorize,
246
- error_description="api_key_dbm is required",
251
+ error_description=f"api_key_dbm is required, {require_active=}",
247
252
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
248
253
  )
249
254
  if require_active and not api_auth_data.api_key_dbm.is_active:
250
255
  raise APIException(
251
256
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
252
257
  error_code=APIErrorCodes.cannot_authorize,
253
- error_description="api_key_dbm is not active",
258
+ error_description=f"api_key_dbm is required, {require_active=}",
254
259
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
255
260
  )
256
261
 
262
+ async_func.__name__ = require_api_key_dbm_api_middleware.__name__
263
+
257
264
  return async_func
258
265
 
259
266
 
260
- def require_user_token_dbm_api_middleware(*, require_active: bool = True):
261
- @functools.wraps(require_user_token_dbm_api_middleware)
267
+ def require_correct_api_key_or_api_key_dbm_api_middleware(*, require_active_api_key_dbm: bool = True):
268
+ async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
269
+ if not api_auth_data.is_api_key_correct and (
270
+ api_auth_data.api_key_dbm is None
271
+ or (require_active_api_key_dbm and not api_auth_data.api_key_dbm.is_active)
272
+ ):
273
+ raise APIException(
274
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
275
+ error_code=APIErrorCodes.cannot_authorize,
276
+ error_description=(
277
+ f"correct api_key is required or api_key_dbm is required, {require_active_api_key_dbm=}"
278
+ ),
279
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
280
+ )
281
+
282
+ async_func.__name__ = require_correct_api_key_or_api_key_dbm_api_middleware.__name__
283
+
284
+ return async_func
285
+
286
+
287
+ def require_user_token_dbm_api_middleware(
288
+ *, require_active_user_token: bool = True,
289
+ require_user_roles: list[str] | None = None
290
+ ):
262
291
  async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
263
292
  if api_auth_data.user_token_dbm is None:
264
293
  raise APIException(
265
294
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
266
295
  error_code=APIErrorCodes.cannot_authorize,
267
- error_description="user_key_dbm is required",
296
+ error_description=f"user_key_dbm is required, {require_active_user_token=}, {require_user_roles=}",
268
297
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
269
298
  )
270
- if require_active and not api_auth_data.user_token_dbm.is_active:
299
+ if require_active_user_token and not api_auth_data.user_token_dbm.is_active:
271
300
  raise APIException(
272
301
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
273
302
  error_code=APIErrorCodes.cannot_authorize,
274
- error_description="user_key_dbm is not active",
303
+ error_description=f"user_key_dbm is required, {require_active_user_token=}, {require_user_roles=}",
275
304
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
276
305
  )
306
+ if require_user_roles is not None:
307
+ if not api_auth_data.user_token_dbm.user.compare_roles(require_user_roles):
308
+ raise APIException(
309
+ status_code=fastapi.status.HTTP_403_FORBIDDEN,
310
+ error_code=APIErrorCodes.cannot_authorize,
311
+ error_description=f"user_key_dbm is required, {require_active_user_token=}, {require_user_roles=}",
312
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
313
+ )
314
+
315
+ async_func.__name__ = require_user_token_dbm_api_middleware.__name__
277
316
 
278
317
  return async_func
@@ -15,7 +15,6 @@ from project.api.const import APIErrorCodes
15
15
  from project.api.exception import APIException
16
16
  from project.api.response import APIJSONResponse
17
17
  from project.api.schema.out.common.error import ErrorCommonSO
18
- from project.core.settings import get_cached_settings
19
18
  from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
20
19
  from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
21
20
 
@@ -236,10 +235,7 @@ def get_exception_handler() -> Callable:
236
235
  funcs_before = []
237
236
  async_funcs_after = []
238
237
 
239
- if (
240
- get_cached_settings().api_create_story_log_func_before_in_api_exception_handler
241
- and get_cached_sqlalchemy_db() is not None
242
- ):
238
+ if get_cached_sqlalchemy_db() is not None:
243
239
  funcs_before.append(
244
240
  create_story_log_func_before_in_api_exception_handler(
245
241
  ignore_api_error_codes=[
@@ -1,10 +1,11 @@
1
1
  import fastapi
2
2
  from fastapi import APIRouter
3
3
 
4
- from project.api.auth import require_user_token_dbm_api_middleware, require_api_key_dbm_api_middleware, APIAuthData, \
5
- api_auth
4
+ from project.api.auth import require_user_token_dbm_api_middleware, APIAuthData, \
5
+ api_auth, require_correct_api_key_or_api_key_dbm_api_middleware
6
6
  from project.api.schema.out.common.error import ErrorCommonSO
7
7
  from project.api.schema.out.common.raw_data import RawDataCommonSO
8
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
8
9
  from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
9
10
 
10
11
  api_router = APIRouter()
@@ -21,8 +22,11 @@ async def _(
21
22
  request: fastapi.requests.Request,
22
23
  response: fastapi.responses.Response,
23
24
  api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
- require_api_key_dbm_api_middleware(require_active=True),
25
- require_user_token_dbm_api_middleware(require_active=True)
25
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
26
+ require_user_token_dbm_api_middleware(
27
+ require_active_user_token=True,
28
+ require_user_roles=[UserDBM.Roles.admin]
29
+ )
26
30
  ]))
27
31
  ):
28
32
  arpakitlib_project_template_data = get_arpakitlib_project_template_info()
@@ -3,9 +3,10 @@ from fastapi import APIRouter
3
3
 
4
4
  from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
5
5
  from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
6
- require_api_key_dbm_api_middleware
6
+ require_correct_api_key_or_api_key_dbm_api_middleware
7
7
  from project.api.schema.out.common.error import ErrorCommonSO
8
8
  from project.api.schema.out.common.raw_data import RawDataCommonSO
9
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
9
10
 
10
11
  api_router = APIRouter()
11
12
 
@@ -21,8 +22,11 @@ async def _(
21
22
  request: fastapi.requests.Request,
22
23
  response: fastapi.responses.Response,
23
24
  api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
- require_api_key_dbm_api_middleware(require_active=True),
25
- require_user_token_dbm_api_middleware(require_active=True)
25
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
26
+ require_user_token_dbm_api_middleware(
27
+ require_active_user_token=True,
28
+ require_user_roles=[UserDBM.Roles.admin]
29
+ )
26
30
  ]))
27
31
  ):
28
32
  return RawDataCommonSO(data=transfer_data_to_json_str_to_data(api_auth_data.model_dump()))
@@ -0,0 +1,46 @@
1
+ import fastapi.requests
2
+ import sqlalchemy
3
+ from fastapi import APIRouter
4
+
5
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
6
+ require_correct_api_key_or_api_key_dbm_api_middleware
7
+ from project.api.schema.out.admin.story_log import StoryLogAdminSO
8
+ from project.api.schema.out.common.error import ErrorCommonSO
9
+ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
10
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM, StoryLogDBM
11
+
12
+ api_router = APIRouter()
13
+
14
+
15
+ @api_router.get(
16
+ "",
17
+ name="Get story log",
18
+ status_code=fastapi.status.HTTP_200_OK,
19
+ response_model=StoryLogAdminSO | None | ErrorCommonSO,
20
+ )
21
+ async def _(
22
+ *,
23
+ request: fastapi.requests.Request,
24
+ response: fastapi.responses.Response,
25
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
26
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
27
+ require_user_token_dbm_api_middleware(
28
+ require_active_user_token=True,
29
+ require_user_roles=[UserDBM.Roles.admin]
30
+ )
31
+ ])),
32
+ filter_id: int | None = fastapi.Query(default=None),
33
+ filter_long_id: str | None = fastapi.Query(default=None),
34
+ ):
35
+ if filter_id is None and filter_long_id is None:
36
+ return None
37
+
38
+ query = sqlalchemy.select(StoryLogDBM)
39
+ if filter_id is not None:
40
+ query = query.filter(StoryLogDBM.id == filter_id)
41
+ if filter_long_id is not None:
42
+ query = query.filter(StoryLogDBM.long_id == filter_long_id)
43
+
44
+ async with get_cached_sqlalchemy_db().new_async_session() as async_session:
45
+ result = await async_session.scalar(query)
46
+ return StoryLogAdminSO.from_dbm(simple_dbm=result)
@@ -1,6 +1,7 @@
1
1
  from fastapi import APIRouter
2
2
 
3
- from project.api.router.admin import get_auth_data, get_arpakitlib_project_template_info, raise_fake_error
3
+ from project.api.router.admin import get_auth_data, get_arpakitlib_project_template_info, raise_fake_error, \
4
+ reinit_sqlalchemy_db, get_story_log
4
5
 
5
6
  main_admin_api_router = APIRouter()
6
7
 
@@ -18,3 +19,13 @@ main_admin_api_router.include_router(
18
19
  router=raise_fake_error.api_router,
19
20
  prefix="/raise_fake_error"
20
21
  )
22
+
23
+ main_admin_api_router.include_router(
24
+ router=reinit_sqlalchemy_db.api_router,
25
+ prefix="/reinit_sqlalchemy_db"
26
+ )
27
+
28
+ main_admin_api_router.include_router(
29
+ router=get_story_log.api_router,
30
+ prefix="/get_story_log"
31
+ )
@@ -2,9 +2,10 @@ import fastapi.requests
2
2
  from fastapi import APIRouter
3
3
 
4
4
  from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
5
- require_api_key_dbm_api_middleware
5
+ require_correct_api_key_or_api_key_dbm_api_middleware
6
6
  from project.api.schema.out.common.error import ErrorCommonSO
7
7
  from project.api.schema.out.common.raw_data import RawDataCommonSO
8
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
8
9
 
9
10
  api_router = APIRouter()
10
11
 
@@ -20,8 +21,11 @@ async def _(
20
21
  request: fastapi.requests.Request,
21
22
  response: fastapi.responses.Response,
22
23
  api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
23
- require_api_key_dbm_api_middleware(require_active=True),
24
- require_user_token_dbm_api_middleware(require_active=True)
24
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
25
+ require_user_token_dbm_api_middleware(
26
+ require_active_user_token=True,
27
+ require_user_roles=[UserDBM.Roles.admin]
28
+ )
25
29
  ]))
26
30
  ):
27
31
  raise Exception("fake error")
@@ -0,0 +1,35 @@
1
+ import fastapi.requests
2
+ from fastapi import APIRouter
3
+
4
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
5
+ require_not_prod_mode_api_middleware, \
6
+ require_correct_api_key_or_api_key_dbm_api_middleware
7
+ from project.api.schema.out.common.error import ErrorCommonSO
8
+ from project.api.schema.out.common.raw_data import RawDataCommonSO
9
+ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
10
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
11
+
12
+ api_router = APIRouter()
13
+
14
+
15
+ @api_router.get(
16
+ path="",
17
+ name="Reinit sqlalchemy db",
18
+ status_code=fastapi.status.HTTP_200_OK,
19
+ response_model=RawDataCommonSO | ErrorCommonSO,
20
+ )
21
+ async def _(
22
+ *,
23
+ request: fastapi.requests.Request,
24
+ response: fastapi.responses.Response,
25
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
26
+ require_not_prod_mode_api_middleware(),
27
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
28
+ require_user_token_dbm_api_middleware(
29
+ require_active_user_token=True,
30
+ require_user_roles=[UserDBM.Roles.admin],
31
+ ),
32
+ ]))
33
+ ):
34
+ get_cached_sqlalchemy_db().reinit()
35
+ return RawDataCommonSO()
@@ -0,0 +1,33 @@
1
+ import fastapi.requests
2
+ from fastapi import APIRouter
3
+
4
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
5
+ require_correct_api_key_or_api_key_dbm_api_middleware
6
+ from project.api.schema.out.client.user import UserClientSO
7
+ from project.api.schema.out.common.error import ErrorCommonSO
8
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
9
+
10
+ api_router = APIRouter()
11
+
12
+
13
+ @api_router.get(
14
+ "",
15
+ name="Get current user",
16
+ status_code=fastapi.status.HTTP_200_OK,
17
+ response_model=UserClientSO | ErrorCommonSO,
18
+ )
19
+ async def _(
20
+ *,
21
+ request: fastapi.requests.Request,
22
+ response: fastapi.responses.Response,
23
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
25
+ require_user_token_dbm_api_middleware(
26
+ require_active_user_token=True,
27
+ require_user_roles=[UserDBM.Roles.client]
28
+ )
29
+ ]))
30
+ ):
31
+ return UserClientSO.from_dbm(
32
+ simple_dbm=api_auth_data.user_token_dbm.user
33
+ )
@@ -0,0 +1,33 @@
1
+ import fastapi.requests
2
+ from fastapi import APIRouter
3
+
4
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
5
+ require_correct_api_key_or_api_key_dbm_api_middleware
6
+ from project.api.schema.out.client.user_token import UserTokenClientSO
7
+ from project.api.schema.out.common.error import ErrorCommonSO
8
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
9
+
10
+ api_router = APIRouter()
11
+
12
+
13
+ @api_router.get(
14
+ "",
15
+ name="Get current user token",
16
+ status_code=fastapi.status.HTTP_200_OK,
17
+ response_model=UserTokenClientSO | ErrorCommonSO,
18
+ )
19
+ async def _(
20
+ *,
21
+ request: fastapi.requests.Request,
22
+ response: fastapi.responses.Response,
23
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
25
+ require_user_token_dbm_api_middleware(
26
+ require_active_user_token=True,
27
+ require_user_roles=[UserDBM.Roles.client]
28
+ )
29
+ ]))
30
+ ):
31
+ return UserTokenClientSO.from_dbm(
32
+ simple_dbm=api_auth_data.user_token_dbm
33
+ )
@@ -1,8 +1,8 @@
1
1
  import fastapi.requests
2
2
  from fastapi import APIRouter
3
3
 
4
- from project.api.auth import APIAuthData, api_auth, require_api_key_dbm_api_middleware, \
5
- require_user_token_dbm_api_middleware
4
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
5
+ require_correct_api_key_or_api_key_dbm_api_middleware
6
6
  from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
7
7
  from project.api.schema.out.common.error import ErrorCommonSO
8
8
  from project.api.schema.out.general.errors_info_general import ErrorsInfoGeneralSO
@@ -21,8 +21,10 @@ async def _(
21
21
  request: fastapi.requests.Request,
22
22
  response: fastapi.responses.Response,
23
23
  api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
- require_api_key_dbm_api_middleware(require_active=True),
25
- require_user_token_dbm_api_middleware(require_active=True)
24
+ require_correct_api_key_or_api_key_dbm_api_middleware(require_active_api_key_dbm=True),
25
+ require_user_token_dbm_api_middleware(
26
+ require_active_user_token=True
27
+ )
26
28
  ]))
27
29
  ):
28
30
  return ErrorsInfoGeneralSO(
@@ -1,6 +1,6 @@
1
1
  from fastapi import APIRouter
2
2
 
3
- from project.api.router.client import get_errors_info
3
+ from project.api.router.client import get_errors_info, get_current_user, get_current_user_token
4
4
 
5
5
  main_client_api_router = APIRouter()
6
6
 
@@ -8,3 +8,13 @@ main_client_api_router.include_router(
8
8
  router=get_errors_info.api_router,
9
9
  prefix="/get_errors_info"
10
10
  )
11
+
12
+ main_client_api_router.include_router(
13
+ router=get_current_user.api_router,
14
+ prefix="/get_current_user"
15
+ )
16
+
17
+ main_client_api_router.include_router(
18
+ router=get_current_user_token.api_router,
19
+ prefix="/get_current_user_token"
20
+ )
@@ -1,6 +1,9 @@
1
+ from __future__ import annotations
2
+
1
3
  import datetime as dt
2
4
 
3
5
  from project.api.schema.common import BaseSO
6
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
4
7
 
5
8
 
6
9
  class SimpleDBMAdminSO(BaseSO):
@@ -8,3 +11,7 @@ class SimpleDBMAdminSO(BaseSO):
8
11
  long_id: str
9
12
  slug: str | None
10
13
  creation_dt: dt.datetime
14
+
15
+ @classmethod
16
+ def from_dbm(cls, *, simple_dbm: SimpleDBM) -> SimpleDBMAdminSO:
17
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
@@ -19,5 +19,5 @@ class OperationAdminSO(SimpleDBMAdminSO):
19
19
  duration_total_seconds: float | None
20
20
 
21
21
  @classmethod
22
- def from_operation_dbm(cls, *, operation_dbm: OperationDBM) -> OperationAdminSO:
23
- return cls.model_validate(operation_dbm.simple_dict_with_sd_properties())
22
+ def from_dbm(cls, *, simple_dbm: OperationDBM) -> OperationAdminSO:
23
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
@@ -13,5 +13,5 @@ class StoryLogAdminSO(SimpleDBMAdminSO):
13
13
  data: dict[str, Any]
14
14
 
15
15
  @classmethod
16
- def from_story_log_dbm(cls, *, story_log_dbm: StoryLogDBM) -> StoryLogAdminSO:
17
- return cls.model_validate(story_log_dbm.simple_dict_with_sd_properties())
16
+ def from_dbm(cls, *, simple_dbm: StoryLogDBM) -> StoryLogAdminSO:
17
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
@@ -1,6 +1,9 @@
1
+ from __future__ import annotations
2
+
1
3
  import datetime as dt
2
4
 
3
5
  from project.api.schema.common import BaseSO
6
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
4
7
 
5
8
 
6
9
  class SimpleDBMClientSO(BaseSO):
@@ -8,3 +11,7 @@ class SimpleDBMClientSO(BaseSO):
8
11
  long_id: str
9
12
  slug: str | None
10
13
  creation_dt: dt.datetime
14
+
15
+ @classmethod
16
+ def from_dbm(cls, *, simple_dbm: SimpleDBM) -> SimpleDBMClientSO:
17
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
@@ -3,12 +3,12 @@ from __future__ import annotations
3
3
  import datetime as dt
4
4
  from typing import Any
5
5
 
6
- from project.api.schema.out.admin.common import SimpleDBMAdminSO
6
+ from project.api.schema.out.client.common import SimpleDBMClientSO
7
7
  from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
8
8
 
9
9
 
10
- class UserDBMSAdminSO(SimpleDBMAdminSO):
11
- mail: str | None
10
+ class UserClientSO(SimpleDBMClientSO):
11
+ email: str | None
12
12
  roles: list[str]
13
13
  is_active: bool
14
14
  tg_id: int | None
@@ -18,5 +18,5 @@ class UserDBMSAdminSO(SimpleDBMAdminSO):
18
18
  roles_has_client: bool
19
19
 
20
20
  @classmethod
21
- def from_user_dbm(cls, *, user_dbm: UserDBM) -> UserDBMSAdminSO:
22
- return cls.model_validate(user_dbm.simple_dict_with_sd_properties())
21
+ def from_dbm(cls, *, simple_dbm: UserDBM) -> UserClientSO:
22
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from project.api.schema.out.client.common import SimpleDBMClientSO
4
+ from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM
5
+
6
+
7
+ class UserTokenClientSO(SimpleDBMClientSO):
8
+ value: str
9
+ user_id: int
10
+ is_active: bool
11
+
12
+ @classmethod
13
+ def from_dbm(cls, *, simple_dbm: UserTokenDBM) -> UserTokenClientSO:
14
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
@@ -104,8 +104,6 @@ class Settings(SimpleSettings):
104
104
 
105
105
  api_start_scheduled_operation_creator_worker: bool = False
106
106
 
107
- api_create_story_log_func_before_in_api_exception_handler: bool = False
108
-
109
107
  sqladmin_secret_key: str | None = "85a9583cb91c4de7a78d7eb1e5306a04418c9c43014c447ea8ec8dd5deb4cf71"
110
108
 
111
109
  sqladmin_auth_keys: list[str] | None = ["1"]
@@ -34,9 +34,19 @@ class OperationDBM(SimpleDBM):
34
34
  type: Mapped[str] = mapped_column(
35
35
  sqlalchemy.TEXT, index=True, insert_default=Types.healthcheck_, nullable=False
36
36
  )
37
- title: Mapped[str | None] = mapped_column(sqlalchemy.TEXT, insert_default=None, nullable=True)
38
- execution_start_dt: Mapped[datetime | None] = mapped_column(sqlalchemy.TIMESTAMP(timezone=True), nullable=True)
39
- execution_finish_dt: Mapped[datetime | None] = mapped_column(sqlalchemy.TIMESTAMP(timezone=True), nullable=True)
37
+ title: Mapped[str | None] = mapped_column(
38
+ sqlalchemy.TEXT,
39
+ insert_default=None,
40
+ nullable=True
41
+ )
42
+ execution_start_dt: Mapped[datetime | None] = mapped_column(
43
+ sqlalchemy.TIMESTAMP(timezone=True),
44
+ nullable=True
45
+ )
46
+ execution_finish_dt: Mapped[datetime | None] = mapped_column(
47
+ sqlalchemy.TIMESTAMP(timezone=True),
48
+ nullable=True
49
+ )
40
50
  input_data: Mapped[dict[str, Any]] = mapped_column(
41
51
  postgresql.JSON,
42
52
  insert_default={},
@@ -27,12 +27,27 @@ class StoryLogDBM(SimpleDBM):
27
27
  error_in_tg_bot = "error_in_tg_bot"
28
28
 
29
29
  level: Mapped[str] = mapped_column(
30
- sqlalchemy.TEXT, insert_default=Levels.info, server_default=Levels.info, index=True, nullable=False
30
+ sqlalchemy.TEXT,
31
+ insert_default=Levels.info,
32
+ server_default=Levels.info,
33
+ index=True,
34
+ nullable=False
35
+ )
36
+ type: Mapped[str | None] = mapped_column(
37
+ sqlalchemy.TEXT,
38
+ index=True,
39
+ insert_default=None,
40
+ nullable=True)
41
+ title: Mapped[str | None] = mapped_column(
42
+ sqlalchemy.TEXT,
43
+ insert_default=None,
44
+ nullable=True
31
45
  )
32
- type: Mapped[str | None] = mapped_column(sqlalchemy.TEXT, index=True, insert_default=None, nullable=True)
33
- title: Mapped[str | None] = mapped_column(sqlalchemy.TEXT, insert_default=None, nullable=True)
34
46
  data: Mapped[dict[str, Any]] = mapped_column(
35
- postgresql.JSON, insert_default={}, server_default="{}", nullable=False
47
+ postgresql.JSON,
48
+ insert_default={},
49
+ server_default="{}",
50
+ nullable=False
36
51
  )
37
52
 
38
53
 
@@ -21,7 +21,7 @@ class UserDBM(SimpleDBM):
21
21
  admin = "admin"
22
22
  client = "client"
23
23
 
24
- mail: Mapped[str | None] = mapped_column(
24
+ email: Mapped[str | None] = mapped_column(
25
25
  sqlalchemy.TEXT,
26
26
  index=True,
27
27
  insert_default=None,
@@ -10,7 +10,8 @@ class ClientTgBotBlank(SimpleBlankTgBot):
10
10
  def command_to_desc(self) -> dict[str, str]:
11
11
  return {
12
12
  ClientTgBotCommands.start: emojize(":waving_hand: Начать"),
13
- ClientTgBotCommands.about: emojize(":information: О проекте")
13
+ ClientTgBotCommands.about: emojize(":information: О проекте"),
14
+ ClientTgBotCommands.author: emojize(":bust_in_silhouette: Авторы"),
14
15
  }
15
16
 
16
17
  def but_hello_world(self) -> str:
@@ -31,24 +32,31 @@ class ClientTgBotBlank(SimpleBlankTgBot):
31
32
  res = "healthcheck"
32
33
  return emojize(res.strip())
33
34
 
35
+ def author(self) -> str:
36
+ res = "<b>ARPAKIT Company</b>"
37
+ res += "\n\n<i>Мы создаём качественные IT продукты<i>"
38
+ res += "\n\n:link: https://arpakit.com/"
39
+ res += "\n\n:e-mail: support@arpakit.com"
40
+ return emojize(res.strip())
41
+
34
42
  def welcome(self) -> str:
35
43
  res = ":waving_hand: <b>Welcome</b> :waving_hand:"
36
44
  return emojize(res.strip())
37
45
 
38
46
  def raw_message(self) -> str:
39
- res = ":warning: <b>Сообщние не обработано</b> :warning:"
47
+ res = ":warning: <b>Сообщение не обработано</b> :warning:"
40
48
  return emojize(res.strip())
41
49
 
42
- def about_project(self) -> str:
50
+ def about(self) -> str:
43
51
  res = ":information: <b>О проекте</b>"
44
52
  return emojize(res.strip())
45
53
 
46
- def support_info(self) -> str:
54
+ def support(self) -> str:
47
55
  res = ":red_heart: <b>Поддержка</b>"
48
56
  return emojize(res.strip())
49
57
 
50
58
  def keyboard_is_old(self) -> str:
51
- res = ":information: Данная клавиатура устарела :information:"
59
+ res = ":information: Эта клавиатура устарела :information:"
52
60
  return emojize(res.strip())
53
61
 
54
62
 
@@ -62,7 +70,7 @@ def get_cached_client_tg_bot_blank() -> ClientTgBotBlank:
62
70
 
63
71
 
64
72
  def __example():
65
- print(get_cached_client_tg_bot_blank().welcome())
73
+ print(get_cached_client_tg_bot_blank().author())
66
74
 
67
75
 
68
76
  if __name__ == '__main__':
@@ -4,6 +4,7 @@ from arpakitlib.ar_enumeration_util import Enumeration
4
4
  class ClientTgBotCommands(Enumeration):
5
5
  start = "start"
6
6
  about = "about"
7
+ author = "author"
7
8
  support = "support"
8
9
  healthcheck = "healthcheck"
9
10
  hello_world = "hello_world"
@@ -27,4 +27,4 @@ async def _(
27
27
  middleware_data_tg_bot: MiddlewareDataTgBot,
28
28
  **kwargs
29
29
  ):
30
- await m.answer(text=get_cached_client_tg_bot_blank().about_project())
30
+ await m.answer(text=get_cached_client_tg_bot_blank().about())
@@ -0,0 +1,31 @@
1
+ import logging
2
+
3
+ import aiogram
4
+ from aiogram import Router
5
+ from aiogram.filters import Command, or_f
6
+
7
+ from project.tg_bot.blank.client import get_cached_client_tg_bot_blank
8
+ from project.tg_bot.const import ClientTgBotCommands
9
+ from project.tg_bot.filter_.message_text import MessageTextTgBotFilter
10
+ from project.tg_bot.middleware.common import MiddlewareDataTgBot
11
+
12
+ tg_bot_router = Router()
13
+ _logger = logging.getLogger(__name__)
14
+
15
+
16
+ @tg_bot_router.message(
17
+ or_f(
18
+ Command(ClientTgBotCommands.author),
19
+ MessageTextTgBotFilter([
20
+ ClientTgBotCommands.about,
21
+ "автор",
22
+ "авторы"
23
+ ], ignore_case=True)
24
+ )
25
+ )
26
+ async def _(
27
+ m: aiogram.types.Message,
28
+ middleware_data_tg_bot: MiddlewareDataTgBot,
29
+ **kwargs
30
+ ):
31
+ await m.answer(text=get_cached_client_tg_bot_blank().author())
@@ -27,4 +27,4 @@ async def _(
27
27
  middleware_data_tg_bot: MiddlewareDataTgBot,
28
28
  **kwargs
29
29
  ):
30
- await m.answer(text=get_cached_client_tg_bot_blank().support_info())
30
+ await m.answer(text=get_cached_client_tg_bot_blank().support())
@@ -3,8 +3,8 @@ from aiogram import Router
3
3
  from project.tg_bot.router.admin import reinit_sqlalchemy_db, arpakitlib_project_template_info, raise_fake_error, me, \
4
4
  log_file, clear_log_file, set_tg_bot_commands, init_sqlalchemy_db, drop_sqlalchemy_db, kb_with_remove_message, \
5
5
  kb_with_old_cd, kb_with_raise_error, kb_with_not_modified
6
- from project.tg_bot.router.client import remove_message, start, about, healthcheck, hello_world, \
7
- support, error_handler, raw_callback_query, raw_message, raw_inline_query
6
+ from project.tg_bot.router.general import remove_message, start, about, healthcheck, hello_world, \
7
+ support, error_handler, raw_callback_query, raw_message, raw_inline_query, author
8
8
 
9
9
  main_tg_bot_router = Router()
10
10
 
@@ -23,7 +23,7 @@ main_tg_bot_router.include_router(router=kb_with_old_cd.tg_bot_router)
23
23
  main_tg_bot_router.include_router(router=kb_with_raise_error.tg_bot_router)
24
24
  main_tg_bot_router.include_router(router=kb_with_not_modified.tg_bot_router)
25
25
 
26
- # client
26
+ # general
27
27
  main_tg_bot_router.include_router(router=error_handler.tg_bot_router)
28
28
  main_tg_bot_router.include_router(router=remove_message.tg_bot_router)
29
29
  main_tg_bot_router.include_router(router=start.tg_bot_router)
@@ -31,6 +31,7 @@ main_tg_bot_router.include_router(router=about.tg_bot_router)
31
31
  main_tg_bot_router.include_router(router=healthcheck.tg_bot_router)
32
32
  main_tg_bot_router.include_router(router=hello_world.tg_bot_router)
33
33
  main_tg_bot_router.include_router(router=support.tg_bot_router)
34
+ main_tg_bot_router.include_router(router=author.tg_bot_router)
34
35
  main_tg_bot_router.include_router(router=raw_message.tg_bot_router)
35
36
  main_tg_bot_router.include_router(router=raw_inline_query.tg_bot_router)
36
37
  main_tg_bot_router.include_router(router=raw_callback_query.tg_bot_router)
@@ -37,7 +37,15 @@ def get_client_tg_bot_commands_to_set() -> list[BotCommand]:
37
37
  get_cached_client_tg_bot_blank().command_to_desc().get(ClientTgBotCommands.support),
38
38
  ClientTgBotCommands.support
39
39
  )
40
+ ),
41
+ BotCommand(
42
+ command=ClientTgBotCommands.author,
43
+ description=return_str_if_none(
44
+ get_cached_client_tg_bot_blank().command_to_desc().get(ClientTgBotCommands.author),
45
+ ClientTgBotCommands.author
46
+ )
40
47
  )
48
+
41
49
  ]
42
50
  return res
43
51
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.20
3
+ Version: 1.8.21
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -67,7 +67,7 @@ arpakitlib/_arpakit_project_template_v_5/command/start_sqladmin_for_prod.py,sha2
67
67
  arpakitlib/_arpakit_project_template_v_5/command/start_sqladmin_with_reload.py,sha256=KmbadM6bmsQfP23xTn8aBzlvCQ1J2rLAuFk0_RCChjs,374
68
68
  arpakitlib/_arpakit_project_template_v_5/command/start_tg_bot.py,sha256=AJ1AxfdpbayBhScy6yAPVkSWnHJjzOTHxEewwGKaJMQ,200
69
69
  arpakitlib/_arpakit_project_template_v_5/command/start_tg_bot_for_prod.py,sha256=AJ1AxfdpbayBhScy6yAPVkSWnHJjzOTHxEewwGKaJMQ,200
70
- arpakitlib/_arpakit_project_template_v_5/example.env,sha256=HFoVmA3rvPv7rl1W7kRfxHGGiM2lA6h9zFz4fhXm6Kc,1082
70
+ arpakitlib/_arpakit_project_template_v_5/example.env,sha256=8fsl0G7qVRmjRGXbafXwuQOlxTX1pU0-He77KC6pGeE,1014
71
71
  arpakitlib/_arpakit_project_template_v_5/note/note_1.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  arpakitlib/_arpakit_project_template_v_5/note/note_2.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  arpakitlib/_arpakit_project_template_v_5/note/note_3.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -75,26 +75,30 @@ arpakitlib/_arpakit_project_template_v_5/note/note_4.txt,sha256=47DEQpj8HBSa-_TI
75
75
  arpakitlib/_arpakit_project_template_v_5/note/note_5.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  arpakitlib/_arpakit_project_template_v_5/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  arpakitlib/_arpakit_project_template_v_5/project/additional_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- arpakitlib/_arpakit_project_template_v_5/project/additional_model/common.py,sha256=XuVbWeesA5fxD0dFPDW8D7NAk0w4RyD5jXPwGOSFchg,233
78
+ arpakitlib/_arpakit_project_template_v_5/project/additional_model/common.py,sha256=BRz-B699ZY52DfUD6kmhpuThBWpPzpZpD0QXIjlkwC8,168
79
79
  arpakitlib/_arpakit_project_template_v_5/project/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  arpakitlib/_arpakit_project_template_v_5/project/api/asgi.py,sha256=ES3YGwNxWUHVyD6e2ii6QkvTyB-vlVmr8_PhfVIXQ4Y,78
81
- arpakitlib/_arpakit_project_template_v_5/project/api/auth.py,sha256=wuiwenDuQ6NFmYbBcui8RJ3Wzgqz85S5Rpnc5ObrZuM,12096
81
+ arpakitlib/_arpakit_project_template_v_5/project/api/auth.py,sha256=2UwEB5dcSERsVIjRYaK4dUtFcl7SLzszBVTz0awIIqo,13921
82
82
  arpakitlib/_arpakit_project_template_v_5/project/api/const.py,sha256=J9bqaRRiIc3RLn6SJTvdfDvFrSsM_Ixii9t2M8dA5Jc,433
83
83
  arpakitlib/_arpakit_project_template_v_5/project/api/create_api_app.py,sha256=-taA-OJ69donUlCUIl4tNxjHjRGnjwXl796lThef-uA,2284
84
84
  arpakitlib/_arpakit_project_template_v_5/project/api/event.py,sha256=xKfJ3UnOx_g1s7KNZjWRp0eZbVRTsSlyJhT3wkfwT6k,2414
85
85
  arpakitlib/_arpakit_project_template_v_5/project/api/exception.py,sha256=cNZaI2DacGLl8Hyn1qIfFpVjvQzOQjwXWsVW4auBrCo,1280
86
- arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py,sha256=BZ5myTNgruU7q92cM7832PaB4qHa8ooGcZS6CmSaqnQ,11295
86
+ arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py,sha256=Uyt0gB_8QnMFcZuNoUaEiAAJEjziWQpsXY1OM36e3YU,11125
87
87
  arpakitlib/_arpakit_project_template_v_5/project/api/openapi_ui.py,sha256=PLhH-W6zDViO-75AGCs8Vq3IoyHChdqwBYAqLvdQN0U,904
88
88
  arpakitlib/_arpakit_project_template_v_5/project/api/response.py,sha256=xZMymP2BuQaRNVWLeIp3UgUUo-MFN8MJnsn9Al4vOb8,1028
89
89
  arpakitlib/_arpakit_project_template_v_5/project/api/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
90
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py,sha256=uN2yJN8NpncyvIOc-D6s9nxftDpA5XwP9ZC6wqI9FZw,1084
92
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py,sha256=SWh7P4-D1LSTS0anBEbIxnQI6OV9nymBlqFV5P8h8j4,1007
93
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/main_router.py,sha256=wzlJlKxj-hontW8ckuyqpQvzRKs0clpSAuwpXpFiaAQ,545
94
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py,sha256=DNRWLRCmGoqqdjnm_zjJmFkClwyEzxpZJTT74vH_TrQ,879
91
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py,sha256=VSnyxswDMrD4MEhLK77hrm4UYNHerzBV-92ASgEOqis,1293
92
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py,sha256=F_nqzPr2q6ssDv3RNqyn8CyRQBJ89rzpOHrgjkNYS8I,1216
93
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_story_log.py,sha256=DUSPKlXhITe5Ah5gq4d7dAls5H_K42AHj6pLSMZJ6RM,1785
94
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/main_router.py,sha256=dYjl8mrxCmQjTinqvimowzgYbLm_zAtYLYNWyvI3y10,814
95
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py,sha256=I8g9PeguugvBZYrC4gzLtPBBoJw7U8joxYFmwqFW0mE,1088
96
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/reinit_sqlalchemy_db.py,sha256=IfjKMlDwkEt_fRcYxjCDZT1rYdpUXUhSoL4VyYTZzSA,1299
95
97
  arpakitlib/_arpakit_project_template_v_5/project/api/router/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_errors_info.py,sha256=uG5skKLpYbrXAlHu8MO8pjIHI9dIvYaL8kfTPW4iEIU,1101
97
- arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py,sha256=MFYUoxo0lal7__1B7wf1NT5RhJfVtK5rqp7SYix6AaY,234
98
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user.py,sha256=q-ViMaj6dv09qYegh9ApbT1_tKFqqL-HlpvxCbeZWVw,1133
99
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user_token.py,sha256=9EsbkMg1nmTPyVbkb847DOo-HkFTZUpySeTOnVmqMbA,1155
100
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_errors_info.py,sha256=55khAkCurF5DLhkFXDpb85ex5PULOLag9Z5EezMpUEs,1192
101
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py,sha256=S20kGyWjfPS0Ue1s8tpAqQsQlJ63m3uSSiOgKkHOuNk,514
98
102
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
103
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/healthcheck.py,sha256=xQNMi81IaroNE2H3LvYNUYV6X1dcGSeS2kAUSvGEcWA,523
100
104
  arpakitlib/_arpakit_project_template_v_5/project/api/router/general/main_router.py,sha256=OPKujYKPInDozmfZrffQnMGtdwyxMBQv1k2f-LttMDY,356
@@ -112,13 +116,13 @@ arpakitlib/_arpakit_project_template_v_5/project/api/schema/in_/general/__init__
112
116
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/in_/general/common.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
117
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
118
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/common.py,sha256=i_qLlACMT7XKB4liOEG1PTYkGIL0IDNHoP2Ioh_Xugw,181
116
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py,sha256=SrRo1HqugMGDYnc0NUTzHzoMfNdtRzd1EleejURsx_M,715
117
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py,sha256=GQ5EDbYCDByKVwSJpdfLLULWvjUUhE3vo5c2FdK0HBY,498
118
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user.py,sha256=W0g6qHEKqPa4CJvmhzyfUiLzqXLjtTR3OC07UhfdkZc,632
119
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user_token.py,sha256=w7LL2q58aG7zgVDW1D_lUhg4zCJLqJcfXQX4geHSPXw,446
119
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/common.py,sha256=b0s5VdLcH-sBvD9WFaVg-cek299ItBH8W0xn7JWaV78,445
120
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py,sha256=8oPqCofV5KJMB6JB-Cozi_5l-2t8EPSvfossT0wIZBM,699
121
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py,sha256=EenBUvs9qENEGuCpZrBRSd4TNVjR-ER55g44QGPLAzY,482
120
122
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py,sha256=hi0ybvowgARVEQaD0V8JYxUM5f4gqaJ6U7FlLQCxABE,182
123
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py,sha256=cm7FAsZf5GlGAcR_w0tr2fR9gUMNcY--ifqE-BuFGpU,447
124
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user.py,sha256=S93SizBPg5evgycr3Y_AF0Ds0M5gvO2o_W2VsDZXFeY,629
125
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user_token.py,sha256=XRUs3ieMDZGGnMMst-QXptBWXqBL-qPQa25NJVbSI9I,436
122
126
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
127
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/common/datetime_.py,sha256=YFo29Qc7JMVq-OR398kPy4ypjh9kYAxPuZZUsobhDdc,942
124
128
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/common/error.py,sha256=C8oaHotxmxBnN7Lr1qT7T5Mk0SIU2Ha7_tPDpgiR6M8,286
@@ -138,7 +142,7 @@ arpakitlib/_arpakit_project_template_v_5/project/core/const.py,sha256=hgiiPIYL95
138
142
  arpakitlib/_arpakit_project_template_v_5/project/core/dump_file_storage_in_dir.py,sha256=u3-vStMGaseMsRLuJmQK04UDhaez9vw6o5jyHb1fwNg,617
139
143
  arpakitlib/_arpakit_project_template_v_5/project/core/jinja2_templates.py,sha256=jCNLaBauGC7YNvZdTLNHuPp7hmRGt94O23Skg6ewo7o,352
140
144
  arpakitlib/_arpakit_project_template_v_5/project/core/media_file_storage_in_dir.py,sha256=fMofTsfJtA8pp5lEUhucEUu3PBsmj-elaRZzExDsdLI,623
141
- arpakitlib/_arpakit_project_template_v_5/project/core/settings.py,sha256=jGZSy5VNfYaoq3tiUywHV8Nlx1_Vsw2Fml22bc3UUiQ,5905
145
+ arpakitlib/_arpakit_project_template_v_5/project/core/settings.py,sha256=UR9EM_Fw2WfVRACwrZTkJMMA5IV2YYiWa87qi_IcMvg,5828
142
146
  arpakitlib/_arpakit_project_template_v_5/project/core/util.py,sha256=1ha9UrguVPsTSjoMHhVZVCD0_mNBfhIDGEvcG1nA4Zw,667
143
147
  arpakitlib/_arpakit_project_template_v_5/project/json_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
148
  arpakitlib/_arpakit_project_template_v_5/project/json_db/json_db.py,sha256=tBML-z4Y7uY8f_0ggcxvlDNt15Sf93Jr_OUeHwWxqOA,724
@@ -205,9 +209,9 @@ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_db.py
205
209
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py,sha256=btSjCQ7RJqomeXzYs9HePCu1dZHs0z6-RuboYKG89_8,598
206
210
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py,sha256=a-xSHsnE8EkiH9g1ZoxaQQ7Y7q0urIm3SynlGYiSE8E,1038
207
211
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=yK0fFdRYZUpjWl8Vq9S9DKMLBkj9ZT9TXhGyPuR6asU,1876
208
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py,sha256=ZyK6jRVYM7K_ze2LDaYBwqTP6MkTFjtQMTD-HroX0jg,3293
209
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=MyXra-PNFrqe9FOjXnDXNYkzX8_A9pbj2uhk1GTPFJ8,1264
210
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=HwFXmlQD9IIFYwGh5wvp0W1RaKqg2nWtjgLFTIsw5ww,2353
212
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py,sha256=4jahuEqTD7OgIDB1TDVDb7occhgid_TLpEBtbi8vu2E,3367
213
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=Hm6DTPAvK9f1WgIvBXBO00DAeienEXr3CZIVG_Odrfg,1383
214
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=lCgNR-SLUL6JN-Q1pstxGKF0PiSTKTWGzWANF5u9u7o,2354
211
215
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user_token.py,sha256=9yGVRC4Ns1TgM7IOaZvbQWuiLYpxDTQKzitokpCGRoQ,1013
212
216
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/util.py,sha256=QSA_nT6aWdtE412-Uj3VTd7yh3dzS4HugDK9FivjTPo,570
213
217
  arpakitlib/_arpakit_project_template_v_5/project/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -220,13 +224,13 @@ arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_data_5.py,s
220
224
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
225
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
222
226
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/admin.py,sha256=RG9YRcOJAkS3Z4VNEnwyTnKj8Xb65gCZWta7NdGdxvU,1008
223
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py,sha256=5icJT6y1kblwtZod29GslLqSSfkxhArQrrrVzAX9fZ4,2112
227
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py,sha256=vWd7GgXBMcBlLtkJByVSfX_NVSUUM6KUAeynUBySTV0,2477
224
228
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/common.py,sha256=HjJnKLQAdHtLLM73wURiFR2zzJEvkypVg0pMsKu5mKs,93
225
229
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/callback/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
230
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/callback/admin.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
231
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/callback/client.py,sha256=8eJAc0mq8bX6BbP0eWY4NYToFOFSUXB-nujBmTlQF-k,157
228
232
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/callback/common.py,sha256=FhSQLjdR-XArdorqG9RxsCjgQv_RyWbFZFHM52Sar-4,1023
229
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/const.py,sha256=faClxsyUT2c02IN74ymLcxvjPo8sFE46X4GPSEqnSy4,1134
233
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/const.py,sha256=tdPNjFQFv5_zcZs_dSVvRs7oXR-xPCaE-165tWzSY9A,1156
230
234
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/event.py,sha256=9BkUt4qsNUT3_AnTKBUTen0G2-L1872XKriQKS_hIxk,3628
231
235
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/filter_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
236
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/filter_/is_private_chat.py,sha256=2anQo68KqkNYQnfIZDXSOX0P9hU59oSSSIJ36bWQdo8,500
@@ -269,25 +273,26 @@ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/me.py,sha25
269
273
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/raise_fake_error.py,sha256=UBSrDdf0E6Gss9xWmChVnfCGf7M-hZ2Pq7usSzMz9mU,835
270
274
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/reinit_sqlalchemy_db.py,sha256=x2Er6OZd0ymLvyMxqMfPVoSf62QpNh0mPcrYxB2wyGE,1193
271
275
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/set_tg_bot_commands.py,sha256=Agdjw1qjcT6l0K-k_AVrgGvLGEY5Jh9fQX66wLwJRVM,981
272
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
273
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/about.py,sha256=IChQLcuMI5hE-tmeN8PbPqZtYErX7WIddJl86hsc30I,841
274
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/error_handler.py,sha256=DRPh_kiqXvDkKKWqxpyFDEAnYt6UE9san7ku99GJgzA,3221
275
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/healthcheck.py,sha256=l-M6Oc15o9EQ0M3dTsPcVQIrnVLj5j0adMRUBdnb5r4,529
276
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/hello_world.py,sha256=NjQpD2Q4hUZvqogZOWDWkNo9C9bNWUO6mGEZLJKUW7U,1584
277
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_callback_query.py,sha256=s4jVTZ6k_syYbXdixKnwgj5wHeARP4QD96_sLmBy1vc,792
278
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_inline_query.py,sha256=77LZnmvTtBgIqhJmLV1k_1IUKcm66uW_lLzFV8oi930,289
279
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_message.py,sha256=rdLdF9ML7ezM9V6sy9j67JX-ffpny2nFViBB5thKTa8,413
280
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/remove_message.py,sha256=nYS-Q7ZqVCcHw4oClOzG9w86exbCWcInZc9vF_KfMcw,703
281
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/start.py,sha256=EFAZMbd3CVri_E4gt-B544CSrBBBAsKYVaCslxAfwCs,914
282
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/support.py,sha256=d_KsuAzZz04oq8K3k4SO0pabcSLBYYKHF-6VbI3mgiI,844
283
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py,sha256=jjJBU8-e2BIQSjWSOapN0GqQ6u_t1-erz9f7kKDDqlc,2198
276
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/about.py,sha256=R4nAcXU37mwW0WS9Je-Z4NHuYwOUGQWNDQNZOepT5Bg,833
278
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/author.py,sha256=e-K1y5CGJRoPMPgMJEuMi-irQ8Ka_uuNtBFLPibgywU,855
279
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/error_handler.py,sha256=DRPh_kiqXvDkKKWqxpyFDEAnYt6UE9san7ku99GJgzA,3221
280
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/healthcheck.py,sha256=l-M6Oc15o9EQ0M3dTsPcVQIrnVLj5j0adMRUBdnb5r4,529
281
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/hello_world.py,sha256=NjQpD2Q4hUZvqogZOWDWkNo9C9bNWUO6mGEZLJKUW7U,1584
282
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/raw_callback_query.py,sha256=s4jVTZ6k_syYbXdixKnwgj5wHeARP4QD96_sLmBy1vc,792
283
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/raw_inline_query.py,sha256=77LZnmvTtBgIqhJmLV1k_1IUKcm66uW_lLzFV8oi930,289
284
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/raw_message.py,sha256=rdLdF9ML7ezM9V6sy9j67JX-ffpny2nFViBB5thKTa8,413
285
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/remove_message.py,sha256=nYS-Q7ZqVCcHw4oClOzG9w86exbCWcInZc9vF_KfMcw,703
286
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/start.py,sha256=EFAZMbd3CVri_E4gt-B544CSrBBBAsKYVaCslxAfwCs,914
287
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/support.py,sha256=DuJ1QcPuK-rRz8BFErYOaT_Z74NclsvrdmryQL9bmCA,839
288
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py,sha256=nz94jcuZ0rmjGt6NuUXY7bD_cL2SMD0vdjuompd2KK4,2271
284
289
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/start_tg_bot.py,sha256=vHARWETCD4hlK624aFxnkjsytgEbZY20bt973Oc_Peo,1253
285
290
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/tg_bot.py,sha256=jMX_awQl3GvyKZ8pmR0dQOzg_2LyrYTmn31DAVmOxxs,849
286
291
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/tg_bot_dispatcher.py,sha256=CUTYSiVEQrOcOe1pTl8BAHZIDIqurwVQEy0zCmab8Z8,660
287
292
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
288
293
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/etc.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
294
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/notify_admins.py,sha256=Qoqa45bbTYCpBhhgSVzN8AH5WBXM0oFnahrCd3XGmTU,1835
290
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py,sha256=tPdWE85cgYh7qmkHg6JeXrAM06oYD3RK8fwctC2OL6w,3189
295
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py,sha256=moTtG-8uSyUx_zxiQi55xQ7Cl2cHiyqtGUAuQ8_g-BI,3470
291
296
  arpakitlib/_arpakit_project_template_v_5/project/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
292
297
  arpakitlib/_arpakit_project_template_v_5/project/util/arpakitlib_project_template.py,sha256=syA_IuszHVub0zm0sVdB4_7rPJXwXRW4JmQ4qHbjXPk,396
293
298
  arpakitlib/ar_additional_model_util.py,sha256=GFg-glLCxH9X95R2bhTJsscVwv37FgE1qbaAAyXrnIE,917
@@ -341,8 +346,8 @@ arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,40
341
346
  arpakitlib/ar_wata_api_client.py,sha256=gdHOqDbuqxhTjVDtRW1DvkRJLdDofCrOq51GTctzLns,242
342
347
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
343
348
  arpakitlib/ar_zabbix_api_client_util.py,sha256=Q-VR4MvoZ9aHwZeYZr9G3LwN-ANx1T5KFmF6pvPM-9M,6402
344
- arpakitlib-1.8.20.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
345
- arpakitlib-1.8.20.dist-info/METADATA,sha256=1-ryZ5_8onpKsykVGz1CtFYHmC6CcpHL5Uvx-xLQdLc,3432
346
- arpakitlib-1.8.20.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
347
- arpakitlib-1.8.20.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
348
- arpakitlib-1.8.20.dist-info/RECORD,,
349
+ arpakitlib-1.8.21.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
350
+ arpakitlib-1.8.21.dist-info/METADATA,sha256=qKkcrxSptiTet5lmpfdIMRsYHhI9ZXC5OEEYSESBnX4,3432
351
+ arpakitlib-1.8.21.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
352
+ arpakitlib-1.8.21.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
353
+ arpakitlib-1.8.21.dist-info/RECORD,,
@@ -1,14 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from project.api.schema.out.admin.common import SimpleDBMAdminSO
4
- from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM
5
-
6
-
7
- class UserTokenDBMSAdminSO(SimpleDBMAdminSO):
8
- value: str
9
- user_id: int
10
- is_active: bool
11
-
12
- @classmethod
13
- def from_user_token_dbm(cls, *, user_dbm: UserTokenDBM) -> UserTokenDBMSAdminSO:
14
- return cls.model_validate(user_dbm.simple_dict_with_sd_properties())