arpakitlib 1.8.107__py3-none-any.whl → 1.8.109__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.
@@ -0,0 +1,45 @@
1
+ import asyncio
2
+ from functools import lru_cache
3
+
4
+ import httpx
5
+ from arpakitlib.ar_logging_util import setup_normal_logging
6
+ from arpakitlib.ar_openai_api_client_util import EasyOpenAIAPIClient
7
+ from openai import OpenAI, AsyncOpenAI
8
+
9
+ from project.core.settings import get_cached_settings
10
+
11
+
12
+ def create_easy_openai_api_client() -> EasyOpenAIAPIClient | None:
13
+ if get_cached_settings().openai_api_key is None:
14
+ return None
15
+
16
+ return EasyOpenAIAPIClient(
17
+ open_ai=OpenAI(
18
+ api_key=get_cached_settings().openai_api_key,
19
+ base_url=get_cached_settings().openai_api_base_url,
20
+ timeout=httpx.Timeout(
21
+ timeout=60,
22
+ connect=15,
23
+ read=60,
24
+ write=60,
25
+ pool=15
26
+ )
27
+ ),
28
+ async_open_ai=AsyncOpenAI(
29
+ api_key=get_cached_settings().openai_api_key,
30
+ base_url=get_cached_settings().openai_api_base_url
31
+ )
32
+ )
33
+
34
+
35
+ @lru_cache()
36
+ def get_cached_easy_openai_api_client() -> EasyOpenAIAPIClient | None:
37
+ return create_easy_openai_api_client()
38
+
39
+
40
+ async def __async_example():
41
+ setup_normal_logging()
42
+
43
+
44
+ if __name__ == '__main__':
45
+ asyncio.run(__async_example())
@@ -173,6 +173,10 @@ class Settings(SimpleSettings):
173
173
  raise_for_type(self.local_timezone, str)
174
174
  return pytz.timezone(self.local_timezone)
175
175
 
176
+ openai_api_key: str | None = None
177
+
178
+ openai_api_base_url: str | None = "https://api.proxyapi.ru/openai/v1"
179
+
176
180
 
177
181
  @lru_cache()
178
182
  def get_cached_settings() -> Settings:
@@ -9,7 +9,26 @@ class ApiKeyMV(SimpleMV, model=ApiKeyDBM):
9
9
  name = "ApiKey"
10
10
  name_plural = "ApiKeys"
11
11
  icon = "fa-solid fa-key"
12
- column_list = sqlalchemy.inspect(ApiKeyDBM).columns
12
+ column_list = [
13
+ ApiKeyDBM.id,
14
+ ApiKeyDBM.long_id,
15
+ ApiKeyDBM.slug,
16
+ ApiKeyDBM.creation_dt,
17
+ ApiKeyDBM.title,
18
+ ApiKeyDBM.value,
19
+ ApiKeyDBM.is_active,
20
+ ApiKeyDBM.extra_data
21
+ ]
22
+ column_details_list = [
23
+ ApiKeyDBM.id,
24
+ ApiKeyDBM.long_id,
25
+ ApiKeyDBM.slug,
26
+ ApiKeyDBM.creation_dt,
27
+ ApiKeyDBM.title,
28
+ ApiKeyDBM.value,
29
+ ApiKeyDBM.is_active,
30
+ ApiKeyDBM.extra_data
31
+ ]
13
32
  form_columns = [
14
33
  ApiKeyDBM.slug,
15
34
  ApiKeyDBM.title,
@@ -22,8 +41,6 @@ class ApiKeyMV(SimpleMV, model=ApiKeyDBM):
22
41
  ]
23
42
  column_searchable_list = [
24
43
  ApiKeyDBM.id,
25
- ApiKeyDBM.long_id,
26
- ApiKeyDBM.slug,
27
44
  ApiKeyDBM.value,
28
45
  ]
