arpakitlib 1.8.199__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.
- arpakitlib/_arpakit_project_template_v_5/project/sqladmin_/model_view/operation.py +4 -2
- arpakitlib/prune_model.py +79 -0
- {arpakitlib-1.8.199.dist-info → arpakitlib-1.8.200.dist-info}/METADATA +1 -1
- {arpakitlib-1.8.199.dist-info → arpakitlib-1.8.200.dist-info}/RECORD +7 -6
- {arpakitlib-1.8.199.dist-info → arpakitlib-1.8.200.dist-info}/LICENSE +0 -0
- {arpakitlib-1.8.199.dist-info → arpakitlib-1.8.200.dist-info}/WHEEL +0 -0
- {arpakitlib-1.8.199.dist-info → arpakitlib-1.8.200.dist-info}/entry_points.txt +0 -0
@@ -25,7 +25,8 @@ class OperationMV(SimpleMV, model=OperationDBM):
|
|
25
25
|
OperationDBM.error_data,
|
26
26
|
OperationDBM.extra_data,
|
27
27
|
|
28
|
-
|
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
|
-
|
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()
|
@@ -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=
|
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
|
417
|
-
arpakitlib-1.8.
|
418
|
-
arpakitlib-1.8.
|
419
|
-
arpakitlib-1.8.
|
420
|
-
arpakitlib-1.8.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|