arpakitlib 1.8.35__py3-none-any.whl → 1.8.37__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 (73) hide show
  1. arpakitlib/_arpakit_project_template_v_5/command/emojize.py +9 -0
  2. arpakitlib/_arpakit_project_template_v_5/project/api/create_api_app.py +12 -2
  3. arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py +1 -1
  4. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/create_operation.py +78 -0
  5. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py +8 -2
  6. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py +8 -2
  7. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_operation.py +63 -0
  8. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_operation_allowed_statuses.py +40 -0
  9. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_operation_allowed_types.py +40 -0
  10. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_sqlalchemy_db_table_name_to_amount.py +39 -0
  11. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_story_log.py +14 -4
  12. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/init_sqlalchemy_db.py +8 -2
  13. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/main_router.py +27 -1
  14. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py +1 -2
  15. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/reinit_sqlalchemy_db.py +8 -2
  16. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user.py +11 -3
  17. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user_token.py +10 -3
  18. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py +1 -11
  19. arpakitlib/_arpakit_project_template_v_5/project/api/router/general/check_authorization.py +46 -0
  20. arpakitlib/_arpakit_project_template_v_5/project/api/router/{client → general}/get_current_api_key.py +9 -3
  21. arpakitlib/_arpakit_project_template_v_5/project/api/router/{client → general}/get_errors_info.py +10 -8
  22. arpakitlib/_arpakit_project_template_v_5/project/api/router/general/healthcheck.py +12 -3
  23. arpakitlib/_arpakit_project_template_v_5/project/api/router/general/main_router.py +18 -1
  24. arpakitlib/_arpakit_project_template_v_5/project/api/router/general/now_utc_datetime.py +14 -2
  25. arpakitlib/_arpakit_project_template_v_5/project/api/schema/common.py +11 -0
  26. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/common.py +1 -0
  27. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py +6 -3
  28. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py +8 -6
  29. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py +3 -1
  30. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user.py +14 -5
  31. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user_token.py +5 -3
  32. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/{client → general}/api_key.py +5 -3
  33. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/general/user.py +31 -0
  34. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/general/user_token.py +16 -0
  35. arpakitlib/_arpakit_project_template_v_5/project/operation_execution/operation_executor_worker.py +2 -2
  36. arpakitlib/_arpakit_project_template_v_5/project/operation_execution/scheduled_operation_creator_worker.py +2 -1
  37. arpakitlib/_arpakit_project_template_v_5/project/sandbox/sandbox_1.py +6 -1
  38. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py +4 -11
  39. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py +1 -1
  40. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py +6 -18
  41. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py +5 -15
  42. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py +5 -15
  43. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user_token.py +5 -11
  44. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py +6 -1
  45. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +6 -9
  46. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py +30 -30
  47. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +4 -0
  48. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_api_keys.py +2 -2
  49. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/{client.py → general.py} +7 -6
  50. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/const.py +2 -2
  51. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/kb/inline_/client/hello_world.py +1 -1
  52. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/kb/static_/client/hello_world.py +1 -1
  53. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/about.py +4 -4
  54. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/author.py +4 -4
  55. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/error_handler.py +2 -2
  56. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/healthcheck.py +3 -3
  57. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/hello_world.py +3 -3
  58. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/raw_callback_query.py +1 -1
  59. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/raw_message.py +1 -1
  60. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/start.py +4 -4
  61. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/support.py +4 -4
  62. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py +14 -14
  63. arpakitlib/ar_enumeration_util.py +2 -2
  64. arpakitlib/ar_sqlalchemy_util.py +52 -24
  65. arpakitlib/ar_str_util.py +6 -0
  66. arpakitlib/ar_zabbix_api_client_util.py +56 -5
  67. {arpakitlib-1.8.35.dist-info → arpakitlib-1.8.37.dist-info}/METADATA +1 -1
  68. {arpakitlib-1.8.35.dist-info → arpakitlib-1.8.37.dist-info}/RECORD +71 -64
  69. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/general/errors_info_general.py +0 -6
  70. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/general/healthcheck.py +0 -5
  71. {arpakitlib-1.8.35.dist-info → arpakitlib-1.8.37.dist-info}/LICENSE +0 -0
  72. {arpakitlib-1.8.35.dist-info → arpakitlib-1.8.37.dist-info}/WHEEL +0 -0
  73. {arpakitlib-1.8.35.dist-info → arpakitlib-1.8.37.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,46 @@
1
+ import fastapi.requests
2
+ from fastapi import APIRouter
3
+
4
+ from project.api.authorize import APIAuthorizeData, api_authorize
5
+ from project.api.schema.common import BaseRouteSO
6
+ from project.api.schema.out.common.error import ErrorCommonSO
7
+ from project.api.schema.out.general.api_key import ApiKeyGeneral1SO
8
+ from project.api.schema.out.general.user import UserGeneral1SO
9
+ from project.api.schema.out.general.user_token import UserTokenGeneral1SO
10
+
11
+
12
+ class CheckAuthorizationGeneralRouteSO(BaseRouteSO):
13
+ is_current_api_key_ok: bool = False
14
+ is_current_user_token_ok: bool = False
15
+ current_api_key: ApiKeyGeneral1SO | None = None
16
+ current_user_token: UserTokenGeneral1SO | None = None
17
+ current_user: UserGeneral1SO | None = None
18
+
19
+
20
+ api_router = APIRouter()
21
+
22
+
23
+ @api_router.get(
24
+ "",
25
+ name="Check authorization",
26
+ status_code=fastapi.status.HTTP_200_OK,
27
+ response_model=CheckAuthorizationGeneralRouteSO | ErrorCommonSO,
28
+ )
29
+ async def _(
30
+ *,
31
+ request: fastapi.requests.Request,
32
+ response: fastapi.responses.Response,
33
+ api_auth_data: APIAuthorizeData = fastapi.Depends(api_authorize())
34
+ ):
35
+ return CheckAuthorizationGeneralRouteSO(
36
+ is_current_api_key_ok=api_auth_data.api_key_dbm is not None,
37
+ is_current_user_token_ok=api_auth_data.user_token_dbm is not None,
38
+ current_api_key=ApiKeyGeneral1SO.from_dbm(simple_dbm=api_auth_data.api_key_dbm),
39
+ current_user_token=UserTokenGeneral1SO.from_dbm(
40
+ simple_dbm=api_auth_data.user_token_dbm
41
+ ) if api_auth_data.user_token_dbm is not None else None
42
+ ,
43
+ current_user=UserGeneral1SO.from_dbm(
44
+ simple_dbm=api_auth_data.user_token_dbm.user
45
+ ) if api_auth_data.user_token_dbm is not None else None
46
+ )
@@ -3,10 +3,16 @@ from fastapi import APIRouter
3
3
 
4
4
  from project.api.authorize import APIAuthorizeData, api_authorize, require_user_token_dbm_api_authorize_middleware, \
5
5
  require_api_key_dbm_api_authorize_middleware
6
- from project.api.schema.out.client.api_key import ApiKeyClientSO
6
+ from project.api.schema.common import BaseRouteSO
7
7
  from project.api.schema.out.common.error import ErrorCommonSO
8
+ from project.api.schema.out.general.api_key import ApiKeyGeneral1SO
8
9
  from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
9
10
 
11
+
12
+ class GetCurrentApiKeyRouteSO(BaseRouteSO, ApiKeyGeneral1SO):
13
+ pass
14
+
15
+
10
16
  api_router = APIRouter()
11
17
 
12
18
 
@@ -14,7 +20,7 @@ api_router = APIRouter()
14
20
  "",
15
21
  name="Get current api key",
16
22
  status_code=fastapi.status.HTTP_200_OK,
17
- response_model=ApiKeyClientSO | str | ErrorCommonSO,
23
+ response_model=GetCurrentApiKeyRouteSO | str | ErrorCommonSO,
18
24
  )
