diff --git a/domain_models/fields.py b/domain_models/fields.py index 2095a63..bcd84be 100644 --- a/domain_models/fields.py +++ b/domain_models/fields.py @@ -55,6 +55,7 @@ def get_value(self, model, default=None): :param DomainModel model: :param mixed default: + :return mixed: """ if default is not None: default = self._converter(default) @@ -63,7 +64,11 @@ def get_value(self, model, default=None): return value if value is not None else default def set_value(self, model, value): - """Set field's value.""" + """Set field's value. + + :param DomainModel model: + :param mixed value: + """ if value is None and self.required: raise AttributeError("This field is required.") @@ -72,6 +77,14 @@ def set_value(self, model, value): setattr(model, self.storage_name, value) + def get_builtin_type(self, model): + """Return built-in type representation of Field. + + :param DomainModel model: + :return mixed: + """ + return self.get_value(model) + def _converter(self, value): """Convert raw input value of the field.""" return value @@ -154,6 +167,14 @@ def _converter(self, value): self.related_model_cls)) return value + def get_builtin_type(self, model): + """Return built-in type representation of Model. + + :param DomainModel model: + :return dict: + """ + return self.get_value(model).get_data() + class Collection(Field): """Models collection relation field.""" @@ -168,3 +189,12 @@ def _converter(self, value): if type(value) is not self.related_model_cls.Collection: value = self.related_model_cls.Collection(value) return value + + def get_builtin_type(self, model): + """Return built-in type representation of Collection. + + :param DomainModel model: + :return list: + """ + return [item.get_data() if isinstance(item, self.related_model_cls) + else item for item in self.get_value(model)] diff --git a/domain_models/models.py b/domain_models/models.py index bd27ac9..334e9f3 100644 --- a/domain_models/models.py +++ b/domain_models/models.py @@ -209,3 +209,12 @@ def get(self, field_name, default=None): "Field {0} does not exist.".format(field_name)) else: return field.get_value(self, default) + + def get_data(self): + """Read only dictionary of model fields/values. + + :return dict: + """ + return dict((name, field.get_builtin_type(self)) + for name, field in + six.iteritems(self.__class__.__fields__))