arpakitlib 1.8.19__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 (57) 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 +170 -206
  4. arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py +2 -7
  5. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py +11 -1
  6. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py +10 -8
  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 +28 -0
  9. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py +31 -0
  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 -8
  14. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py +17 -0
  15. arpakitlib/_arpakit_project_template_v_5/project/api/router/general/main_router.py +5 -1
  16. arpakitlib/_arpakit_project_template_v_5/project/api/router/{client → general}/now_utc_datetime.py +1 -1
  17. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/common.py +7 -0
  18. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py +2 -2
  19. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py +2 -2
  20. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py +7 -0
  21. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/{admin → client}/user.py +6 -6
  22. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user_token.py +14 -0
  23. arpakitlib/_arpakit_project_template_v_5/project/core/settings.py +3 -19
  24. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +1 -1
  25. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py +13 -3
  26. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +19 -4
  27. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py +2 -2
  28. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +1 -1
  29. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_api_keys.py +35 -0
  30. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_data_1.py +4 -2
  31. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_data_2.py +4 -2
  32. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_data_3.py +4 -2
  33. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_data_4.py +4 -2
  34. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_data_5.py +4 -2
  35. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py +14 -6
  36. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/const.py +1 -0
  37. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/about.py +1 -1
  38. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/author.py +31 -0
  39. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/support.py +1 -1
  40. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py +4 -3
  41. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py +8 -0
  42. {arpakitlib-1.8.19.dist-info → arpakitlib-1.8.21.dist-info}/METADATA +1 -1
  43. {arpakitlib-1.8.19.dist-info → arpakitlib-1.8.21.dist-info}/RECORD +55 -49
  44. arpakitlib/_arpakit_project_template_v_5/project/api/auth2.py +0 -218
  45. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user_token.py +0 -14
  46. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/__init__.py +0 -0
  47. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/error_handler.py +0 -0
  48. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/healthcheck.py +0 -0
  49. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/hello_world.py +0 -0
  50. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_callback_query.py +0 -0
  51. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_inline_query.py +0 -0
  52. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_message.py +0 -0
  53. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/remove_message.py +0 -0
  54. /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/start.py +0 -0
  55. {arpakitlib-1.8.19.dist-info → arpakitlib-1.8.21.dist-info}/LICENSE +0 -0
  56. {arpakitlib-1.8.19.dist-info → arpakitlib-1.8.21.dist-info}/WHEEL +0 -0
  57. {arpakitlib-1.8.19.dist-info → arpakitlib-1.8.21.dist-info}/entry_points.txt +0 -0
@@ -1,3 +1,31 @@
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, \
4
+ reinit_sqlalchemy_db, get_story_log
5
+
3
6
  main_admin_api_router = APIRouter()
7
+
8
+ main_admin_api_router.include_router(
9
+ router=get_arpakitlib_project_template_info.api_router,
10
+ prefix="/get_arpakitlib_project_template_info"
11
+ )
12
+
13
+ main_admin_api_router.include_router(
14
+ router=get_auth_data.api_router,
15
+ prefix="/get_auth_data"
16
+ )
17
+
18
+ main_admin_api_router.include_router(
19
+ router=raise_fake_error.api_router,
20
+ prefix="/raise_fake_error"
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
+ )
@@ -0,0 +1,31 @@
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.common.error import ErrorCommonSO
7
+ from project.api.schema.out.common.raw_data import RawDataCommonSO
8
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
9
+
10
+ api_router = APIRouter()
11
+
12
+
13
+ @api_router.get(
14
+ path="",
15
+ name="Raise fake error",
16
+ status_code=fastapi.status.HTTP_200_OK,
17
+ response_model=RawDataCommonSO | 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.admin]
28
+ )
29
+ ]))
30
+ ):
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,9 +1,8 @@
1
1
  import fastapi.requests
2
2
  from fastapi import APIRouter
3
3
 
4
- from project.api.auth2 import APIAuthData, api_auth, require_api_key_string_api_middleware, \
5
- require_user_token_string_api_middleware, try_find_api_key_dbm_api_middleware, \
6
- try_find_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
7
6
  from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
8
7
  from project.api.schema.out.common.error import ErrorCommonSO
9
8
  from project.api.schema.out.general.errors_info_general import ErrorsInfoGeneralSO