19
25
  async def _(
20
26
  *,
@@ -30,6 +36,6 @@ async def _(
30
36
  )
31
37
  ]))
32
38
  ):
33
- return ApiKeyClientSO.from_dbm(
39
+ return GetCurrentApiKeyRouteSO.from_dbm(
34
40
  simple_dbm=api_auth_data.api_key_dbm
35
41
  )
@@ -1,11 +1,16 @@
1
1
  import fastapi.requests
2
2
  from fastapi import APIRouter
3
3
 
4
- from project.api.authorize import APIAuthorizeData, api_authorize, require_user_token_dbm_api_authorize_middleware, \
5
- require_api_key_dbm_api_authorize_middleware
4
+ from project.api.authorize import APIAuthorizeData, api_authorize, require_api_key_dbm_api_authorize_middleware
6
5
  from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
6
+ from project.api.schema.common import BaseRouteSO
7
7
  from project.api.schema.out.common.error import ErrorCommonSO
8
- from project.api.schema.out.general.errors_info_general import ErrorsInfoGeneralSO
8
+
9
+
10
+ class GetErrorsInfoRouteSO(BaseRouteSO):
11
+ api_error_codes: list[str] = []
12
+ api_error_specification_codes: list[str] = []
13
+
9
14
 
10
15
  api_router = APIRouter()
11
16
 
@@ -14,7 +19,7 @@ api_router = APIRouter()
14
19
  "",
15
20
  name="Get errors info",
16
21
  status_code=fastapi.status.HTTP_200_OK,
17
- response_model=ErrorsInfoGeneralSO | ErrorCommonSO,
22
+ response_model=GetErrorsInfoRouteSO | ErrorCommonSO,
18
23
  )
