felicity-lims/felicity/database/async_mixins/serialize.py
2023-04-07 17:52:19 +02:00

47 lines
1.4 KiB
Python

from collections.abc import Iterable
from .inspection import InspectionMixin
class SerializeMixin(InspectionMixin):
"""Mixin to make model serializable."""
__abstract__ = True
def to_dict(self, nested=False, hybrid_attributes=False, exclude=None):
"""Return dict object with model's data.
:param nested: flag to return nested relationships' data if true
:type: bool
:param hybrid_attributes: flag to include hybrid attributes if true
:type: bool
:return: dict
"""
result = dict()
if exclude is None:
view_cols = self.columns
else:
view_cols = filter(lambda e: e not in exclude, self.columns)
for key in view_cols:
result[key] = getattr(self, key)
if hybrid_attributes:
for key in self.hybrid_properties:
result[key] = getattr(self, key)
if nested:
for key in self.relations:
obj = getattr(self, key)
if isinstance(obj, SerializeMixin):
result[key] = obj.to_dict(hybrid_attributes=hybrid_attributes)
elif isinstance(obj, Iterable):
result[key] = [
o.to_dict(hybrid_attributes=hybrid_attributes)
for o in obj
if isinstance(o, SerializeMixin)
]
return result