29
46
  column_formatters = {
@@ -1,4 +1,5 @@
1
1
  import sqlalchemy
2
+ from sqladmin.fields import SelectField
2
3
 
3
4
  from project.sqladmin_.model_view.common import SimpleMV
4
5
  from project.sqladmin_.util.etc import format_datetime_, format_json_for_preview_, format_json_
@@ -9,7 +10,21 @@ class OperationMV(SimpleMV, model=OperationDBM):
9
10
  name = "Operation"
10
11
  name_plural = "Operations"
11
12
  icon = "fa-solid fa-gears"
12
- column_list = sqlalchemy.inspect(OperationDBM).columns
13
+ column_list = [
14
+ OperationDBM.id,
15
+ OperationDBM.long_id,
16
+ OperationDBM.slug,
17
+ OperationDBM.creation_dt,
18
+ OperationDBM.status,
19
+ OperationDBM.type,
20
+ OperationDBM.title,
21
+ OperationDBM.execution_start_dt,
22
+ OperationDBM.execution_finish_dt,
23
+ OperationDBM.input_data,
24
+ OperationDBM.output_data,
25
+ OperationDBM.error_data,
26
+ OperationDBM.extra_data
27
+ ]
13
28
  form_columns = [
14
29
  OperationDBM.slug,
15
30
  OperationDBM.status,
@@ -22,14 +37,22 @@ class OperationMV(SimpleMV, model=OperationDBM):
22
37
  OperationDBM.error_data,
23
38
  OperationDBM.extra_data
24
39
  ]
40
+ form_overrides = {
41
+ OperationDBM.status.key: SelectField
42
+ }
43
+ form_args = {
44
+ OperationDBM.status.key: {
45
+ "choices": [(status, status) for status in OperationDBM.Statuses.values_list()],
46
+ "description": "Выберите статус"
47
+ }
48
+ }
25
49
  column_sortable_list = sqlalchemy.inspect(OperationDBM).columns
26
50
  column_default_sort = [
27
51
  (OperationDBM.creation_dt, True)
28
52
  ]
29
53
  column_searchable_list = [
30
54
  OperationDBM.id,
31
- OperationDBM.long_id,
32
- OperationDBM.slug,
55
+ OperationDBM.long_id
33
56
  ]
34
57
  column_formatters = {
35
58
  OperationDBM.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
@@ -1,4 +1,5 @@
1
1
  import sqlalchemy
2
+ from wtforms import SelectMultipleField
2
3
 
3
4
  from project.sqladmin_.model_view.common import SimpleMV
4
5
  from project.sqladmin_.util.etc import format_datetime_, format_json_for_preview_, format_json_
@@ -36,6 +37,15 @@ class UserMV(SimpleMV, model=UserDBM):
36
37
  UserDBM.tg_bot_last_action_dt,
37
38
  UserDBM.extra_data
38
39
  ]
40
+ form_overrides = {
41
+ UserDBM.roles.key: SelectMultipleField
42
+ }
43
+ form_args = {
44
+ UserDBM.roles.key: {
45
+ "choices": [(role, role) for role in UserDBM.Roles.values_list()],
46
+ "description": "Выберите роли пользователя"
47
+ }
48
+ }
39
49
  column_sortable_list = sqlalchemy.inspect(UserDBM).columns
40
50
  column_default_sort = [
41
51
  (UserDBM.creation_dt, True)
@@ -2,7 +2,7 @@ import sqlalchemy
2
2
 
3
3
  from project.sqladmin_.model_view.common import SimpleMV
4
4
  from project.sqladmin_.util.etc import format_datetime_, format_json_for_preview_, format_json_
5
- from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM
5
+ from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM, UserDBM
6
6
 
7
7
 
8
8
  class UserTokenMV(SimpleMV, model=UserTokenDBM):
@@ -45,3 +45,11 @@ class UserTokenMV(SimpleMV, model=UserTokenDBM):
45
45
  UserTokenDBM.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
46
46
  UserTokenDBM.extra_data: lambda m, a: format_json_(m.extra_data),
47
47
  }
48
+ form_ajax_refs = {
49
+ UserTokenDBM.user.key: {
50
+ "fields": [UserDBM.id.key, UserDBM.email.key],
51
+ "placeholder": 'Search by id or email',
52
+ "minimum_input_length": 1,
53
+ "page_size": 10,
54
+ }
55
+ }
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import sqlalchemy
4
+ from sqladmin.fields import SelectField
4
5
 
5
6
  from project.sqladmin_.model_view import SimpleMV
6
7
  from project.sqladmin_.util.etc import format_datetime_, format_json_for_preview_, format_json_
@@ -32,16 +33,23 @@ class VerificationCodeMV(SimpleMV, model=VerificationCodeDBM):
32
33
  VerificationCodeDBM.is_active,
33
34
  VerificationCodeDBM.extra_data
34
35
  ]
36
+ form_overrides = {
37
+ VerificationCodeDBM.type.key: SelectField
38
+ }
39
+ form_args = {
40
+ VerificationCodeDBM.type.key: {
41
+ "choices": [(status, status) for status in VerificationCodeDBM.Types.values_list()],
42
+ "description": "Выберите тип"
43
+ }
44
+ }
35
45
  column_sortable_list = sqlalchemy.inspect(VerificationCodeDBM).columns
36
46
  column_default_sort = [
37
47
  (VerificationCodeDBM.creation_dt, True)
38
48
  ]
39
49
  column_searchable_list = [
40
50
  VerificationCodeDBM.id,
41
- VerificationCodeDBM.long_id,
42
- VerificationCodeDBM.slug,
43
51
  VerificationCodeDBM.value,
44
- VerificationCodeDBM.recipient,
52
+ VerificationCodeDBM.recipient
45
53
  ]