19
24
  async def _(
20
25
  *,
@@ -23,13 +28,10 @@ async def _(
23
28
  api_auth_data: APIAuthorizeData = fastapi.Depends(api_authorize(middlewares=[
24
29
  require_api_key_dbm_api_authorize_middleware(
25
30
  require_active=True
26
- ),
27
- require_user_token_dbm_api_authorize_middleware(
28
- require_active_user_token=True
29
31
  )
30
32
  ]))
31
33
  ):
32
- return ErrorsInfoGeneralSO(
34
+ return GetErrorsInfoRouteSO(
33
35
  api_error_codes=APIErrorCodes.values_list(),
34
36
  api_error_specification_codes=APIErrorSpecificationCodes.values_list()
35
37
  )
@@ -1,8 +1,17 @@
1
+ import datetime as dt
2
+
1
3
  import fastapi
2
4
  from fastapi import APIRouter
3
5
 
6
+ from project.api.schema.common import BaseRouteSO
4
7
  from project.api.schema.out.common.error import ErrorCommonSO
5
- from project.api.schema.out.general.healthcheck import HealthcheckGeneralSO
8
+ from project.core.util import now_local_dt
9
+
10
+
11
+ class HealthcheckRouteSO(BaseRouteSO):
12
+ is_ok: bool = True
13
+ datetime: dt.datetime
14
+
6
15
 
7
16
  api_router = APIRouter()
8
17
 
@@ -11,11 +20,11 @@ api_router = APIRouter()
11
20
  "",
12
21
  name="Healthcheck",
13
22
  status_code=fastapi.status.HTTP_200_OK,
14
- response_model=HealthcheckGeneralSO | ErrorCommonSO,
23
+ response_model=HealthcheckRouteSO | ErrorCommonSO,
15
24
  )
16
25
  async def _(
17
26
  *,
18
27
  request: fastapi.requests.Request,
19
28
  response: fastapi.responses.Response
20
29
  ):
21
- return HealthcheckGeneralSO(is_ok=True)
30
+ return HealthcheckRouteSO(is_ok=True, datetime=now_local_dt())
@@ -1,6 +1,7 @@
1
1
  from fastapi import APIRouter
2
2
 
3
- from project.api.router.general import healthcheck, now_utc_datetime
3
+ from project.api.router.general import healthcheck, now_utc_datetime, get_current_api_key, check_authorization, \
4
+ get_errors_info
4
5
 
5
6
  main_general_api_router = APIRouter()
6
7
 
@@ -8,7 +9,23 @@ main_general_api_router.include_router(
8
9
  router=healthcheck.api_router,
9
10
  prefix="/healthcheck"
10
11
  )
12
+
11
13
  main_general_api_router.include_router(
12
14
  router=now_utc_datetime.api_router,
13
15
  prefix="/now_utc_datetime"
14
16
  )
17
+
18
+ main_general_api_router.include_router(
19
+ router=get_current_api_key.api_router,
20
+ prefix="/get_current_api_key"
21
+ )
22
+
23
+ main_general_api_router.include_router(
24
+ router=check_authorization.api_router,
25
+ prefix="/check_authorization"
26
+ )
27
+
28
+ main_general_api_router.include_router(
29
+ router=get_errors_info.api_router,
30
+ prefix="/get_errors_info"
31
+ )
@@ -2,9 +2,16 @@ import fastapi
2
2
  from fastapi import APIRouter
3
3
 
4
4
  from arpakitlib.ar_datetime_util import now_utc_dt
5
+ from project.api.authorize import require_api_key_dbm_api_authorize_middleware, APIAuthorizeData, api_authorize
6
+ from project.api.schema.common import BaseRouteSO
5
7
  from project.api.schema.out.common.datetime_ import DatetimeCommonSO
6
8
  from project.api.schema.out.common.error import ErrorCommonSO
7
9
 
10
+
11
+ class NowUTCDatetimeRouteSO(BaseRouteSO, DatetimeCommonSO):
12
+ pass
13
+
14
+
8
15
  api_router = APIRouter()
9
16
 
10
17
 
@@ -12,11 +19,16 @@ api_router = APIRouter()
12
19
  "",
13
20
  name="Now UTC datetime",
14
21
  status_code=fastapi.status.HTTP_200_OK,
15
- response_model=DatetimeCommonSO | ErrorCommonSO,
22
+ response_model=NowUTCDatetimeRouteSO | ErrorCommonSO,
16
23
  )
