Coverage for gws-app/gws/base/model/scalar_field.py: 0%
72 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1"""Generic scalar field."""
3from typing import Optional, Callable, cast
5import gws
6import gws.base.model.field
9class Config(gws.base.model.field.Config):
10 isVirtual: Optional[bool]
11 """The field is not stored in the DB. (added in 8.1)"""
14class Props(gws.base.model.field.Props):
15 pass
18class Object(gws.base.model.field.Object):
19 isVirtual: bool
21 def configure(self):
22 self.isVirtual = self.cfg('isVirtual', default=False)
24 def before_select(self, mc):
25 if self.isVirtual:
26 return
27 model = cast(gws.DatabaseModel, self.model)
28 mc.dbSelect.columns.append(model.column(self.name))
30 def after_select(self, features, mc):
31 for feature in features:
32 self.from_record(feature, mc)
34 def before_create(self, feature, mc):
35 if self.isAuto:
36 return
37 if self.isVirtual:
38 return
39 self.to_record(feature, mc)
41 def before_update(self, feature, mc):
42 if self.isAuto:
43 return
44 if self.isVirtual:
45 return
46 self.to_record(feature, mc)
48 ##
50 def from_props(self, feature, mc):
51 value = feature.props.attributes.get(self.name)
52 if value is not None:
53 value = self.prop_to_python(feature, value, mc)
54 if value is not None:
55 feature.set(self.name, value)
57 def to_props(self, feature, mc):
58 if not mc.user.can_read(self):
59 return
60 value = feature.get(self.name)
61 if value is not None:
62 value = self.python_to_prop(feature, value, mc)
63 if value is not None:
64 feature.props.attributes[self.name] = value
66 ##
68 def do_init(self, feature, mc):
69 value = self.get_value(
70 feature,
71 {},
72 mc.user.can_read(self),
73 self.prop_to_python,
74 mc
75 )
76 if value is not None:
77 feature.set(self.name, value)
79 ##
81 def from_record(self, feature, mc):
82 value = self.get_value(
83 feature,
84 feature.record.attributes,
85 mc.user.can_read(self),
86 self.raw_to_python,
87 mc
88 )
89 if value is not None:
90 feature.set(self.name, value)
92 def to_record(self, feature, mc):
93 value = self.get_value(
94 feature,
95 feature.attributes,
96 mc.user.can_write(self),
97 self.python_to_raw,
98 mc
99 )
100 if value is not None:
101 feature.record.attributes[self.name] = value
103 def get_value(
104 self,
105 feature: gws.Feature,
106 source: dict,
107 has_access: bool,
108 convert_fn: Callable,
109 mc: gws.ModelContext
110 ):
111 mv = self.model_value(mc)
113 if mv and not mv.isDefault:
114 return mv.compute(self, feature, mc)
116 if has_access and self.name in source:
117 value = source.get(self.name)
118 if value is not None:
119 return convert_fn(feature, value, mc)
121 if mv:
122 return mv.compute(self, feature, mc)
124 def model_value(self, mc: gws.ModelContext):
125 for mv in self.values:
126 if mc.op in mv.ops and mc.user.can_use(mv):
127 return mv