arpakitlib 1.8.214__py3-none-any.whl → 1.8.216__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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "arpakitlib_project_template_version": "5",
3
- "arpakitlib_project_template_subversion": "51"
3
+ "arpakitlib_project_template_subversion": "53"
4
4
  }
@@ -28,7 +28,7 @@ def create_api_app(*, prefix: str = "/api") -> FastAPI:
28
28
  version=get_cached_settings().api_version,
29
29
  docs_url=None,
30
30
  redoc_url=None,
31
- openapi_url="/openapi",
31
+ openapi_url=get_cached_settings().api_openapi_url,
32
32
  on_startup=get_startup_api_events(),
33
33
  on_shutdown=get_shutdown_api_events(),
34
34
  contact={
@@ -46,7 +46,11 @@ def create_api_app(*, prefix: str = "/api") -> FastAPI:
46
46
  allow_headers=["*"],
47
47
  )
48
48
 
49
- add_local_openapi_ui_to_api_app(app=api_app)
49
+ add_local_openapi_ui_to_api_app(
50
+ app=api_app,
51
+ docs_url=get_cached_settings().api_docs_url,
52
+ redoc_url=get_cached_settings().api_redoc_url
53
+ )
50
54
 
51
55
  add_exception_handler_to_api_app(app=api_app)
52
56
 
@@ -4,9 +4,11 @@ from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
4
4
 
5
5
  def add_local_openapi_ui_to_api_app(
6
6
  *,
7
- app: FastAPI
7
+ app: FastAPI,
8
+ docs_url: str = "/docs",
9
+ redoc_url: str = "/redocs",
8
10
  ):
9
- @app.get("/docs", include_in_schema=False)
11
+ @app.get(docs_url, include_in_schema=False)
10
12
  async def custom_swagger_ui_html():
