arpakitlib 1.8.192__py3-none-any.whl → 1.8.194__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": "47"
3
+ "arpakitlib_project_template_subversion": "48"
4
4
  }
@@ -8,6 +8,8 @@ from openpyxl import Workbook
8
8
  from sqladmin import ModelView
9
9
 
10
10
  from arpakitlib.ar_datetime_util import now_utc_dt
11
+ from project.sqladmin_.util.etc import format_json_for_preview_, format_datetime_, format_json_
12
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
11
13
 
12
14
 
13
15
  class SimpleMV(ModelView):
@@ -23,6 +25,57 @@ class SimpleMV(ModelView):
23
25
  export_types = ["xlsx"]
24
26
  form_include_pk = True
25
27
 
28
+ column_default_sort = [
29
+ (SimpleDBM.ColumnNames.creation_dt, True)
30
+ ]
31
+
32
+ @classmethod
33
+ def get_default_column_searchable_list(cls) -> list[str]:
34
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
35
+ return [SimpleDBM.ColumnNames.id, SimpleDBM.ColumnNames.long_id, SimpleDBM.ColumnNames.uuid]
36
+
37
+ @classmethod
38
+ def get_default_column_list(cls) -> list[str]:
39
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
40
+ return SimpleDBM.get_mapped_column_names()
41
+
42
+ @classmethod
43
+ def get_default_column_details_list(cls) -> list[str]:
44
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
45
+ return SimpleDBM.get_mapped_column_names()
46
+
47
+ @classmethod
48
+ def get_default_form_columns(cls) -> list[str]:
49
+ from project.sqlalchemy_db_.sqlalchemy_model import SimpleDBM
50
+ res = SimpleDBM.get_mapped_column_names()
51
+ if SimpleDBM.ColumnNames.id in res:
52
+ res.remove(SimpleDBM.ColumnNames.id)
53
+ if SimpleDBM.ColumnNames.long_id in res:
54
+ res.remove(SimpleDBM.ColumnNames.long_id)
55
+ if SimpleDBM.ColumnNames.uuid in res:
56
+ res.remove(SimpleDBM.ColumnNames.uuid)
57
+ if SimpleDBM.ColumnNames.slug in res:
58
+ res.remove(SimpleDBM.ColumnNames.slug)
59
+ if SimpleDBM.ColumnNames.creation_dt in res:
60
+ res.remove(SimpleDBM.ColumnNames.creation_dt)
61
+ return res
62
+
63
+ @classmethod
64
+ def get_default_column_formatters(cls) -> dict[Any, Any]:
65
+ return {
66
+ SimpleDBM.ColumnNames.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
67
+ SimpleDBM.ColumnNames.detail_data: lambda m, a: format_json_for_preview_(m.detail_data),
68
+ SimpleDBM.ColumnNames.extra_data: lambda m, a: format_json_for_preview_(m.extra_data),
69
+ }
70
+
71
+ @classmethod
72
+ def get_default_column_formatters_detail(cls) -> dict[Any, Any]:
73
+ return {
74
+ SimpleDBM.ColumnNames.creation_dt: lambda m, _: format_datetime_(m.creation_dt),
75
+ SimpleDBM.ColumnNames.detail_data: lambda m, a: format_json_(m.detail_data),
76
+ SimpleDBM.ColumnNames.extra_data: lambda m, a: format_json_(m.extra_data),
77
+ }
78
+
26
79
  async def export_data(
27
80
  self,
28
81
  data: List[Any],
@@ -1,8 +1,9 @@
1
+ import uuid
1
2
  from datetime import datetime
2
3
  from typing import Any
3
4
  from uuid import uuid4
4
5
 
5
- import sqlalchemy
6
+ import sqlalchemy.dialects.postgresql
6
7
  from sqlalchemy import func
7
8
  from sqlalchemy.orm import mapped_column, Mapped, validates
8
9
 
@@ -28,6 +29,15 @@ def make_slug_from_string(string: str) -> str:
28
29
  class SimpleDBM(BaseDBM):
29
30
  __abstract__ = True
30
31
 
32
+ class ColumnNames:
33
+ id = "id"
34
+ long_id = "long_id"
35
+ uuid = "uuid"
36
+ slug = "slug"
37
+ creation_dt = "creation_dt"
38
+ detail_data = "detail_data"
39
+ extra_data = "extra_data"
40
+
31
41
  id: Mapped[int] = mapped_column(
32
42
  sqlalchemy.BIGINT,
33
43
  nullable=False,
@@ -43,6 +53,14 @@ class SimpleDBM(BaseDBM):
43
53
  server_default=func.gen_random_uuid(),
44
54
  sort_order=-102,
45
55
  )
56
+ uuid: Mapped[sqlalchemy.dialects.postgresql.UUID] = mapped_column(
57
+ sqlalchemy.UUID(as_uuid=True),
58
+ nullable=False,
59
+ unique=True,
60
+ insert_default=uuid.uuid4,
61
+ server_default=func.gen_random_uuid(),
62
+ sort_order=-102,
63
+ )
46
64
  slug: Mapped[str | None] = mapped_column(
47
65
  sqlalchemy.TEXT,
48
66
  nullable=True,
@@ -99,6 +117,14 @@ class SimpleDBM(BaseDBM):
99
117
  def entity_name(self) -> str:
100
118
  return self.__class__.__name__.removesuffix("DBM")
101
119
 
120
+ @property
121
+ def uuid_as_str(self) -> str:
122
+ return str(self.uuid)
123
+
124
+ @classmethod
125
+ def get_mapped_column_names(cls) -> list[str]:
126
+ return [k for k, v in SimpleDBM.__dict__.items() if isinstance(v, Mapped)]
127
+
102
128
  # ---SDP---
103
129
 
104
130
  @property
@@ -77,6 +77,7 @@ class BaseDBM(DeclarativeBase):
77
77
  include_sd_properties: Collection[str] | None = None,
78
78
  exclude_sd_properties: Collection[str] | None = None,
79
79
  include_columns_and_sd_properties: Collection[str] | None = None,
80
+ prefix: str = "sdp_",
80
81
  kwargs: dict[str, Any] | None = None
81
82
  ) -> dict[str, Any]:
82
83
  if exclude_columns is None:
@@ -99,10 +100,10 @@ class BaseDBM(DeclarativeBase):
99
100
 
100
101
  if need_include_sd_properties:
101
102
  for attr_name in dir(self):
102
- if not attr_name.startswith("sdp_") or not isinstance(getattr(type(self), attr_name, None), property):
103
+ if not attr_name.startswith(prefix) or not isinstance(getattr(type(self), attr_name, None), property):
103
104
  continue
104
105
 
105
- sd_property_name = attr_name.removeprefix("sdp_")
106
+ sd_property_name = attr_name.removeprefix(prefix)
106
107
 
107
108
  if (
108
109
  include_columns_and_sd_properties is not None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.192
3
+ Version: 1.8.194
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=keN0tdh9_6aLOtkeJVCIYHkLvF4tANK-0kYtV_s6Nic,98
11
+ arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=nOUaX-jQTf_-6LEz8gh0OAvYNYmtEoMPAzb6Ix3xfQI,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
@@ -248,7 +248,7 @@ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/create_sqladmin_app.p
248
248
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/event.py,sha256=LjAUYNlsX9Sj_QLMzYuTQbbYYbIMHhbsSjTXt-G7lOE,849
249
249
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/__init__.py,sha256=aKX6k2bEVvfXa9dATYts-sUoWgf4MV3H_PiiUceejr4,596
250
250
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/api_key.py,sha256=VTpepKLCKrPnftGD-8Ibp75S0dwUrLlUytRfcXDDcKg,1597
251
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=s8mmdwb5eRcdNM_lZpj2UOhvc1ckRhUubjniQ-dDIK0,2504
251
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=vI9yDb2344l5dNfXTZYrjfGCSDbA4EvXqW9yaKEwjAQ,4879
252
252
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=3jvDgLyOJe7U1UmJFgYOh6tlATM60PCCnIJDSFUW4tk,3595
253
253
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/story_log.py,sha256=KTyvMty9bozjnC0bSDoTtK1H4LTFfbX_MwqP72Ip5D0,2194
254
254
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user.py,sha256=AhK-2YocK1dM2wMxX_xF0qnsMiI5Pu0Arj5yfDe8Noo,2669
@@ -262,7 +262,7 @@ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/const.py,sha256=
262
262
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_db.py,sha256=1y3FaMFzm_5UM2poqtBve_UP_mh1vjs--krq6yO8PsA,742
263
263
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py,sha256=7PQqeYThEBXRrXwJZjuH7yAFu25DVr_IneuMwEF3kUE,731
264
264
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py,sha256=2X6VPkf1TKq-0319J0tL-rPMvgmkBCjim3Si1dZboMQ,1969
265
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=y3g0j0vBs2ICuX4rHlqBbDO0C39q4LMirk9o6NFbrRU,3246
265
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=OsnGHOmco4FsQOe8MfGPFTbwCohXXB-eINNsDh43wzs,3997
266
266
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py,sha256=emIo83GUEoywgh4fGv2xDGIkCtSUPq_2ujRlLEc5woM,5930
267
267
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=CiNec-x5_z0Pr5Mt-RZXJ1tKJMRn_TAKIaOioG4NK7U,2489
268
268
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=22TE8y2Vm9byLLkIE6RVAMa29d9ILCVg1e1QYi4ONIQ,7898
@@ -409,12 +409,12 @@ arpakitlib/ar_schedule_uust_api_client_util.py,sha256=rXI2_3OTaIBgR-GixM1Ti-Ue1f
409
409
  arpakitlib/ar_settings_util.py,sha256=Y5wi_cmsjDjfJpM0VJHjbo0NoVPKfypKaD1USowwDtQ,1327
410
410
  arpakitlib/ar_sleep_util.py,sha256=ggaj7ML6QK_ADsHMcyu6GUmUpQ_9B9n-SKYH17h-9lM,1045
411
411
  arpakitlib/ar_sqladmin_util.py,sha256=SEoaowAPF3lhxPsNjwmOymNJ55Ty9rmzvsDm7gD5Ceo,861
412
- arpakitlib/ar_sqlalchemy_util.py,sha256=vdhSLtSNVrWejDzR2XEfwNSXgR4QJ-IqaJryEp1apFk,12296
412
+ arpakitlib/ar_sqlalchemy_util.py,sha256=hiDh1GrFHmnqa6lJPMq4fb9m3_fs-eDKuRQzbFxIvFA,12330
413
413
  arpakitlib/ar_str_util.py,sha256=2lGpnXDf2h1cBZpVf5i1tX_HCv5iBd6IGnrCw4QWWlY,4350
414
414
  arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,4049
415
415
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
416
- arpakitlib-1.8.192.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
417
- arpakitlib-1.8.192.dist-info/METADATA,sha256=dvKU4KYR-HkoI-8kPYac7xphpBm_9x50Qrnnm76YnzM,3741
418
- arpakitlib-1.8.192.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
419
- arpakitlib-1.8.192.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
420
- arpakitlib-1.8.192.dist-info/RECORD,,
416
+ arpakitlib-1.8.194.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
417
+ arpakitlib-1.8.194.dist-info/METADATA,sha256=STtNdyIhDpdwoDnjUggO0fjMF6mWOlsCvV5Mb3Dndwk,3741
418
+ arpakitlib-1.8.194.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
419
+ arpakitlib-1.8.194.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
420
+ arpakitlib-1.8.194.dist-info/RECORD,,