root_entity.py 1.0 KB

1234567891011121314151617181920212223242526272829303132
  1. from datetime import datetime
  2. from typing import Optional
  3. from typing import Type
  4. from typing import TypeVar
  5. from clean_python.base.domain.exceptions import BadRequest
  6. from clean_python.base.domain.value_object import ValueObject
  7. from clean_python.base.infrastructure.now import now
  8. T = TypeVar("T", bound="RootEntity")
  9. class RootEntity(ValueObject):
  10. id: Optional[int] = None
  11. created_at: datetime
  12. updated_at: datetime
  13. @classmethod
  14. def create(cls: Type[T], **values) -> T:
  15. values.setdefault("created_at", now())
  16. values.setdefault("updated_at", values["created_at"])
  17. return super(RootEntity, cls).create(**values)
  18. def update(self: T, **values) -> T:
  19. if "id" in values and self.id is not None and values["id"] != self.id:
  20. raise BadRequest("Cannot change the id of an entity")
  21. values.setdefault("updated_at", now())
  22. return super().update(**values)
  23. def __hash__(self):
  24. assert self.id is not None
  25. return hash(self.__class__) + hash(self.id)