11
13
  return get_swagger_ui_html(
12
14
  openapi_url=app.openapi_url,
@@ -16,7 +18,7 @@ def add_local_openapi_ui_to_api_app(
16
18
  swagger_favicon_url="/static/openapi-favicon.png"
17
19
  )
18
20
 
19
- @app.get("/redoc", include_in_schema=False)
21
+ @app.get(redoc_url, include_in_schema=False)
20
22
  async def custom_redoc_html():
21
23
  return get_redoc_html(
22
24
  openapi_url=app.openapi_url,
@@ -123,6 +123,12 @@ class Settings(SimpleSettings):
123
123
 
124
124
  api_workers: int = 4
125
125
 
126
+ api_docs_url: str = "/secret/docs"
127
+
128
+ api_redoc_url: str = "/secret/redoc"
129
+
130
+ api_openapi_url: str = "/secret/openapi"
131
+
126
132
  sqladmin_secret_key: str | None = "85a9583cb91c4de7a78d7eb1e5306a04418c9c43014c447ea8ec8dd5deb4cf71"
127
133
 
128
134
  sqladmin_authorize_keys: list[str] | None = ["1"]
@@ -19,6 +19,7 @@ def get_default_column_formatters() -> dict[Any, Any]:
19
19
  SimpleDBM.ColumnNames.extra_data: lambda m, a: format_json_for_preview_(m.extra_data),
20
20
  }
21
21
 
22
+
22
23
  def get_default_column_formatters_detail() -> dict[Any, Any]:
23
24
  return {
24
25
  SimpleDBM.ColumnNames.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
@@ -36,7 +37,6 @@ def get_default_column_searchable_list() -> list[str]:
36
37
  return [SimpleDBM.ColumnNames.id, SimpleDBM.ColumnNames.long_id, SimpleDBM.ColumnNames.uuid]
37
38
 
38
39
 
39
-
40
40
  class SimpleMV(ModelView):
41
41
  can_create = True
42
42
  can_edit = True
@@ -65,27 +65,19 @@ class SimpleMV(ModelView):
65
65
  @classmethod
66
66
  def get_default_column_list(cls) -> list[str]:
67
67
  from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
68
- return SimpleDBM.get_mapped_column_names()
68
+ return SimpleDBM.get_column_and_relationship_names_()
69
69
 
70
70
  @classmethod
71
71
  def get_default_column_details_list(cls) -> list[str]:
72
72
  from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
73
- return SimpleDBM.get_mapped_column_names()
73
+ return SimpleDBM.get_column_and_relationship_names_()
74
74
 
75
75
  @classmethod
76
76
  def get_default_form_columns(cls) -> list[str]:
77
77
  from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
78
- res = SimpleDBM.get_mapped_column_names()
79
- if SimpleDBM.ColumnNames.id in res:
80
- res.remove(SimpleDBM.ColumnNames.id)
81
- if SimpleDBM.ColumnNames.long_id in res:
82
- res.remove(SimpleDBM.ColumnNames.long_id)
83
- if SimpleDBM.ColumnNames.uuid in res:
84
- res.remove(SimpleDBM.ColumnNames.uuid)
85
- if SimpleDBM.ColumnNames.slug in res:
86
- res.remove(SimpleDBM.ColumnNames.slug)
87
- if SimpleDBM.ColumnNames.creation_dt in res:
88
- res.remove(SimpleDBM.ColumnNames.creation_dt)
78
+ res = SimpleDBM.get_column_and_relationship_names_(
79
+ include_column_pk=False
80
+ )
89
81
  return res
90
82
 
91
83
  @classmethod
@@ -143,10 +143,6 @@ class SimpleDBM(BaseDBM):
143
143
  def uuid_as_str(self) -> str:
144
144
  return str(self.uuid)
145
145
 
146
- @classmethod
147
- def get_mapped_column_names(cls) -> list[str]:
148
- return [k for k, v in SimpleDBM.__dict__.items() if isinstance(v, Mapped)]
149
-
150
146
  # ---SDP---
151
147
 
152
148
  @property
@@ -68,21 +68,54 @@ class BaseDBM(DeclarativeBase):
68
68
  return self._bus_data
69
69
 
70
70
  @classmethod
71
- def get_table_column_names_(
71
+ def get_column_names_(
72
72
  cls,
73
73
  *,
74
74
  include_pk: bool = True,
75
- exclude_columns: list[str] | None = None
75
+ exclude_names: list[str] | None = None
76
76
  ) -> list[str]:
77
- exclude_columns = set(exclude_columns or [])
78
- result = []
79
- for c in cls.__table__.columns:
77
+ if exclude_names is None:
78
+ exclude_names = []
79
+ res = []
80
+ for c in inspect(cls).columns:
80
81
  if not include_pk and c.primary_key:
81
82
  continue
82
- if c.name in exclude_columns:
83
+ if c.key in exclude_names:
83
84
  continue
84
- result.append(c.name)
85
- return result
85
+ res.append(c)
86
+ return res
87
+
88
+ @classmethod
89
+ def get_relationship_names_(
90
+ cls,
91
+ *,
92
+ exclude_names: list[str] | None = None
93
+ ) -> list[str]:
94
+ if exclude_names is None:
95
+ exclude_names = []
96
+ res = []
97
+ for c in inspect(cls).relationships:
98
+ if c.key in exclude_names:
99
+ continue
100
+ res.append(c)
101
+ return res
102
+
103
+ @classmethod
104
+ def get_column_and_relationship_names_(
105
+ cls,
106
+ *,
107
+ include_column_names: bool = True,
108
+ include_column_pk: bool = True,
109
+ exclude_column_names: list[str] | None = None,
110
+ include_relationship_names: bool = True,
111
+ exclude_relationship_names: list[str] | None = None,
112
+ ) -> list[str]:
113
+ res = []
114
+ if include_column_names:
115
+ res += cls.get_column_names_(include_pk=include_column_pk, exclude_names=exclude_column_names)
116
+ if include_relationship_names:
117
+ res += cls.get_relationship_names_(exclude_names=exclude_relationship_names)
118
+ return res
86
119
 
87
120
  @classmethod
88
121
  def get_sd_property_names(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.214
3
+ Version: 1.8.216
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=E78ase9v3t6Ljp5fkVnVXt9Qr8KSD5CzSDu8mzmLcLQ,98
11
+ arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=aoHu_XuInN6u9CGw16RqSp5JF_iOvjJ0xoCaXOJtX_M,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
@@ -89,12 +89,12 @@ arpakitlib/_arpakit_project_template_v_5/project/api/blank/admin.py,sha256=ii1zL
89
89
  arpakitlib/_arpakit_project_template_v_5/project/api/blank/client.py,sha256=rvJKtAB26Qy2pKVSHSMUM_70oI4v8Yr6Vmpr6r4EzNk,101
90
90
  arpakitlib/_arpakit_project_template_v_5/project/api/blank/common.py,sha256=ug1FylE_CVC5eij-u4nh-IHNO-gwkbBGo5KgyWDujC8,91
91
91
  arpakitlib/_arpakit_project_template_v_5/project/api/const.py,sha256=J9bqaRRiIc3RLn6SJTvdfDvFrSsM_Ixii9t2M8dA5Jc,433
92
- arpakitlib/_arpakit_project_template_v_5/project/api/create_api_app.py,sha256=7lJim1RcHOr-vSobSOmO40qTZqtZtsf0C3OUOYnG1zc,2922
92
+ arpakitlib/_arpakit_project_template_v_5/project/api/create_api_app.py,sha256=rmD0F-9SpbGsDGi5PzVVFF6paoYLyKasPh6qw2RxTNY,3071
93
93
  arpakitlib/_arpakit_project_template_v_5/project/api/create_first_data.py,sha256=BgqmD-7gXQ_zoz3ATqVacQzkg9lbvKnCSvQxm0M0Vxw,1824
94
94
  arpakitlib/_arpakit_project_template_v_5/project/api/event.py,sha256=P8gV2Bq6LeLH0JDN9Z3O401PMbyNr2n-tme2gPvT-m4,996
95
95
  arpakitlib/_arpakit_project_template_v_5/project/api/exception.py,sha256=OkvjuJZx-rZfHisKwgeaI-cxzNNPeKgkRi9a_x7Jdbw,1415
96
96
  arpakitlib/_arpakit_project_template_v_5/project/api/exception_handler.py,sha256=AqT5l_GyTMWZsW-eI4ZD5FU4zMR0HKhsxsMX3p2KukY,11535
97
- arpakitlib/_arpakit_project_template_v_5/project/api/openapi_ui.py,sha256=PLhH-W6zDViO-75AGCs8Vq3IoyHChdqwBYAqLvdQN0U,904
97
+ arpakitlib/_arpakit_project_template_v_5/project/api/openapi_ui.py,sha256=7yg9ZNu6BjTAregnfbRFpwvqa-gTIY6o6NCz5pmsbeo,976
98
98
  arpakitlib/_arpakit_project_template_v_5/project/api/response.py,sha256=xZMymP2BuQaRNVWLeIp3UgUUo-MFN8MJnsn9Al4vOb8,1028
99
99
  arpakitlib/_arpakit_project_template_v_5/project/api/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
100
  arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -183,7 +183,7 @@ arpakitlib/_arpakit_project_template_v_5/project/core/dump_file_storage_in_dir.p
183
183
  arpakitlib/_arpakit_project_template_v_5/project/core/easy_openai_api_client.py,sha256=ssQ8Ju6CBQeXSOa_lfLaqycSf0a-NIj6ucOhEsPseVc,1141
184
184
  arpakitlib/_arpakit_project_template_v_5/project/core/jinja2_templates.py,sha256=jCNLaBauGC7YNvZdTLNHuPp7hmRGt94O23Skg6ewo7o,352
185
185
  arpakitlib/_arpakit_project_template_v_5/project/core/media_file_storage_in_dir.py,sha256=fMofTsfJtA8pp5lEUhucEUu3PBsmj-elaRZzExDsdLI,623
186
- arpakitlib/_arpakit_project_template_v_5/project/core/settings.py,sha256=3CouqCjoStxMeNUDF8y-fjMcNXAryZ4ILXviUod3-Z0,6658
186
+ arpakitlib/_arpakit_project_template_v_5/project/core/settings.py,sha256=aGwbB6skNOKT0z2vjQVAesfGMXi2Yclbrkw0HbACWuQ,6786
187
187
  arpakitlib/_arpakit_project_template_v_5/project/core/setup_logging.py,sha256=7VRejVMUNeR-MywrVw7B1RxVkIBHwVNQJFC4wlpBJco,1497
188
188
  arpakitlib/_arpakit_project_template_v_5/project/core/util.py,sha256=iCwpuRqr6TfW0sKVH-3asQjhueJuad3ffq6sPI6ZUrs,347
189
189
  arpakitlib/_arpakit_project_template_v_5/project/emailer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -250,7 +250,7 @@ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/create_sqladmin_app.p
250
250
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/event.py,sha256=LjAUYNlsX9Sj_QLMzYuTQbbYYbIMHhbsSjTXt-G7lOE,849
251
251
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py,sha256=aKX6k2bEVvfXa9dATYts-sUoWgf4MV3H_PiiUceejr4,596
252
252
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py,sha256=VTpepKLCKrPnftGD-8Ibp75S0dwUrLlUytRfcXDDcKg,1597
253
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=U4KbXPAoyvgUB2BoPYUOPKLpHQLOdvZp-JdeVnC1MPY,5573
253
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=1jGRO2xgNc_DwlhMoZD9C8HZi2qghjrBSnDf2dxB20Y,5150
254
254
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=IqW9eh0u3-WFkE1oA3yjEboUW2F2zF4cKsp4_FNy2RE,3746
255
255
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py,sha256=KTyvMty9bozjnC0bSDoTtK1H4LTFfbX_MwqP72Ip5D0,2194
256
256
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=AhK-2YocK1dM2wMxX_xF0qnsMiI5Pu0Arj5yfDe8Noo,2669
@@ -264,7 +264,7 @@ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/const.py,sha256=
264
264
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_db.py,sha256=1y3FaMFzm_5UM2poqtBve_UP_mh1vjs--krq6yO8PsA,742
265
265
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py,sha256=7PQqeYThEBXRrXwJZjuH7yAFu25DVr_IneuMwEF3kUE,731
266
266
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py,sha256=2X6VPkf1TKq-0319J0tL-rPMvgmkBCjim3Si1dZboMQ,1969
267
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=OuHmYkFUPnSQ5QV8UiAjBax5GLNGGGh1zOYSjKp3nqw,4598
267
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=ynp36o48B_HNMJSAc-mw40LzhoFLSXyOWw3JOPc8gKo,4446
268
268
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py,sha256=-7uzlux8B7wtqhSd4b_06M40yTDySPIngm3Cwun2lSA,7378
269
269
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=CiNec-x5_z0Pr5Mt-RZXJ1tKJMRn_TAKIaOioG4NK7U,2489
270
270
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=22TE8y2Vm9byLLkIE6RVAMa29d9ILCVg1e1QYi4ONIQ,7898
@@ -411,13 +411,13 @@ arpakitlib/ar_schedule_uust_api_client_util.py,sha256=rXI2_3OTaIBgR-GixM1Ti-Ue1f
411
411
  arpakitlib/ar_settings_util.py,sha256=Y5wi_cmsjDjfJpM0VJHjbo0NoVPKfypKaD1USowwDtQ,1327
412
412
  arpakitlib/ar_sleep_util.py,sha256=ggaj7ML6QK_ADsHMcyu6GUmUpQ_9B9n-SKYH17h-9lM,1045
413
413
  arpakitlib/ar_sqladmin_util.py,sha256=SEoaowAPF3lhxPsNjwmOymNJ55Ty9rmzvsDm7gD5Ceo,861
414
- arpakitlib/ar_sqlalchemy_util.py,sha256=CX9Uc2Jri3qxEljRuMvcFjf_SQU5AdJjGBYSheAGWG4,13276
414
+ arpakitlib/ar_sqlalchemy_util.py,sha256=QJWW8AgnFH-7vJ2OBfWxg7_IWNfVTMnXpWCRxkT2A_4,14338
415
415
  arpakitlib/ar_str_util.py,sha256=2lGpnXDf2h1cBZpVf5i1tX_HCv5iBd6IGnrCw4QWWlY,4350
416
416
  arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,4049
417
417
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
418
418
  arpakitlib/clone_pydantic_model_fields.py,sha256=Gn9_AIjKknN1eIYK_xH_cMyff3hjOpfwRqs583-rnJs,1167
419
- arpakitlib-1.8.214.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
420
- arpakitlib-1.8.214.dist-info/METADATA,sha256=9QC3jZfo0MVF9gZ8WQVwZVaSccgDIC7eJhF49hE51Ck,3741
421
- arpakitlib-1.8.214.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
422
- arpakitlib-1.8.214.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
423
- arpakitlib-1.8.214.dist-info/RECORD,,
419
+ arpakitlib-1.8.216.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
420
+ arpakitlib-1.8.216.dist-info/METADATA,sha256=8VLikpn99aNZWDVqVrcnDqV0Q2P7FIN_3FKJZlWgomI,3741
421
+ arpakitlib-1.8.216.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
422
+ arpakitlib-1.8.216.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
423
+ arpakitlib-1.8.216.dist-info/RECORD,,