@@ -22,11 +21,10 @@ async def _(
22
21
  request: fastapi.requests.Request,
23
22
  response: fastapi.responses.Response,
24
23
  api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
25
- require_api_key_string_api_middleware(),
26
- require_user_token_string_api_middleware(),
27
- try_find_api_key_dbm_api_middleware(),
28
- try_find_user_token_dbm_api_middleware(),
29
-
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
+ )
30
28
  ]))
31
29
  ):
32
30
  return ErrorsInfoGeneralSO(
@@ -1,3 +1,20 @@
1
1
  from fastapi import APIRouter
2
2
 
3
+ from project.api.router.client import get_errors_info, get_current_user, get_current_user_token
4
+
3
5
  main_client_api_router = APIRouter()
6
+
7
+ main_client_api_router.include_router(
8
+ router=get_errors_info.api_router,
9
+ prefix="/get_errors_info"
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,6 @@
1
1
  from fastapi import APIRouter
2
2
 
3
- from project.api.router.general import healthcheck
3
+ from project.api.router.general import healthcheck, now_utc_datetime
4
4
 
5
5
  main_general_api_router = APIRouter()
6
6
 
@@ -8,3 +8,7 @@ main_general_api_router.include_router(
8
8
  router=healthcheck.api_router,
9
9
  prefix="/healthcheck"
10
10
  )
11
+ main_general_api_router.include_router(
12
+ router=now_utc_datetime.api_router,
13
+ prefix="/now_utc_datetime"
14
+ )
@@ -17,6 +17,6 @@ api_router = APIRouter()
17
17
  async def _(
18
18
  *,
19
19
  request: fastapi.requests.Request,
20
- response: fastapi.responses.Response
20
+ response: fastapi.responses.Response,
21
21
  ):
22
22
  return DatetimeCommonSO.from_datetime(datetime_=now_utc_dt())
@@ -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,14 +3,14 @@ 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
- is_enabled: bool
13
+ is_active: bool
14
14
  tg_id: int | None
15
15
  tg_bot_last_action_dt: dt.datetime | None
16
16
  tg_data: dict[str, Any] | 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())
@@ -84,24 +84,10 @@ class Settings(SimpleSettings):
84
84
 
85
85
  api_init_json_db: bool = False
86
86
 
87
- api_api_keys: list[str] | None = ["1"]
87
+ api_correct_api_keys: list[str] | None = ["1"]
88
88
 
89
- @field_validator("api_api_keys", mode="before")
90
- def validate_api_api_keys(cls, v: Any, validation_info: ValidationInfo, **kwargs) -> list[str] | None:
91
- if isinstance(v, str):
92
- v = [v]
93
- if isinstance(v, int):
94
- v = [str(v)]
95
- if isinstance(v, list):
96
- for i, v_ in enumerate(v):
97
- if isinstance(v_, int):
98
- v[i] = str(v_)
99
- return v
100
-
101
- api_user_tokens: list[str] | None = ["1"]
102
-
103
- @field_validator("api_user_tokens", mode="before")
104
- def validate_api_tokens(cls, v: Any, validation_info: ValidationInfo, **kwargs) -> list[str] | None:
89
+ @field_validator("api_correct_api_keys", mode="before")
90
+ def validate_api_correct_api_keys(cls, v: Any, validation_info: ValidationInfo, **kwargs) -> list[str] | None:
105
91
  if isinstance(v, str):
106
92
  v = [v]
107
93
  if isinstance(v, int):
@@ -118,8 +104,6 @@ class Settings(SimpleSettings):
118
104
 
119
105
  api_start_scheduled_operation_creator_worker: bool = False
120
106
 
121
- api_create_story_log_func_before_in_api_exception_handler: bool = False
122
-
123
107
  sqladmin_secret_key: str | None = "85a9583cb91c4de7a78d7eb1e5306a04418c9c43014c447ea8ec8dd5deb4cf71"
124
108
 
125
109
  sqladmin_auth_keys: list[str] | None = ["1"]
@@ -35,7 +35,7 @@ class ApiKeyDBM(SimpleDBM):
35
35
  insert_default=generate_default_api_key_value,
36
36
  nullable=False
37
37
  )