46
54
  column_formatters = {
47
55
  VerificationCodeDBM.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.107
3
+ Version: 1.8.109
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -168,9 +168,10 @@ arpakitlib/_arpakit_project_template_v_5/project/core/__init__.py,sha256=47DEQpj
168
168
  arpakitlib/_arpakit_project_template_v_5/project/core/cache_file_storage_in_dir.py,sha256=0lKPKvrs30DlAZwNS5ydPsQ9ETFLBjZqEcNv8LoQVCU,623
169
169
  arpakitlib/_arpakit_project_template_v_5/project/core/const.py,sha256=hgiiPIYL9543-eEnNAhZWYgX7ZzLKjOqRD0skkROSOw,951
170
170
  arpakitlib/_arpakit_project_template_v_5/project/core/dump_file_storage_in_dir.py,sha256=u3-vStMGaseMsRLuJmQK04UDhaez9vw6o5jyHb1fwNg,617
171
+ arpakitlib/_arpakit_project_template_v_5/project/core/easy_openai_api_client.py,sha256=NAwu0e7m4m2OVcZC0KBbgjiNxKmpIUofBzwTRbC1GBQ,1219
171
172
  arpakitlib/_arpakit_project_template_v_5/project/core/jinja2_templates.py,sha256=jCNLaBauGC7YNvZdTLNHuPp7hmRGt94O23Skg6ewo7o,352
172
173
  arpakitlib/_arpakit_project_template_v_5/project/core/media_file_storage_in_dir.py,sha256=fMofTsfJtA8pp5lEUhucEUu3PBsmj-elaRZzExDsdLI,623
173
- arpakitlib/_arpakit_project_template_v_5/project/core/settings.py,sha256=ZxBiE0cf7aywLhAz341MrRyjm4UeuE91Ja5JIjDZ9pU,5881
174
+ arpakitlib/_arpakit_project_template_v_5/project/core/settings.py,sha256=NlbGFZCR98hytoigP4E5TjazIUJt8NPSI0NZOmQ365A,5995
174
175
  arpakitlib/_arpakit_project_template_v_5/project/core/util.py,sha256=1ha9UrguVPsTSjoMHhVZVCD0_mNBfhIDGEvcG1nA4Zw,667
175
176
  arpakitlib/_arpakit_project_template_v_5/project/json_db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
177
  arpakitlib/_arpakit_project_template_v_5/project/json_db/json_db.py,sha256=tBML-z4Y7uY8f_0ggcxvlDNt15Sf93Jr_OUeHwWxqOA,724
@@ -231,13 +232,13 @@ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/asgi.py,sha256=DRlRPk
231
232
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/create_sqladmin_app.py,sha256=x5F8--5KA4cmTrb6kAAmp6fVd2TiqxPOzxqUkSEhSG4,1298
232
233
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/event.py,sha256=LjAUYNlsX9Sj_QLMzYuTQbbYYbIMHhbsSjTXt-G7lOE,849
233
234
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py,sha256=dc_swzjkRDj85SWQ3cGGgsrp_cq5evUYQYUg0g7C5nw,435
234
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py,sha256=SNk66VApMLgfOHB8grLDiYnm8KYZTmw7eoOdBmkZCfw,1193
235
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py,sha256=VZKCG2GQworbmB_PPHPU10qMf5IThP0LN27k50XlHlg,1570
235
236
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=US1tueTCPvAdse6TLT6yRLUHbvwGGagApYhFJzE_6Yc,576
236
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=lIwqYRd2n-wPAKtDlPpNqNHAcSxJDMbtfh8upShqN1I,2112
237
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=hvgKAQgNJWTcvu_ZI9Ony4I-Mm_4rZBtQ4iqnoHZc2Q,2801
237
238
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py,sha256=8N9ahbCzNVczqgO_g0luRqP8luCv5bmCLoz66UYZ0mU,1427
238
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=7pjzmIe-Nit2Bk3GL4H7sLem46UcHN1sLc5ZrWd3xQQ,1679
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
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=KFiEFa0EDTxPa79B870fB5Jw-mabR-Ly8nZY9PwuAu0,2017
240
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user_token.py,sha256=X2oZzcHHGQmdZwfK4agxxjH8_qRTyZvGvhq8yKZbsJg,1789
241
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/verification_code.py,sha256=h5gTdihFjxhIfys55yJhQQcjukO_pJzWAmsf_k1ibQI,2171
241
242
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
243
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/util/etc.py,sha256=jm65ZB0K8e6WpgcL2Y6pxcIuQjioIyMtBIOOFbbWfgk,1070
243
244
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -391,8 +392,8 @@ arpakitlib/ar_ssh_runner_util.py,sha256=yvAwza480MkHKvLkDEsR7JNh2bYNs6P9rCVo4NA8
391
392
  arpakitlib/ar_str_util.py,sha256=CAv0wH8nP5Ja59S-hEdmNhNrM_Fwy935d0zntLpJkx8,4309
392
393
  arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,4049
393
394
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
394
- arpakitlib-1.8.107.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
395
- arpakitlib-1.8.107.dist-info/METADATA,sha256=FQKX2jz95Uw_IsgeFRvgE9peEFXnTVN-mIqirAJ37K0,3566
396
- arpakitlib-1.8.107.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
397
- arpakitlib-1.8.107.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
398
- arpakitlib-1.8.107.dist-info/RECORD,,
395
+ arpakitlib-1.8.109.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
396
+ arpakitlib-1.8.109.dist-info/METADATA,sha256=Uag9wA0Xs2FDQoDvgU3s4g1FSQ8uKU1ZeZ1kmIK_hn8,3566
397
+ arpakitlib-1.8.109.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
398
+ arpakitlib-1.8.109.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
399
+ arpakitlib-1.8.109.dist-info/RECORD,,