Beispiel #1
0
 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))
Beispiel #2
0
 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)
Beispiel #3
0
 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()
Beispiel #4
0
 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))
Beispiel #5
0
 def __set__(self, instance, value):
     if settings.IS_UNIT_TEST:
         assert value == safe_call(
             self.default, instance
         ), "DerivedUnameSubfield 는 값을 직접 세팅할 수 없습니다. default 를 통해 세팅되어야 합니다."
     return super().__set__(instance, value)