17
24
  async def _(
18
25
  *,
19
26
  request: fastapi.requests.Request,
20
27
  response: fastapi.responses.Response,
28
+ api_auth_data: APIAuthorizeData = fastapi.Depends(api_authorize(middlewares=[
29
+ require_api_key_dbm_api_authorize_middleware(
30
+ require_active=True
31
+ )
32
+ ]))
21
33
  ):
22
- return DatetimeCommonSO.from_datetime(datetime_=now_utc_dt())
34
+ return NowUTCDatetimeRouteSO.from_datetime(datetime_=now_utc_dt())
@@ -24,3 +24,14 @@ class BaseSI(BaseSchema):
24
24
 
25
25
  class BaseSO(BaseSchema):
26
26
  pass
27
+
28
+
29
+ class BaseRouteSO(BaseSchema):
30
+ @classmethod
31
+ def __pydantic_init_subclass__(cls, **kwargs: Any) -> None:
32
+ if not (
33
+ cls.__name__.endswith("RouteSO")
34
+ or cls.__name__.endswith("RouteSchemaOut")
35
+ ):
36
+ raise ValueError("Route APISchema class should ends with RouteSO | RouteSchemaOut")
37
+ super().__init_subclass__(**kwargs)
@@ -13,6 +13,7 @@ class SimpleDBMAdminSO(BaseSO):
13
13
  slug: str | None
14
14
  creation_dt: dt.datetime
15
15
  extra_data: dict[str, Any]
16
+
16
17
  entity_name: str
17
18
 
18
19
  @classmethod
@@ -7,7 +7,7 @@ from project.api.schema.out.admin.common import SimpleDBMAdminSO
7
7
  from project.sqlalchemy_db_.sqlalchemy_model import OperationDBM
8
8
 
9
9
 
10
- class OperationAdminSO(SimpleDBMAdminSO):
10
+ class OperationAdmin1SO(SimpleDBMAdminSO):
11
11
  execution_start_dt: dt.datetime | None
12
12
  execution_finish_dt: dt.datetime | None
13
13
  status: str
