def _init_no_inited_subfields(self): for k, v in self.data.items(): if v is None and k[0] != "_": subfield = self.get_subfield(k) assert subfield.null, console_log("{} 는 null 이 허용되지 않습니다.".format(subfield.subfield_name)) elif callable(v): self.data[k] = json_encode(safe_call(v, self)) for k, v in self.computed.items(): if v is None and k[0] != "_": subfield = self.get_subfield(k) assert subfield.null elif callable(v): self.computed[k] = json_encode(safe_call(v, self))
def patch_json_field(self): if self.status == Status.DELETED: return assert self.status in (Status.NORMAL, Status.WORKING), self.status total_default = self.subfield_defaults _schema_changed = False old_status = self.__dict__["status"] for json_field_name in total_default: json_field = self.__dict__[json_field_name] field_default = total_default[json_field_name] for key, value in field_default.items(): if key not in json_field: if callable(value): value = safe_call(value, self) json_field[key] = json_deepcopy_with_callable(value) _schema_changed = True self.__dict__["status"] = Status.DIRTY self._mjson_revert_patch.update( {"status": json_encode(old_status), json_field_name: {"_schema_changed": _schema_changed}} ) for k in [k for k in json_field.keys() if k not in field_default]: del json_field[k] _schema_changed = True self.__dict__["status"] = Status.DIRTY self._mjson_revert_patch.update( {"status": json_encode(old_status), json_field_name: {"_schema_changed": _schema_changed}} ) if _schema_changed and settings.IS_UNIT_TEST: self._mjson_on_init = deepcopy(self.mjson) self._mjson_on_init["status"] = json_encode(old_status)
def compute(self, subfield_name): # set to computed json old_status = self.status compute_func = getattr(self, COMPUTE_FUNC_NAME.format(subfield_name)) value = safe_call(compute_func) setattr(self, subfield_name, value) # set to computed_field computed_field_name = COMPUTED_FIELD_NAME.format(subfield_name) if computed_field_name in self.field_names: setattr(self, computed_field_name, value) if old_status in (Status.NORMAL, Status.WORKING) and self.status == Status.DIRTY: self.save()
def _process_expire_onchange(self, subfield_name=None): if subfield_name is None: for k, v in self.subfields["data"].items(): if v.expire == Expire.ON_CHANGE: v.__set__(self, v.default(self)) else: subfields = self.subfields if subfield_name in subfields["_dependents"]: depended = subfields["_dependents"][subfield_name] for v in depended: if v.expire == Expire.ON_CHANGE: v.__set__(self, safe_call(v.default, self))
def __set__(self, instance, value): if settings.IS_UNIT_TEST: assert value == safe_call( self.default, instance ), "DerivedUnameSubfield 는 값을 직접 세팅할 수 없습니다. default 를 통해 세팅되어야 합니다." return super().__set__(instance, value)