arpakitlib 1.8.101__py3-none-any.whl → 1.8.103__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 (22) hide show
  1. arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json +1 -1
  2. arpakitlib/_arpakit_project_template_v_5/command/show_arpakitlib_project_template_info.py +1 -1
  3. arpakitlib/_arpakit_project_template_v_5/command/start_api.py +7 -0
  4. arpakitlib/_arpakit_project_template_v_5/command/start_api_for_prod.py +7 -0
  5. arpakitlib/_arpakit_project_template_v_5/command/start_api_with_reload.py +7 -0
  6. arpakitlib/_arpakit_project_template_v_5/command/start_operation_executor_workers_mode_async_task.py +24 -0
  7. arpakitlib/_arpakit_project_template_v_5/command/{start_operation_executor_workers.py → start_operation_executor_workers_mode_thread.py} +1 -0
  8. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py +1 -1
  9. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user.py +1 -0
  10. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py +1 -0
  11. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py +10 -1
  12. arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/verification_code.py +53 -0
  13. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +1 -0
  14. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py +18 -2
  15. arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/verification_code.py +101 -0
  16. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/arpakitlib_project_template_info.py +1 -1
  17. {arpakitlib-1.8.101.dist-info → arpakitlib-1.8.103.dist-info}/METADATA +1 -1
  18. {arpakitlib-1.8.101.dist-info → arpakitlib-1.8.103.dist-info}/RECORD +22 -19
  19. /arpakitlib/_arpakit_project_template_v_5/project/util/{arpakitlib_project_template.py → arpakitlib_project_template_util.py} +0 -0
  20. {arpakitlib-1.8.101.dist-info → arpakitlib-1.8.103.dist-info}/LICENSE +0 -0
  21. {arpakitlib-1.8.101.dist-info → arpakitlib-1.8.103.dist-info}/WHEEL +0 -0
  22. {arpakitlib-1.8.101.dist-info → arpakitlib-1.8.103.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "arpakitlib_project_template_version": "5",
3
- "arpakitlib_project_template_subversion": "22"
3
+ "arpakitlib_project_template_subversion": "23"
4
4
  }
@@ -1,4 +1,4 @@
1
- from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
1
+ from project.util.arpakitlib_project_template_util import get_arpakitlib_project_template_info
2
2
 
3
3
 
4
4
  def __command():
@@ -1,11 +1,18 @@
1
1
  import uvicorn
2
2
 
3
+ from arpakitlib.ar_base_worker_util import safe_run_worker_in_background, SafeRunInBackgroundModes
3
4
  from project.core.settings import get_cached_settings
4
5
  from project.core.util import setup_logging
6
+ from project.operation_execution.scheduled_operation_creator_worker import create_scheduled_operation_creator_worker
5
7
 
6
8
 
7
9
  def __command():
8
10
  setup_logging()
