mirror of
https://github.com/beak-insights/felicity-lims.git
synced 2025-02-23 08:23:00 +08:00
52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
from six import string_types
|
|
from sqlalchemy import inspect
|
|
|
|
|
|
class ReprMixin:
|
|
__abstract__ = True
|
|
|
|
__repr_attrs__ = []
|
|
__repr_max_length__ = 15
|
|
|
|
@property
|
|
def _id_str(self):
|
|
ids = inspect(self).identity
|
|
if ids:
|
|
return "-".join([str(x) for x in ids]) if len(ids) > 1 else str(ids[0])
|
|
else:
|
|
return "None"
|
|
|
|
@property
|
|
def _repr_attrs_str(self):
|
|
max_length = self.__repr_max_length__
|
|
|
|
values = []
|
|
single = len(self.__repr_attrs__) == 1
|
|
for key in self.__repr_attrs__:
|
|
if not hasattr(self, key):
|
|
raise KeyError(
|
|
"{} has incorrect attribute '{}' in "
|
|
"__repr__attrs__".format(self.__class__, key)
|
|
)
|
|
value = getattr(self, key)
|
|
wrap_in_quote = isinstance(value, string_types)
|
|
|
|
value = str(value)
|
|
if len(value) > max_length:
|
|
value = value[:max_length] + "..."
|
|
|
|
if wrap_in_quote:
|
|
value = "'{}'".format(value)
|
|
values.append(value if single else "{}:{}".format(key, value))
|
|
|
|
return " ".join(values)
|
|
|
|
def __repr__(self):
|
|
# get id like '#123'
|
|
id_str = ("#" + self._id_str) if self._id_str else ""
|
|
# join class name, id and repr_attrs
|
|
return "<{} {}{}>".format(
|
|
self.__class__.__name__,
|
|
id_str,
|
|
" " + self._repr_attrs_str if self._repr_attrs_str else "",
|
|
)
|