@@ -16,10 +16,13 @@ class OperationAdminSO(SimpleDBMAdminSO):
16
16
  input_data: dict[str, Any]
17
17
  output_data: dict[str, Any]
18
18
  error_data: dict[str, Any]
19
+
19
20
  duration_total_seconds: float | None
20
21
  allowed_statuses: list[str]
21
22
  allowed_types: list[str]
22
23
 
23
24
  @classmethod
24
- def from_dbm(cls, *, simple_dbm: OperationDBM) -> OperationAdminSO:
25
- return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
25
+ def from_dbm(cls, *, simple_dbm: OperationDBM) -> OperationAdmin1SO:
26
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
27
+ only_columns_and_sd_properties=cls.model_fields.keys()
28
+ ))
@@ -1,17 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any
4
-
5
3
  from project.api.schema.out.admin.common import SimpleDBMAdminSO
6
4
  from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
7
5
 
8
6
 
9
- class StoryLogAdminSO(SimpleDBMAdminSO):
7
+ class StoryLogAdmin1SO(SimpleDBMAdminSO):
10
8
  level: str
11
9
  type: str | None
12
10
  title: str | None
13
- data: dict[str, Any]
11
+
12
+ allowed_levels: list[str]
13
+ allowed_types: list[str]
14
14
 
15
15
  @classmethod
16
- def from_dbm(cls, *, simple_dbm: StoryLogDBM) -> StoryLogAdminSO:
17
- return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
16
+ def from_dbm(cls, *, simple_dbm: StoryLogDBM) -> StoryLogAdmin1SO:
17
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
18
+ only_columns_and_sd_properties=cls.model_fields.keys()
19
+ ))
@@ -15,4 +15,6 @@ class SimpleDBMClientSO(BaseSO):
15
15
 
16
16
  @classmethod
17
17
  def from_dbm(cls, *, simple_dbm: SimpleDBM) -> SimpleDBMClientSO:
18
- return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
18
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
19
+ only_columns_and_sd_properties=cls.model_fields.keys()
20
+ ))
@@ -1,22 +1,31 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import datetime as dt
4
- from typing import Any
5
4
 
6
5
  from project.api.schema.out.client.common import SimpleDBMClientSO
7
6
  from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
8
7
 
9
8
 
10
- class UserClientSO(SimpleDBMClientSO):
9
+ class UserClient1SO(SimpleDBMClientSO):
11
10
  email: str | None
12
11
  roles: list[str]
13
12
  is_active: bool
14
13
  tg_id: int | None
15
14
  tg_bot_last_action_dt: dt.datetime | None
16
- tg_data: dict[str, Any] | None
15
+
17
16
  roles_has_admin: bool
18
17
  roles_has_client: bool
18
+ allowed_roles: list[str]
19
+ tg_data_first_name: str | None
20
+ tg_data_last_name: str | None
21
+ tg_data_language_code: str | None
22
+ tg_data_username: str | None
23
+ tg_data_at_username: str | None
24
+ tg_data_fullname: str | None
25
+ tg_data_link_by_username: str | None
19
26
 
20
27
  @classmethod
21
- def from_dbm(cls, *, simple_dbm: UserDBM) -> UserClientSO:
22
- return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
28
+ def from_dbm(cls, *, simple_dbm: UserDBM) -> UserClient1SO:
29
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
30
+ only_columns_and_sd_properties=cls.model_fields.keys()
31
+ ))
@@ -4,11 +4,13 @@ from project.api.schema.out.client.common import SimpleDBMClientSO
4
4
  from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM
5
5
 
6
6
 
7
- class UserTokenClientSO(SimpleDBMClientSO):
7
+ class UserTokenClient1SO(SimpleDBMClientSO):
8
8
  value: str
9
9
  user_id: int
10
10
  is_active: bool
11
11
 
12
12
  @classmethod
13
- def from_dbm(cls, *, simple_dbm: UserTokenDBM) -> UserTokenClientSO:
14
- return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
13
+ def from_dbm(cls, *, simple_dbm: UserTokenDBM) -> UserTokenClient1SO:
14
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
15
+ only_columns_and_sd_properties=cls.model_fields.keys()
16
+ ))
@@ -4,11 +4,13 @@ from project.api.schema.out.client.common import SimpleDBMClientSO
4
4
  from project.sqlalchemy_db_.sqlalchemy_model import ApiKeyDBM
