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.
- arpakitlib/_arpakit_project_template_v_5/example.env +1 -3
- arpakitlib/_arpakit_project_template_v_5/project/additional_model/common.py +0 -3
- arpakitlib/_arpakit_project_template_v_5/project/api/auth.py +59 -20
- arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py +1 -5
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_arpakitlib_project_template_info.py +8 -4
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py +7 -3
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_story_log.py +46 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/main_router.py +12 -1
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py +7 -3
- arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/reinit_sqlalchemy_db.py +35 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user.py +33 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_current_user_token.py +33 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/router/client/get_errors_info.py +6 -4
- arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py +11 -1
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/common.py +7 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py +2 -2
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py +2 -2
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/common.py +7 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/{admin → client}/user.py +5 -5
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/client/user_token.py +14 -0
- arpakitlib/_arpakit_project_template_v_5/project/core/settings.py +0 -2
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py +13 -3
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +19 -4
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py +1 -1
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py +14 -6
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/const.py +1 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/about.py +1 -1
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/general/author.py +31 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/support.py +1 -1
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py +4 -3
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/set_tg_bot_commands.py +8 -0
- {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/METADATA +1 -1
- {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/RECORD +45 -40
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user_token.py +0 -14
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/__init__.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/error_handler.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/healthcheck.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/hello_world.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_callback_query.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_inline_query.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_message.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/remove_message.py +0 -0
- /arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/start.py +0 -0
- {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/LICENSE +0 -0
- {arpakitlib-1.8.20.dist-info → arpakitlib-1.8.21.dist-info}/WHEEL +0 -0
- {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
|
-
#
|
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,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 =
|
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.
|
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
|
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
|
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
|
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
|
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
|
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
|
261
|
-
|
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
|
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
|
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,
|
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
|
-
|
25
|
-
require_user_token_dbm_api_middleware(
|
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
|
-
|
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
|
-
|
25
|
-
require_user_token_dbm_api_middleware(
|
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
|
-
|
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
|
-
|
24
|
-
require_user_token_dbm_api_middleware(
|
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,
|
5
|
-
|
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
|
-
|
25
|
-
require_user_token_dbm_api_middleware(
|
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
|
23
|
-
return cls.model_validate(
|
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
|
17
|
-
return cls.model_validate(
|
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.
|
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
|
11
|
-
|
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
|
22
|
-
return cls.model_validate(
|
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"]
|
arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py
CHANGED
@@ -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(
|
38
|
-
|
39
|
-
|
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={},
|
arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py
CHANGED
@@ -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,
|
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,
|
47
|
+
postgresql.JSON,
|
48
|
+
insert_default={},
|
49
|
+
server_default="{}",
|
50
|
+
nullable=False
|
36
51
|
)
|
37
52
|
|
38
53
|
|
@@ -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
|
47
|
+
res = ":warning: <b>Сообщение не обработано</b> :warning:"
|
40
48
|
return emojize(res.strip())
|
41
49
|
|
42
|
-
def
|
50
|
+
def about(self) -> str:
|
43
51
|
res = ":information: <b>О проекте</b>"
|
44
52
|
return emojize(res.strip())
|
45
53
|
|
46
|
-
def
|
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:
|
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().
|
73
|
+
print(get_cached_client_tg_bot_blank().author())
|
66
74
|
|
67
75
|
|
68
76
|
if __name__ == '__main__':
|
@@ -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())
|
@@ -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.
|
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
|
-
#
|
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
|
|
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
92
|
-
arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/get_auth_data.py,sha256=
|
93
|
-
arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/
|
94
|
-
arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/
|
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/
|
97
|
-
arpakitlib/_arpakit_project_template_v_5/project/api/router/client/
|
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=
|
116
|
-
arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/operation.py,sha256=
|
117
|
-
arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/story_log.py,sha256=
|
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=
|
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=
|
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=
|
209
|
-
arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=
|
210
|
-
arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=
|
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=
|
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=
|
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/
|
273
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
274
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
275
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
276
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
277
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
278
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
279
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
280
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
281
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
282
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
283
|
-
arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/
|
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=
|
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.
|
345
|
-
arpakitlib-1.8.
|
346
|
-
arpakitlib-1.8.
|
347
|
-
arpakitlib-1.8.
|
348
|
-
arpakitlib-1.8.
|
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())
|
/arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/__init__.py
RENAMED
File without changes
|
/arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/error_handler.py
RENAMED
File without changes
|
/arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/healthcheck.py
RENAMED
File without changes
|
/arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/hello_world.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
/arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/raw_message.py
RENAMED
File without changes
|
/arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/{client → general}/remove_message.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|