garbage.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import threading
  2. from tool.typing import *
  3. from tool.time import HGSTime, hgs_time_t
  4. from tool.location import HGSLocation, hgs_location_t
  5. class GarbageType:
  6. GarbageTypeStrList: List = ["", "recyclable", "kitchen", "hazardous", "other"]
  7. GarbageTypeStrList_ch: List = ["", "可回收", "厨余", "有害", "其他"]
  8. recyclable: enum = 1
  9. kitchen: enum = 2
  10. hazardous: enum = 3
  11. other: enum = 4
  12. class GarbageBag:
  13. def __init__(self, gid: gid_t):
  14. self._gid: gid_t = gid_t(gid)
  15. self._have_use: bool = False
  16. self._have_check: bool = False
  17. self._type: Union[enum, None] = None
  18. self._use_time: Union[HGSTime, None] = None
  19. self._user: Union[uid_t, None] = None
  20. self._loc: Union[HGSLocation, None] = None
  21. self._check = False
  22. self._checker: Union[uid_t, None] = None
  23. self._lock = threading.RLock()
  24. def __repr__(self):
  25. tmp = GarbageType.GarbageTypeStrList
  26. try:
  27. self._lock.acquire()
  28. if not self._have_use:
  29. info = f"GarbageBag: {self._gid} NOT USE"
  30. elif not self._have_check:
  31. info = (f"GarbageBag: {self._gid} "
  32. f"Type: {tmp[self._type]} "
  33. f"Time: {self._use_time.get_time()} "
  34. f"User: {self._user} "
  35. f"Location {self._loc.get_location()} "
  36. f"NOT CHECK")
  37. else:
  38. info = (f"GarbageBag: {self._gid} "
  39. f"Type: {tmp[self._type]} "
  40. f"Time: {self._use_time.get_time()} "
  41. f"User: {self._user} "
  42. f"Location {self._loc.get_location()} "
  43. f"Check: {self._check}"
  44. f"Checker: {self._checker}")
  45. finally:
  46. self._lock.release()
  47. return info
  48. def get_info(self) -> dict[str: str]:
  49. try:
  50. self._lock.acquire()
  51. info = {
  52. "gid": str(self._gid),
  53. "type": str(self._type),
  54. "use_time": "" if (self._use_time is None) else str(self._use_time.get_time()),
  55. "user": str(self._user),
  56. "loc": "" if (self._loc is None) else str(self._loc.get_location()),
  57. "check": '1' if self._check else '0',
  58. "checker": "None" if self._checker is None else self._checker,
  59. }
  60. finally:
  61. self._lock.release()
  62. return info
  63. def is_use(self) -> bool:
  64. try:
  65. self._lock.acquire()
  66. have_use = self._have_use
  67. finally:
  68. self._lock.release()
  69. return have_use
  70. def is_check(self) -> Tuple[bool, bool]:
  71. try:
  72. self._lock.acquire()
  73. have_check = self._have_check
  74. check = self._check
  75. finally:
  76. self._lock.release()
  77. if not have_check:
  78. return False, False
  79. else:
  80. return True, check
  81. def get_gid(self):
  82. try:
  83. self._lock.acquire()
  84. gid = self._gid
  85. finally:
  86. self._lock.release()
  87. return gid
  88. def get_user(self) -> uid_t:
  89. try:
  90. self._lock.acquire()
  91. assert self._have_use
  92. user = self._user
  93. finally:
  94. self._lock.release()
  95. return user
  96. def get_type(self):
  97. try:
  98. self._lock.acquire()
  99. assert self._have_use
  100. type_ = self._type
  101. finally:
  102. self._lock.release()
  103. return type_
  104. def config_use(self, garbage_type: enum, use_time: hgs_time_t, user: uid_t, location: hgs_location_t):
  105. try:
  106. self._lock.acquire()
  107. assert not self._have_use
  108. self._have_use = True
  109. if not isinstance(use_time, HGSTime):
  110. use_time = HGSTime(use_time)
  111. if not isinstance(location, HGSLocation):
  112. location = HGSLocation(location)
  113. self._type: enum = enum(garbage_type)
  114. self._use_time: HGSTime = use_time
  115. self._user: uid_t = uid_t(user)
  116. self._loc: HGSLocation = location
  117. finally:
  118. self._lock.release()
  119. def config_check(self, use_right: bool, check_uid: uid_t):
  120. try:
  121. self._lock.acquire()
  122. assert self._have_use
  123. assert not self._have_check
  124. self._have_check = True
  125. self._check = bool(use_right)
  126. self._checker = uid_t(check_uid)
  127. finally:
  128. self._lock.release()