5
5
 
6
6
 
7
- class ApiKeyClientSO(SimpleDBMClientSO):
7
+ class ApiKeyGeneral1SO(SimpleDBMClientSO):
8
8
  title: str | None
9
9
  value: str
10
10
  is_active: bool
11
11
 
12
12
  @classmethod
13
- def from_dbm(cls, *, simple_dbm: ApiKeyDBM) -> ApiKeyClientSO:
14
- return cls.model_validate(simple_dbm.simple_dict_with_sd_properties())
13
+ def from_dbm(cls, *, simple_dbm: ApiKeyDBM) -> ApiKeyGeneral1SO:
14
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
15
+ only_columns_and_sd_properties=cls.model_fields.keys()
16
+ ))
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime as dt
4
+
5
+ from project.api.schema.out.client.common import SimpleDBMClientSO
6
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
7
+
8
+
9
+ class UserGeneral1SO(SimpleDBMClientSO):
10
+ email: str | None
11
+ roles: list[str]
12
+ is_active: bool
13
+ tg_id: int | None
14
+ tg_bot_last_action_dt: dt.datetime | None
15
+
16
+ roles_has_admin: bool
17
+ roles_has_client: bool
18
+ allowed_roles: list[str]
19
+ tg_data_first_name: str | None
20
+ tg_data_last_name: str | None
21
+ tg_data_language_code: str | None
22
+ tg_data_username: str | None
23
+ tg_data_at_username: str | None
24
+ tg_data_fullname: str | None
25
+ tg_data_link_by_username: str | None
26
+
27
+ @classmethod
28
+ def from_dbm(cls, *, simple_dbm: UserDBM) -> UserGeneral1SO:
29
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
30
+ only_columns_and_sd_properties=cls.model_fields.keys()
31
+ ))
@@ -0,0 +1,16 @@
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 UserTokenGeneral1SO(SimpleDBMClientSO):
8
+ value: str
9
+ user_id: int
10
+ is_active: bool
11
+
12
+ @classmethod
13
+ def from_dbm(cls, *, simple_dbm: UserTokenDBM) -> UserTokenGeneral1SO:
14
+ return cls.model_validate(simple_dbm.simple_dict_with_sd_properties(
15
+ only_columns_and_sd_properties=cls.model_fields.keys()
16
+ ))
@@ -140,7 +140,7 @@ class OperationExecutorWorker(BaseWorker):
140
140
  f", operation_id={operation_dbm.id}"
141
141
  f", operation_type={operation_dbm.type}"
142
142
  ),
143
- data={
143
+ extra_data={
144
144
  "operation_id": operation_dbm.id,
145
145
  "operation_type": operation_dbm.type,
146
146
  }
@@ -236,7 +236,7 @@ class OperationExecutorWorker(BaseWorker):
236
236
  f", operation_id={operation_dbm.id}"
237
237
  f", operation_type={operation_dbm.type}"
238
238
  ),