38
- is_enabled: Mapped[bool] = mapped_column(
38
+ is_active: Mapped[bool] = mapped_column(
39
39
  sqlalchemy.Boolean,
40
40
  index=True,
41
41
  insert_default=True,
@@ -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,
@@ -33,7 +33,7 @@ class UserDBM(SimpleDBM):
33
33
  index=True,
34
34
  nullable=False
35
35
  )
36
- is_enabled: Mapped[bool] = mapped_column(
36
+ is_active: Mapped[bool] = mapped_column(
37
37
  sqlalchemy.Boolean,
38
38
  index=True,
39
39
  insert_default=True,
@@ -25,7 +25,7 @@ class UserTokenDBM(SimpleDBM):
25
25
  index=True,
26
26
  nullable=False
27
27
  )
28
- is_enabled: Mapped[bool] = mapped_column(
28
+ is_active: Mapped[bool] = mapped_column(
29
29
  sqlalchemy.Boolean,
30
30
  index=True,
31
31
  insert_default=True,
@@ -0,0 +1,35 @@
1
+ import asyncio
2
+ import logging
3
+
4
+ from project.core.settings import get_cached_settings
5
+ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
6
+ from project.sqlalchemy_db_.sqlalchemy_model import ApiKeyDBM
7
+
8
+ _logger = logging.getLogger(__name__)
9
+
10
+
11
+ def make_test_data_1():
12
+ get_cached_settings().raise_if_prod_mode()
13
+ with get_cached_sqlalchemy_db().new_session() as session:
14
+ for i in range(10):
15
+ api_key = ApiKeyDBM(value=str(i))
16
+ session.add(api_key)
17
+ _logger.info(api_key)
18
+ session.commit()
19
+
20
+
21
+ async def async_make_test_data_1():
22
+ get_cached_settings().raise_if_prod_mode()
23
+
24
+
25
+ def __example():
26
+ make_test_data_1()
27
+
28
+
29
+ async def __async_example():
30
+ await async_make_test_data_1()
31
+
32
+
33
+ if __name__ == '__main__':
34
+ __example()
35
+ asyncio.run(__async_example())
@@ -1,12 +1,14 @@
1
1
  import asyncio
2
2
 
3
+ from project.core.settings import get_cached_settings
4
+
3
5
 
4
6
  def make_test_data_1():
5
- pass
7
+ get_cached_settings().raise_if_prod_mode()
6
8
 
7
9
 
8
10
  async def async_make_test_data_1():
9
- pass
11
+ get_cached_settings().raise_if_prod_mode()
10
12
 
11
13
 
12
14
  def __example():
@@ -1,12 +1,14 @@
1
1
  import asyncio
2
2
 
3
+ from project.core.settings import get_cached_settings
4
+
3
5
 
4
6
  def make_test_data_2():
5
- pass
7
+ get_cached_settings().raise_if_prod_mode()
6
8
 
7
9
 
8
10
  async def async_make_test_data_2():
9
- pass
11
+ get_cached_settings().raise_if_prod_mode()
10
12
 
11
13
 
12
14
  def __example():
@@ -1,12 +1,14 @@
1
1
  import asyncio
2
2
 
3
+ from project.core.settings import get_cached_settings
4
+
3
5
 
4
6
  def make_test_data_3():
5
- pass
7
+ get_cached_settings().raise_if_prod_mode()
6
8
 
7
9
 
8
10
  async def async_make_test_data_3():
9
- pass
11
+ get_cached_settings().raise_if_prod_mode()
10
12
 
11
13
 
12
14
  def __example():
@@ -1,12 +1,14 @@
1
1
  import asyncio
2
2
 
3
+ from project.core.settings import get_cached_settings
4
+
3
5
 
4
6
  def make_test_data_4():
5
- pass
7
+ get_cached_settings().raise_if_prod_mode()
6
8
 
7
9
 
8
10
  async def async_make_test_data_4():
9
- pass
11
+ get_cached_settings().raise_if_prod_mode()
10
12
 
11
13
 
12
14
  def __example():
@@ -1,12 +1,14 @@
1
1
  import asyncio
2
2
 
3
+ from project.core.settings import get_cached_settings
4
+
3
5
 
4
6
  def make_test_data_5():
5
- pass
7
+ get_cached_settings().raise_if_prod_mode()
6
8
 
7
9
 
8
10
  async def async_make_test_data_5():
9
- pass
11
+ get_cached_settings().raise_if_prod_mode()
10
12
 
11
13
 
12
14
  def __example():
@@ -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"