root_entity.py 1010 B

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