239
- data={
239
+ extra_data={
240
240
  "operation_id": operation_dbm.id,
241
241
  "operation_type": operation_dbm.type,
242
242
  }
@@ -45,7 +45,8 @@ class ScheduledOperationCreatorWorker(BaseWorker):
45
45
  with self.sqlalchemy_db.new_session() as session:
46
46
  operation_dbm = OperationDBM(
47
47
  type=scheduled_operation.type,
48
- input_data=scheduled_operation.input_data
48
+ input_data=scheduled_operation.input_data,
49
+ status=OperationDBM.Statuses.waiting_for_execution
49
50
  )
50
51
  session.add(operation_dbm)
51
52
  session.commit()
@@ -1,8 +1,13 @@
1
1
  import asyncio
2
2
 
3
+ import sqlalchemy
4
+
5
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
6
+
3
7
 
4
8
  def __sandbox():
5
- pass
9
+ a = sqlalchemy.inspect(SimpleDBM)
10
+ print(a)
6
11
 
7
12
 
8
13
  async def __async_sandbox():
@@ -1,3 +1,5 @@
1
+ import sqlalchemy
2
+
1
3
  from project.sqladmin_.model_view.common import SimpleMV
2
4
  from project.sqlalchemy_db_.sqlalchemy_model import ApiKeyDBM
3
5
 
@@ -5,21 +7,14 @@ from project.sqlalchemy_db_.sqlalchemy_model import ApiKeyDBM
5
7
  class ApiKeyMV(SimpleMV, model=ApiKeyDBM):
6
8
  name = "ApiKey"
7
9
  name_plural = "ApiKeys"
8
- column_list = [
9
- ApiKeyDBM.id,
10
- ApiKeyDBM.long_id,
11
- ApiKeyDBM.slug,
12
- ApiKeyDBM.creation_dt,
13
- ApiKeyDBM.title,
14
- ApiKeyDBM.value,
15
- ApiKeyDBM.is_active,
16
- ]
10
+ column_list = sqlalchemy.inspect(ApiKeyDBM).columns
17
11
  form_columns = [
18
12
  ApiKeyDBM.slug,
19
13
  ApiKeyDBM.title,
20
14
  ApiKeyDBM.value,
21
15
  ApiKeyDBM.is_active,
22
16
  ]
17
+ column_sortable_list = sqlalchemy.inspect(ApiKeyDBM).columns
23
18
  column_default_sort = [
24
19
  (ApiKeyDBM.creation_dt, True)
25
20
  ]
@@ -27,7 +22,5 @@ class ApiKeyMV(SimpleMV, model=ApiKeyDBM):
27
22
  ApiKeyDBM.id,
28
23
  ApiKeyDBM.long_id,
29
24
  ApiKeyDBM.slug,
30
- ApiKeyDBM.title,
31
25
  ApiKeyDBM.value,
32
- ApiKeyDBM.is_active,
33
26
  ]
@@ -8,7 +8,7 @@ class SimpleMV(ModelView):
8
8
  can_view_details = True
9
9
  can_export = True
10
10
  page_size = 50
11
- page_size_options = [50, 100, 200]
11
+ page_size_options = [50, 100, 200, 500, 750, 1000]
12
12
  save_as = True
13
13
  save_as_continue = True
14
14
  export_types = ["xlsx", "csv", "json"]
@@ -1,3 +1,5 @@
1
+ import sqlalchemy
2
+
1
3
  from project.sqladmin_.model_view.common import SimpleMV
2
4
  from project.sqlalchemy_db_.sqlalchemy_model import OperationDBM
3
5
 
@@ -5,20 +7,7 @@ from project.sqlalchemy_db_.sqlalchemy_model import OperationDBM
5
7
  class OperationMV(SimpleMV, model=OperationDBM):
6
8
  name = "Operation"
7
9
  name_plural = "Operations"
8
- column_list = [
9
- OperationDBM.id,
10
- OperationDBM.long_id,
11
- OperationDBM.slug,
12
- OperationDBM.creation_dt,
13
- OperationDBM.status,
14
- OperationDBM.type,
15
- OperationDBM.title,
16
- OperationDBM.execution_start_dt,
17
- OperationDBM.execution_finish_dt,
18
- OperationDBM.input_data,
19
- OperationDBM.output_data,
20
- OperationDBM.error_data
21
- ]
10
+ column_list = sqlalchemy.inspect(OperationDBM).columns
22
11
  form_columns = [
23
12
  OperationDBM.slug,
24
13
  OperationDBM.status,
@@ -28,8 +17,10 @@ class OperationMV(SimpleMV, model=OperationDBM):
28
17
  OperationDBM.execution_finish_dt,
29
18
  OperationDBM.input_data,
30
19
  OperationDBM.output_data,
31
- OperationDBM.error_data
20
+ OperationDBM.error_data,
21
+ OperationDBM.extra_data
32
22
  ]
