arpakitlib 1.8.198__py3-none-any.whl → 1.8.200__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.
@@ -25,7 +25,8 @@ class OperationMV(SimpleMV, model=OperationDBM):
25
25
  OperationDBM.error_data,
26
26
  OperationDBM.extra_data,
27
27
 
28
- "duration"
28
+ OperationDBM.duration.fget.__name__,
29
+ OperationDBM.duration_as_str.fget.__name__
29
30
  ]
30
31
  column_details_list = [
31
32
  OperationDBM.id,
@@ -42,7 +43,8 @@ class OperationMV(SimpleMV, model=OperationDBM):
42
43
  OperationDBM.error_data,
43
44
  OperationDBM.extra_data,
44
45
 
45
- "duration"
46
+ OperationDBM.duration.fget.__name__,
47
+ OperationDBM.duration_as_str.fget.__name__
46
48
  ]
47
49
  form_columns = [
48
50
  OperationDBM.slug,
@@ -0,0 +1,79 @@
1
+ import copy
2
+ from typing import Type
3
+
4
+ from pydantic import BaseModel
5
+ from pydantic.fields import FieldInfo, Field
6
+
7
+
8
+ def prune_model(
9
+ *,
10
+ model_cls: Type[BaseModel],
11
+ fields_to_remove: set[str],
12
+ new_class_name: str,
13
+ ) -> Type[BaseModel]:
14
+ """
15
+ Создаёт новый класс-модель (Pydantic v2), который:
16
+ - наследуется от тех же баз, что и model_cls (в том же порядке);
17
+ - содержит только поля, объявленные В САМОМ model_cls (а не у его баз),
18
+ за вычетом fields_to_remove;
19
+ - копирует каждое поле целиком через deepcopy(FieldInfo), сохраняя ВСЕ атрибуты
20
+ (alias, constraints, repr, json_schema_extra и т.д.).
21
+ - НЕ копирует валидаторы, конфиг, docstring и прочее — только поля.
22
+
23
+ Наследованные от баз поля сохранятся за счёт наследования. Удалить наследуемое поле
24
+ таким способом нельзя — нужно менять базовые классы / MRO.
25
+ """
26
+ if not (isinstance(model_cls, type) and issubclass(model_cls, BaseModel)):
27
+ raise TypeError("model_cls должен быть подклассом pydantic.BaseModel (v2).")
28
+
29
+ namespace: dict = {
30
+ "__module__": getattr(model_cls, "__module__", "__main__"),
31
+ "__annotations__": {},
32
+ }
33
+
34
+ for name, annotation in dict(getattr(model_cls, "__annotations__", {})).items():
35
+ if name in fields_to_remove:
36
+ continue
37
+
38
+ field_info: FieldInfo | None = getattr(model_cls, "model_fields", {}).get(name)
39
+
40
+ if isinstance(field_info, FieldInfo):
41
+ namespace["__annotations__"][name] = annotation
42
+ namespace[name] = copy.deepcopy(field_info)
43
+
44
+ new_model = type(new_class_name, model_cls.__bases__, namespace)
45
+
46
+ if not issubclass(new_model, BaseModel):
47
+ raise RuntimeError("not issubclass(new_model, BaseModel)")
48
+
49
+ return new_model
50
+
51
+
52
+ def __example():
53
+ from typing import Optional
54
+ from pydantic import BaseModel
55
+
56
+ class Timestamped(BaseModel):
57
+ created_at: int = 1
58
+ updated_at: int = 1
59
+
60
+ class Names:
61
+ arsen = "arse"
62
+
63
+ class User(Timestamped):
64
+ id: int = Field(default=1)
65
+ email: str = "asasf"
66
+ password_hash: str = "asasf"
67
+ nickname: Optional[str] = None
68
+
69
+ PublicUser = prune_model(
70
+ model_cls=User,
71
+ fields_to_remove={"id"},
72
+ new_class_name="PublicUser",
73
+ )
74
+
75
+ print(PublicUser())
76
+
77
+
78
+ if __name__ == '__main__':
79
+ __example()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.198
3
+ Version: 1.8.200
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -249,7 +249,7 @@ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/event.py,sha256=LjAUY
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
251
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/common.py,sha256=U4KbXPAoyvgUB2BoPYUOPKLpHQLOdvZp-JdeVnC1MPY,5573
252
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=WWUrY_TL0ANUfiDFAlU3GAvpYYUIUIKCDHr5ls6W4rg,3505
252
+ arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py,sha256=B3Y3VGM0-3pm1Ib5CWbW3gKYgpMixIPKb4S3GksS314,3659
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
255
255
  arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/user_token.py,sha256=pyeyDTg4rss8-67hIE3-SQlAvNfje6HazuaVnyFBpN8,2054
@@ -413,8 +413,9 @@ arpakitlib/ar_sqlalchemy_util.py,sha256=hiDh1GrFHmnqa6lJPMq4fb9m3_fs-eDKuRQzbFxI
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.198.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
417
- arpakitlib-1.8.198.dist-info/METADATA,sha256=JoGoJbm9vND7jeDcRKZWSgi2wVhmxW3FfUk_-DxnzQU,3741
418
- arpakitlib-1.8.198.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
419
- arpakitlib-1.8.198.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
420
- arpakitlib-1.8.198.dist-info/RECORD,,
416
+ arpakitlib/prune_model.py,sha256=GOW6BJGd40hQo8CxaQD0PDs8-nb67aDDEufDT_4BwX4,2745
417
+ arpakitlib-1.8.200.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
418
+ arpakitlib-1.8.200.dist-info/METADATA,sha256=fcrNNEp3lekRKpBaKMDbcr_cokkXZYviLtaWpf74u6A,3741
419
+ arpakitlib-1.8.200.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
420
+ arpakitlib-1.8.200.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
421
+ arpakitlib-1.8.200.dist-info/RECORD,,