11
+ if get_cached_settings().api_start_scheduled_operation_creator_worker:
12
+ _ = safe_run_worker_in_background(
13
+ worker=create_scheduled_operation_creator_worker(),
14
+ mode=SafeRunInBackgroundModes.thread
15
+ )
9
16
  uvicorn.run(
10
17
  "project.api.asgi:app",
11
18
  port=get_cached_settings().api_port,
@@ -1,11 +1,18 @@
1
1
  import uvicorn
2
2
 
3
+ from arpakitlib.ar_base_worker_util import safe_run_worker_in_background, SafeRunInBackgroundModes
3
4
  from project.core.settings import get_cached_settings
4
5
  from project.core.util import setup_logging
6
+ from project.operation_execution.scheduled_operation_creator_worker import create_scheduled_operation_creator_worker
5
7
 
6
8
 
7
9
  def __command():
8
10
  setup_logging()
11
+ if get_cached_settings().api_start_scheduled_operation_creator_worker:
12
+ _ = safe_run_worker_in_background(
13
+ worker=create_scheduled_operation_creator_worker(),
14
+ mode=SafeRunInBackgroundModes.thread
15
+ )
9
16
  uvicorn.run(
10
17
  app="project.api.asgi:app",
11
18
  host="127.0.0.1",
@@ -1,11 +1,18 @@
1
1
  import uvicorn
2
2
 
3
+ from arpakitlib.ar_base_worker_util import SafeRunInBackgroundModes, safe_run_worker_in_background
3
4
  from project.core.settings import get_cached_settings
4
5
  from project.core.util import setup_logging
6
+ from project.operation_execution.scheduled_operation_creator_worker import create_scheduled_operation_creator_worker
5
7
 
6
8
 
7
9
  def __command():
8
10
  setup_logging()
11
+ if get_cached_settings().api_start_scheduled_operation_creator_worker:
12
+ _ = safe_run_worker_in_background(
13
+ worker=create_scheduled_operation_creator_worker(),
14
+ mode=SafeRunInBackgroundModes.thread
15
+ )
9
16
  uvicorn.run(
10
17
  "project.api.asgi:app",
11
18
  port=get_cached_settings().api_port,
@@ -0,0 +1,24 @@
1
+ import asyncio
2
+
3
+ from arpakitlib.ar_base_worker_util import safe_run_workers_in_background, SafeRunInBackgroundModes
4
+ from project.core.util import setup_logging
5
+ from project.operation_execution.operation_executor_worker import OperationExecutorWorker
6
+ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
7
+
8
+
9
+ async def __async_command():
10
+ setup_logging()
11
+ workers = []
12
+ for i in range(int(input("amount of workers: "))):
13
+ workers.append(OperationExecutorWorker(
14
+ sqlalchemy_db=get_cached_sqlalchemy_db(),
15
+ ))
16
+ async_tasks = safe_run_workers_in_background(
17
+ workers=workers,
18
+ mode=SafeRunInBackgroundModes.async_task
19
+ )
20
+ await asyncio.gather(*async_tasks)
21
+
22
+
23
+ if __name__ == '__main__':
24
+ asyncio.run(__async_command())
@@ -1,4 +1,5 @@
1
1
  from arpakitlib.ar_base_worker_util import safe_run_workers_in_background, SafeRunInBackgroundModes
2
+
2
3
  from project.core.util import setup_logging
3
4
  from project.operation_execution.operation_executor_worker import OperationExecutorWorker
4
5
  from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
@@ -6,7 +6,7 @@ from project.api.authorize import require_user_token_dbm_api_authorize_middlewar
6
6
  api_authorize, require_api_key_dbm_api_authorize_middleware
7
7
  from project.api.schema.out.common.error import ErrorCommonSO
8
8
  from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
9
- from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
9
+ from project.util.arpakitlib_project_template_util import get_arpakitlib_project_template_info
10
10
 
11
11
  api_router = APIRouter()
12
12
 
@@ -12,6 +12,7 @@ class User1ClientSO(SimpleDBMClientSO):
12
12
  username: str | None
13
13
  roles: list[str]
14
14
  is_active: bool
15
+ is_verified: bool
15
16
  tg_id: int | None
16
17
  tg_bot_last_action_dt: dt.datetime | None
17
18
  tg_data: dict[str, Any]
@@ -4,3 +4,4 @@ from project.sqladmin_.model_view.operation import OperationMV
4
4
  from project.sqladmin_.model_view.story_log import StoryLogMV
5
5
  from project.sqladmin_.model_view.user import UserMV
6
6
  from project.sqladmin_.model_view.user_token import UserTokenMV
7
+ from project.sqladmin_.model_view.verification_code import VerificationCodeMV
@@ -9,7 +9,16 @@ class StoryLogMV(SimpleMV, model=StoryLogDBM):
9
9
  name = "StoryLog"
10
10
  name_plural = "StoryLogs"
11
11
  icon = "fa-solid fa-history"
12
- column_list = sqlalchemy.inspect(StoryLogDBM).columns
12
+ column_list = [
13
+ StoryLogDBM.id,
14
+ StoryLogDBM.long_id,
15
+ StoryLogDBM.slug,
16
+ StoryLogDBM.creation_dt,
17
+ StoryLogDBM.level,
18
+ StoryLogDBM.type,
19
+ StoryLogDBM.title,
20
+ StoryLogDBM.extra_data
21
+ ]
13
22
  form_columns = [
14
23
  StoryLogDBM.slug,
15
24
  StoryLogDBM.level,
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ import sqlalchemy
4
+
5
+ from project.sqladmin_.model_view import SimpleMV
6
+ from project.sqladmin_.util.etc import format_datetime_, format_json_for_preview_, format_json_
7
+ from project.sqlalchemy_db_.sqlalchemy_model import VerificationCodeDBM
8
+
9
+
10
+ class VerificationCodeMV(SimpleMV, model=VerificationCodeDBM):
11
+ name = "VerificationCode"
12
+ name_plural = "VerificationCodes"
13
+ icon = "fa-solid fa-envelope"
14
+ column_list = [
15
+ VerificationCodeDBM.id,
16
+ VerificationCodeDBM.long_id,
17
+ VerificationCodeDBM.slug,
18
+ VerificationCodeDBM.creation_dt,
19
+ VerificationCodeDBM.type,
20
+ VerificationCodeDBM.value,
21
+ VerificationCodeDBM.recipient,
22
+ VerificationCodeDBM.user,
23
+ VerificationCodeDBM.is_active,
24
+ VerificationCodeDBM.extra_data
25
+ ]
26
+ form_columns = [
27
+ VerificationCodeDBM.slug,
28
+ VerificationCodeDBM.type,
29
+ VerificationCodeDBM.value,
30
+ VerificationCodeDBM.recipient,
31
+ VerificationCodeDBM.user,
32
+ VerificationCodeDBM.is_active,
33
+ VerificationCodeDBM.extra_data
34
+ ]
35
+ column_sortable_list = sqlalchemy.inspect(VerificationCodeDBM).columns
36
+ column_default_sort = [
37
+ (VerificationCodeDBM.creation_dt, True)
38
+ ]
39
+ column_searchable_list = [
40
+ VerificationCodeDBM.id,
41
+ VerificationCodeDBM.long_id,
42
+ VerificationCodeDBM.slug,
43
+ VerificationCodeDBM.value,
44
+ VerificationCodeDBM.recipient,
45
+ ]
46
+ column_formatters = {
47
+ VerificationCodeDBM.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
48
+ VerificationCodeDBM.extra_data: lambda m, _: format_json_for_preview_(m.extra_data)
49
+ }
50
+ column_formatters_detail = {
51
+ VerificationCodeDBM.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
52
+ VerificationCodeDBM.extra_data: lambda m, a: format_json_(m.extra_data),
53
+ }
@@ -6,6 +6,7 @@ from project.sqlalchemy_db_.sqlalchemy_model.operation import OperationDBM
6
6
  from project.sqlalchemy_db_.sqlalchemy_model.story_log import StoryLogDBM
7
7
  from project.sqlalchemy_db_.sqlalchemy_model.user import UserDBM
8
8
  from project.sqlalchemy_db_.sqlalchemy_model.user_token import UserTokenDBM
9
+ from project.sqlalchemy_db_.sqlalchemy_model.verification_code import VerificationCodeDBM
9
10
 
10
11
  if __name__ == '__main__':
11
12
  print(get_string_info_from_declarative_base(SimpleDBM))
@@ -5,16 +5,18 @@ from typing import TYPE_CHECKING, Any
5
5
  from uuid import uuid4
6
6
 
7
7
  import sqlalchemy
8
+ from email_validator import validate_email
9
+ from sqlalchemy.orm import Mapped, mapped_column, relationship, validates
10
+
8
11
  from arpakitlib.ar_datetime_util import now_utc_dt
9
12
  from arpakitlib.ar_enumeration_util import Enumeration
10
13
  from arpakitlib.ar_str_util import make_none_if_blank
11
14
  from arpakitlib.ar_type_util import raise_for_type
12
- from email_validator import validate_email
13
15
  from project.sqlalchemy_db_.sqlalchemy_model.common import SimpleDBM
14
- from sqlalchemy.orm import Mapped, mapped_column, relationship, validates
15
16
 
16
17
  if TYPE_CHECKING:
17
18
  from project.sqlalchemy_db_.sqlalchemy_model.user_token import UserTokenDBM
19
+ from project.sqlalchemy_db_.sqlalchemy_model.verification_code import VerificationCodeDBM
18
20
 
19
21
 
20
22
  def generate_default_user_password() -> str:
@@ -55,6 +57,13 @@ class UserDBM(SimpleDBM):
55
57
  insert_default=True,
56
58
  server_default="true",
57
59
  )
60
+ is_verified: Mapped[bool] = mapped_column(
61
+ sqlalchemy.Boolean,
62
+ nullable=False,
63
+ index=True,
64
+ insert_default=False,
65
+ server_default="false",
66
+ )
58
67
  password: Mapped[str | None] = mapped_column(
59
68
  sqlalchemy.TEXT,
60
69
  nullable=True,
@@ -87,6 +96,13 @@ class UserDBM(SimpleDBM):
87
96
  foreign_keys="UserTokenDBM.user_id",
88
97
  cascade="all, delete-orphan"
89
98
  )
99
+ verification_codes: Mapped[list[VerificationCodeDBM]] = relationship(
100
+ "VerificationCodeDBM",
101
+ uselist=True,
102
+ back_populates="user",
103
+ foreign_keys="VerificationCodeDBM.user_id",
104
+ cascade="all, delete-orphan"
105
+ )
90
106
 
91
107
  def __repr__(self) -> str:
92
108
  parts = [f"id={self.id}"]
@@ -0,0 +1,101 @@
1
+ from __future__ import annotations
2
+
3
+ from random import randint
4
+ from typing import TYPE_CHECKING
5
+
6
+ import sqlalchemy
7
+ from sqlalchemy.orm import Mapped, mapped_column, relationship, validates
8
+
9
+ from arpakitlib.ar_enumeration_util import Enumeration
10
+ from arpakitlib.ar_str_util import make_none_if_blank
11
+ from project.sqlalchemy_db_.sqlalchemy_model.common import SimpleDBM
12
+
13
+ if TYPE_CHECKING:
14
+ from project.sqlalchemy_db_.sqlalchemy_model.user import UserDBM
15
+
16
+
17
+ def generate_default_verification_code_value() -> str:
18
+ alphabet: list = list("JZSDQWRLGFZX" + "123456789")
19
+ return "".join(alphabet[randint(0, len(alphabet) - 1)] for _ in range(7))
20
+
21
+
22
+ class VerificationCodeDBM(SimpleDBM):
23
+ __tablename__ = "verification_code"
24
+
25
+ class Types(Enumeration):
26
+ register_or_authenticate = "register_or_authenticate"
27
+ reset_email = "reset_email"
28
+
29
+ type: Mapped[str] = mapped_column(
30
+ sqlalchemy.TEXT,
31
+ nullable=False,
32
+ index=True,
33
+ )
34
+ value: Mapped[str] = mapped_column(
35
+ sqlalchemy.TEXT,
36
+ nullable=False,
37
+ index=True,
38
+ insert_default=generate_default_verification_code_value,
39
+ server_default=sqlalchemy.func.gen_random_uuid(),
40
+ )
41
+ recipient: Mapped[str | None] = mapped_column(
42
+ sqlalchemy.TEXT,
43
+ nullable=True,
44
+ index=True,
45
+ )
46
+ user_id: Mapped[int | None] = mapped_column(
47
+ sqlalchemy.BIGINT,
48
+ sqlalchemy.ForeignKey("user.id", ondelete="CASCADE"),
49
+ nullable=True,
50
+ index=True,
51
+ )
52
+ is_active: Mapped[bool] = mapped_column(
53
+ sqlalchemy.BOOLEAN,
54
+ nullable=False,
55
+ index=True,
56
+ insert_default=True,
57
+ server_default="true"
58
+ )
59
+
60
+ # one to many
61
+ user: Mapped[UserDBM | None] = relationship(
62
+ "UserDBM",
63
+ uselist=False,
64
+ back_populates="verification_codes",
65
+ foreign_keys=[user_id]
66
+ )
67
+
68
+ def __repr__(self) -> str:
69
+ parts = [
70
+ f"id={self.id}",
71
+ f"type={self.type}"
72
+ ]
73
+ if self.recipient is not None:
74
+ parts.append(f"recipient={self.recipient}")
75
+ elif self.user_id is not None:
76
+ parts.append(f"user_id={self.user_id}")
77
+ return f"{self.entity_name} ({', '.join(parts)})"
78
+
79
+ @validates("type")
80
+ def _validate_type(self, key, value, *args, **kwargs):
81
+ if not isinstance(value, str):
82
+ raise ValueError(f"{key=}, {value=}, value is not str")
83
+ value = value.strip()
84
+ if not value:
85
+ raise ValueError(f"{key=}, {value=}, value is empty")
86
+ if value not in self.Types.values_list():
87
+ raise ValueError(f"{value} not in {self.Types.values_list()}")
88
+ return value
89
+
90
+ @validates("recipient")
91
+ def _validate_recipient(self, key, value, *args, **kwargs):
92
+ if value is None:
93
+ return None
94
+ if not isinstance(value, str):
95
+ raise ValueError(f"{key=}, {value=}, value is not str")
96
+ value = make_none_if_blank(value.strip())
97
+ return value
98
+
99
+ @property
100
+ def sdp_allowed_types(self) -> list[str]:
101
+ return self.Types.values_list()
@@ -7,7 +7,7 @@ from project.tg_bot.const import AdminTgBotCommands
7
7
  from project.tg_bot.filter_.is_private_chat import IsPrivateChatTgBotFilter
8
8
  from project.tg_bot.filter_.user_roles_has_admin import UserRolesHasAdminTgBotFilter
9
9
  from project.tg_bot.middleware.common import MiddlewareDataTgBot
10
- from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
10
+ from project.util.arpakitlib_project_template_util import get_arpakitlib_project_template_info
11
11
 
12
12
  tg_bot_router = aiogram.Router()
13
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.101
3
+ Version: 1.8.103
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -8,7 +8,7 @@ arpakitlib/_arpakit_project_template_v_5/alembic/env.py,sha256=Qesmnj5A2kB-Doeuf
8
8
  arpakitlib/_arpakit_project_template_v_5/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
9
9
  arpakitlib/_arpakit_project_template_v_5/alembic/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  arpakitlib/_arpakit_project_template_v_5/alembic.ini,sha256=8fuyeEvGBiPGbxEFy8ISBV3xX_fgVmuhEGpB10_B5Uo,3733
11
- arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=ZneHlEsk8wRJSuHj4ZP4GeF5uLsCc2qGMz5Ibx8EJms,98
11
+ arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=nA0stvcyYF7cr-ggkBiG3M0ZUSctM3U6PsIFUSFqX40,98
12
12
  arpakitlib/_arpakit_project_template_v_5/command/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  arpakitlib/_arpakit_project_template_v_5/command/alembic_history.sh,sha256=OMnDNtHIksGh9iavWnzbtxcudZW4vjdcISsBXvzZSPw,22
14
14
  arpakitlib/_arpakit_project_template_v_5/command/alembic_revision_autogenerate.sh,sha256=yW2i-SBOtBx15Ya0poVQqKkJM5t2JZp06r9AEW-DmGE,46
@@ -56,14 +56,15 @@ arpakitlib/_arpakit_project_template_v_5/command/remove_operations.py,sha256=l1B
56
56
  arpakitlib/_arpakit_project_template_v_5/command/remove_story_logs.py,sha256=l-whsYahKY6ssk-c24ufiybF-U24iFqMdkNlnlASm2U,498
57
57
  arpakitlib/_arpakit_project_template_v_5/command/rm_all_records_in_json_db.py,sha256=qF5c_Aso7XpNcBZOInz7MWXX9Wm8L73rcOZBKGXlFfg,326
58
58
  arpakitlib/_arpakit_project_template_v_5/command/set_tg_bot_commands.py,sha256=6HbuL6acw-U8vkUdqLVIEffe_FcBsDWRKZ90AakZbv8,456
59
- arpakitlib/_arpakit_project_template_v_5/command/show_arpakitlib_project_template_info.py,sha256=EYpiZkzVKCoZa_iWbh2LnhqEV88HQgbhS84KVZFpIDo,204
59
+ arpakitlib/_arpakit_project_template_v_5/command/show_arpakitlib_project_template_info.py,sha256=AoemyIrxS49kp34jsuJHKTa4Cvyycl17woXwk8oy9nU,209
60
60
  arpakitlib/_arpakit_project_template_v_5/command/show_settings.py,sha256=c07DRqJ08tPm2nFSLAxm_h1dNSQIbWT_hL65g869CWw,264
61
61
  arpakitlib/_arpakit_project_template_v_5/command/show_sqlalchemy_db_table_name_to_amount.py,sha256=4KCP-ud5tDKLdTxJLZTDnPzbbNwY33XIUR_qRXjbkH8,410
62
- arpakitlib/_arpakit_project_template_v_5/command/start_api.py,sha256=UoPkeKfSh1Ekq2Gxf3fv8aHrSVF_Xi4C14eBliXU6x0,364
63
- arpakitlib/_arpakit_project_template_v_5/command/start_api_for_prod.py,sha256=L1Qa5_YDH-YYs31WJIT0fcgj_vgeUopXKD9vzAL105E,368
64
- arpakitlib/_arpakit_project_template_v_5/command/start_api_with_reload.py,sha256=YVKe6uP4cs1ow4Bd2ptiDRcHv_eGHaABlp2SgfMI2oM,363
62
+ arpakitlib/_arpakit_project_template_v_5/command/start_api.py,sha256=fl-dkm2I3ModQXjGG6VrP6vUFciEcRW_ORFG3VX8jH8,821
63
+ arpakitlib/_arpakit_project_template_v_5/command/start_api_for_prod.py,sha256=T0Gqv3-Vrtx6x_3vRaFTvsyWwpZgfDnqtnQcZN3eqU8,825
64
+ arpakitlib/_arpakit_project_template_v_5/command/start_api_with_reload.py,sha256=d6iIQY4_qjcYBoYmkWXbPVVW5HD5IUb4FOvf4YrzObM,820
65
65
  arpakitlib/_arpakit_project_template_v_5/command/start_operation_executor_worker.py,sha256=X8dE5OcTEVKjbcXdU0QMstXbi8RyYWPzATHtbQHyBIs,413
66
- arpakitlib/_arpakit_project_template_v_5/command/start_operation_executor_workers.py,sha256=pVfnAwSKKupVHinwqXAkQOkjwZ-WCRuO7AUGjfAQhzs,717
66
+ arpakitlib/_arpakit_project_template_v_5/command/start_operation_executor_workers_mode_async_task.py,sha256=C5aoJmI9LB9d25g_ZTvRccwkWUglUdcCcPb-03HoA0s,793
67
+ arpakitlib/_arpakit_project_template_v_5/command/start_operation_executor_workers_mode_thread.py,sha256=QjInoDY7XGQZCs2A-Kh5Ul0P4CgcS9Tom6FfXcseeFs,718
67
68
  arpakitlib/_arpakit_project_template_v_5/command/start_scheduled_operation_creator_worker.py,sha256=NuimX6etxQ9EU0VYOWw43AGiuOsZf8a4wilAd3ZzmRY,329
68
69
  arpakitlib/_arpakit_project_template_v_5/command/start_sqladmin.py,sha256=g3kNKPR4X-PKpiSe4oFLHbZ-EJIwmWUOK6a5FABat_Y,375
69
70
  arpakitlib/_arpakit_project_template_v_5/command/start_sqladmin_for_prod.py,sha256=g3kNKPR4X-PKpiSe4oFLHbZ-EJIwmWUOK6a5FABat_Y,375
@@ -98,7 +99,7 @@ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/__init__.py,sh
98
99
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/check_sqlalchemy_db.py,sha256=JGe2HvUSvXaIOaFG0ezNBhANCjvHJJFIG3aBtWF2dTY,1218
99
100
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/clear_log_file.py,sha256=35EiCIS8p-4k4pyZabAkAxNaSMFaDsK47knSaLVgpps,1353
100
101
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/create_operation.py,sha256=i-a_i8h2EfJdkmDye9mamummXOAuHVNiaEsnCVyAdxA,2357
101
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py,sha256=XlVZ1yv-aJ6MqkW-TQ_D2Ot6q3lYCju7_dVlEmvf8jQ,1259
102
+ arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py,sha256=rkeybEoY2gpcw45Mgyof5pboKkclG78t460H11DPlNw,1264
102
103
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py,sha256=2Lh7EbVylDyI1RfUR0P4D0kPTkveLV2i2wEXo3EyIEY,1194
103
104
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_log_file.py,sha256=0RWxz0N_Ir3lrzHqOmh3EcrCAN8drIngkqq6mk5sq9U,1161
104
105
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_operation.py,sha256=y82PxkcBTzSTlM_VYboFN9kLJPhOFwZCAjvyZPhpuas,2290
@@ -145,7 +146,7 @@ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/__init__.
145
146
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py,sha256=vpE_bjT7fdaWe0LQxuVwEy7ZDSyVe4PrcX-gUTRWZbU,539
146
147
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/complicated_user_1.py,sha256=G7rdFpfIK13w2nQVuAASqvtPm9jHPzt59A_-dtJfle4,763
147
148
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/complicated_user_token_1.py,sha256=XhM0YMWK1fJCzTGgnSsEKFynx8Cs6JwygmmF4C1_Jts,714
148
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user.py,sha256=l_UFFfNJLoWg5z_B5ezfAZC2IehcbrWc1BnfyP0lBko,1028
149
+ arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user.py,sha256=Cc4eL8oUgkgPLB3X_CGL7Z7foxtvcdhtkVkZ7Z34X1A,1050
149
150
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user_token.py,sha256=Emhpawd_jGWu9xzyYyXk9h0YDSnHGDkyfP-hIgenzpA,508
150
151
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
152
  arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/common/datetime_.py,sha256=YFo29Qc7JMVq-OR398kPy4ypjh9kYAxPuZZUsobhDdc,942
@@ -229,25 +230,27 @@ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/admin_authorize.py,sh
229
230
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/asgi.py,sha256=DRlRPkcOGXOccfP73oKEXolZTsc5VWdQgEG-qoW03ms,99
230
231
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/create_sqladmin_app.py,sha256=x5F8--5KA4cmTrb6kAAmp6fVd2TiqxPOzxqUkSEhSG4,1298
231
232
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/event.py,sha256=LjAUYNlsX9Sj_QLMzYuTQbbYYbIMHhbsSjTXt-G7lOE,849
232
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py,sha256=MtEk37LR9xg5XltEbIAw1hh74BsS70I2G3C21QSbjVQ,357
233
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py,sha256=dc_swzjkRDj85SWQ3cGGgsrp_cq5evUYQYUg0g7C5nw,435
233
234
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py,sha256=SNk66VApMLgfOHB8grLDiYnm8KYZTmw7eoOdBmkZCfw,1193
234
235
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=US1tueTCPvAdse6TLT6yRLUHbvwGGagApYhFJzE_6Yc,576
235
236
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=lIwqYRd2n-wPAKtDlPpNqNHAcSxJDMbtfh8upShqN1I,2112
236
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py,sha256=yTBHnL8em7d96o-tL2OsKQEryDQfDYFeEUpkNTjfHQI,1236
237
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py,sha256=8N9ahbCzNVczqgO_g0luRqP8luCv5bmCLoz66UYZ0mU,1427
237
238
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=7pjzmIe-Nit2Bk3GL4H7sLem46UcHN1sLc5ZrWd3xQQ,1679
238
239
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user_token.py,sha256=q1kjGEkNvaMmbxnpMmR66qF1CdkIChC_SF3YVJnYsks,1529
240
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/verification_code.py,sha256=llFZ3KDtv0M-wAC77IGAiF9TM8fO83w1xlTWr_t-vHk,1900
239
241
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
242
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/util/etc.py,sha256=jm65ZB0K8e6WpgcL2Y6pxcIuQjioIyMtBIOOFbbWfgk,1070
241
243
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
244
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/const.py,sha256=dcvj5C9E2F2KCsGZPBBncQf_EvVJAC1qQgnyD8P4ZEw,6
243
245
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_db.py,sha256=1y3FaMFzm_5UM2poqtBve_UP_mh1vjs--krq6yO8PsA,742
244
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py,sha256=btSjCQ7RJqomeXzYs9HePCu1dZHs0z6-RuboYKG89_8,598
246
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py,sha256=zRK-ao92u6Q-NNTtsPycTVEjzRjK5BOXgsUZRtNblpM,688
245
247
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py,sha256=4Y4zgKzty_7xqqJWg4DDiS0nbDXzQVtq2r6d0lunnTw,2025
246
248
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=_ddBled1XX6YR3LxoWmRlZjwMRHlBmQRBVg0vGcPe_8,3228
247
249
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py,sha256=VkaUFYgnpGfQbJP_APuCRwzzQRr7yGgnEbbNlsizwgU,5912
248
250
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=hqkXH7oV-BT8pRDzrDYWYseVFg2J6ca-WYyiucPOiH4,2395
249
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=xBU_DPq7S_2gv15LOhiTttL5dZzPTbcjpSNU8yY9ZPo,6998
251
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=xdayFM48y4OPAd5HVNgWHvdujiO62fEj3XDcquwTrBk,7533
250
252
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user_token.py,sha256=y97em7M2WfDV8Wm7GMrIejalk9NkCsZDGK-sETkXscM,1943
253
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/verification_code.py,sha256=13aDT9m2l9zaJXqHZi0MsoY--5BNWhbw0O9uQJAW16E,3136
251
254
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/util.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
255
  arpakitlib/_arpakit_project_template_v_5/project/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
253
256
  arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_api_keys.py,sha256=9F2bMfymaqx_Czh_tF945BKpKqNrVNjSIfCQl13Dkxw,911
@@ -296,7 +299,7 @@ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/middleware/init_user.py,
296
299
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/middleware/uil.py,sha256=66v3pHu8nhJ8pJayXaHNKjmPVK4fKUCNWilOM0yzNKg,319
297
300
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
298
301
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/arpakitlib_project_template_info.py,sha256=h8HPMP2Mu8NdDAbyoPDn8Ne1_hBPcvN9pA65nEEIGME,1069
302
+ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/arpakitlib_project_template_info.py,sha256=6eEjOxAXKys-eRlK5O9wkJOSM0ubrJ21feaMV-UdPWE,1074
300
303
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/clear_log_file.py,sha256=UTmkAes7u87n5v_6wAu3ukzijY2xC1pW1pS9tD0Wd_0,1345
301
304
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/current_state.py,sha256=20ZosYuI7sR_2H2C_EpM8SqTLdJdjc7O-6FhbSpQuh4,921
302
305
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/drop_sqlalchemy_db.py,sha256=g8B_68y_VEJUBlMfsAOQ-IGy54e7RUwKmUMBl-jQsvM,1274
@@ -337,7 +340,7 @@ arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/etc.py,sha256=47DEQ
337
340
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/notify_admins.py,sha256=P-pqF5TPK3T_EgtGYk717W7tFVOc4xNuccFehYv-054,2095
338
341
  arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py,sha256=gCcc-nWyu_MGKkhFSs9qk44el99hCzJiJBLksyN3nV8,3488
339
342
  arpakitlib/_arpakit_project_template_v_5/project/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
340
- arpakitlib/_arpakit_project_template_v_5/project/util/arpakitlib_project_template.py,sha256=syA_IuszHVub0zm0sVdB4_7rPJXwXRW4JmQ4qHbjXPk,396
343
+ arpakitlib/_arpakit_project_template_v_5/project/util/arpakitlib_project_template_util.py,sha256=syA_IuszHVub0zm0sVdB4_7rPJXwXRW4JmQ4qHbjXPk,396
341
344
  arpakitlib/_arpakit_project_template_v_5/project/util/etc.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
342
345
  arpakitlib/ar_additional_model_util.py,sha256=GFg-glLCxH9X95R2bhTJsscVwv37FgE1qbaAAyXrnIE,917
343
346
  arpakitlib/ar_aiogram_util.py,sha256=4bizX5Xg-E2-r2TXXGQGanJozsIWPVf5luO3vKUN8p8,8471
@@ -387,8 +390,8 @@ arpakitlib/ar_ssh_runner_util.py,sha256=yvAwza480MkHKvLkDEsR7JNh2bYNs6P9rCVo4NA8
387
390
  arpakitlib/ar_str_util.py,sha256=CAv0wH8nP5Ja59S-hEdmNhNrM_Fwy935d0zntLpJkx8,4309
388
391
  arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,4049
389
392
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
390
- arpakitlib-1.8.101.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
391
- arpakitlib-1.8.101.dist-info/METADATA,sha256=5q2R3PZ1Dl8y5OnfmjaCSxE1q_acj9SFDf9euTsjmMk,3471
392
- arpakitlib-1.8.101.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
393
- arpakitlib-1.8.101.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
394
- arpakitlib-1.8.101.dist-info/RECORD,,
393
+ arpakitlib-1.8.103.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
394
+ arpakitlib-1.8.103.dist-info/METADATA,sha256=bvrDWJ9PB8qs-MtnM1xmRjajmyRfTtJsd21aX1zAx-w,3471
395
+ arpakitlib-1.8.103.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
396
+ arpakitlib-1.8.103.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
397
+ arpakitlib-1.8.103.dist-info/RECORD,,