23
+ column_sortable_list = sqlalchemy.inspect(OperationDBM).columns
33
24
  column_default_sort = [
34
25
  (OperationDBM.creation_dt, True)
35
26
  ]
@@ -37,7 +28,4 @@ class OperationMV(SimpleMV, model=OperationDBM):
37
28
  OperationDBM.id,
38
29
  OperationDBM.long_id,
39
30
  OperationDBM.slug,
40
- OperationDBM.status,
41
- OperationDBM.type,
42
- OperationDBM.title
43
31
  ]
@@ -1,3 +1,5 @@
1
+ import sqlalchemy
2
+
1
3
  from project.sqladmin_.model_view.common import SimpleMV
2
4
  from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
3
5
 
@@ -5,23 +7,15 @@ from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
5
7
  class StoryLogMV(SimpleMV, model=StoryLogDBM):
6
8
  name = "StoryLog"
7
9
  name_plural = "StoryLogs"
8
- column_list = [
9
- StoryLogDBM.id,
10
- StoryLogDBM.long_id,
11
- StoryLogDBM.slug,
12
- StoryLogDBM.creation_dt,
13
- StoryLogDBM.level,
14
- StoryLogDBM.type,
15
- StoryLogDBM.title,
16
- StoryLogDBM.data
17
- ]
10
+ column_list = sqlalchemy.inspect(StoryLogDBM).columns
18
11
  form_columns = [
19
12
  StoryLogDBM.slug,
20
13
  StoryLogDBM.level,
21
14
  StoryLogDBM.type,
22
15
  StoryLogDBM.title,
23
- StoryLogDBM.data
16
+ StoryLogDBM.extra_data
24
17
  ]
18
+ column_sortable_list = sqlalchemy.inspect(StoryLogDBM).columns
25
19
  column_default_sort = [
26
20
  (StoryLogDBM.creation_dt, True)
27
21
  ]
@@ -29,8 +23,4 @@ class StoryLogMV(SimpleMV, model=StoryLogDBM):
29
23
  StoryLogDBM.id,
30
24
  StoryLogDBM.long_id,
31
25
  StoryLogDBM.slug,
32
- StoryLogDBM.level,
33
- StoryLogDBM.type,
34
- StoryLogDBM.title,
35
- StoryLogDBM.data
36
26
  ]
@@ -1,3 +1,5 @@
1
+ import sqlalchemy
2
+
1
3
  from project.sqladmin_.model_view.common import SimpleMV
2
4
  from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
3
5
 
@@ -5,18 +7,7 @@ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
5
7
  class UserMV(SimpleMV, model=UserDBM):
6
8
  name = "User"
7
9
  name_plural = "Users"
8
- column_list = [
9
- UserDBM.id,
10
- UserDBM.long_id,
11
- UserDBM.slug,
12
- UserDBM.creation_dt,
13
- UserDBM.email,
14
- UserDBM.roles,
15
- UserDBM.is_active,
16
- UserDBM.tg_id,
17
- UserDBM.tg_bot_last_action_dt,
18
- UserDBM.tg_data,
19
- ]
10
+ column_list = sqlalchemy.inspect(UserDBM).columns
20
11
  form_columns = [
21
12
  UserDBM.slug,
22
13
  UserDBM.email,
@@ -25,7 +16,9 @@ class UserMV(SimpleMV, model=UserDBM):
25
16
  UserDBM.tg_id,
26
17
  UserDBM.tg_bot_last_action_dt,
27
18
  UserDBM.tg_data,
19
+ UserDBM.extra_data
28
20
  ]
21
+ column_sortable_list = sqlalchemy.inspect(UserDBM).columns
29
22
  column_default_sort = [
30
23
  (UserDBM.creation_dt, True)
31
24
  ]
@@ -33,8 +26,5 @@ class UserMV(SimpleMV, model=UserDBM):
33
26
  UserDBM.id,
34
27
  UserDBM.long_id,
35
28
  UserDBM.slug,
36
- UserDBM.email,
37
- UserDBM.roles,
38
- UserDBM.is_active,
39
29
  UserDBM.tg_id,
40
30
  ]