reservation.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import sqlmodel
  2. from .product import product
  3. from .exception import reservation_exception
  4. from .validator import phone_number_validator
  5. from .validator import email_validator
  6. class reservation(sqlmodel.SQLModel, table = True):
  7. __tablename__: str = "reservation"
  8. id: int | None = sqlmodel.Field(default = None, primary_key = True)
  9. email: str | None = sqlmodel.Field(
  10. default = None,
  11. index = True,
  12. unique = False
  13. )
  14. phone_number: str | None = sqlmodel.Field(
  15. default = None,
  16. index = True,
  17. unique = False
  18. )
  19. target_id: int | None = sqlmodel.Field(
  20. default = None,
  21. foreign_key = "product.id",
  22. unique = False
  23. )
  24. target: product | None = sqlmodel.Relationship(
  25. back_populates = "reservations"
  26. )
  27. @property
  28. def in_database(self) -> bool:
  29. return self.id is not None
  30. @property
  31. def ready(self) -> bool:
  32. if self.target is None:
  33. return False
  34. if self.email is None and self.phone_number is None:
  35. return False
  36. return True
  37. def __str__(self) -> str:
  38. content = "Reservation "
  39. if self.in_database:
  40. content = content + "#" + str(self.id)
  41. content = content + "\n"
  42. if self.email is not None:
  43. content = content + "E-mail: \"" + self.email + "\"\n"
  44. if self.phone_number is not None:
  45. content = content + "Phone: \"" + self.phone_number + "\"\n"
  46. if self.target is None:
  47. return content + "Target: not set"
  48. return content + "Target: #" + str(self.target.id) + "\n"
  49. class reservation_factory:
  50. def __init__(self, target: reservation | None = None) -> None:
  51. self.__target = target
  52. if self.__target is None:
  53. self.__target = reservation()
  54. def target(self, item: product) -> object:
  55. if not item.in_database:
  56. raise reservation_exception("Target item not in database.")
  57. self.__target.target = item
  58. return self
  59. def phone_number(self, number: str) -> object:
  60. if not phone_number_validator(number).result:
  61. raise reservation_exception("Phone number is not valid.")
  62. self.__target.phone_number = number
  63. return self
  64. def email(self, email: str) -> object:
  65. if not email_validator(email).result:
  66. raise reservation_exception("Email is not valid.")
  67. self.__target.email = email
  68. return self
  69. def result(self) -> reservation:
  70. return self.__target