item.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2018-07-26 22:28:10
  4. ---------
  5. @summary: 定义实体
  6. ---------
  7. @author: Boris
  8. @email: boris_liu@foxmail.com
  9. """
  10. import feapder.utils.tools as tools
  11. class ItemMetaclass(type):
  12. def __new__(cls, name, bases, attrs):
  13. attrs.setdefault("__name__", None)
  14. attrs.setdefault("__table_name__", None)
  15. attrs.setdefault("__name_underline__", None)
  16. attrs.setdefault("__update_key__", None)
  17. attrs.setdefault("__unique_key__", None)
  18. return type.__new__(cls, name, bases, attrs)
  19. class Item(metaclass=ItemMetaclass):
  20. __unique_key__ = []
  21. def __init__(self, **kwargs):
  22. self.__dict__ = kwargs
  23. def __repr__(self):
  24. return "<{}: {}>".format(self.item_name, tools.dumps_json(self.to_dict))
  25. def __getitem__(self, key):
  26. return self.__dict__[key]
  27. def __setitem__(self, key, value):
  28. self.__dict__[key] = value
  29. def pre_to_db(self):
  30. """
  31. 入库前的处理
  32. """
  33. pass
  34. @property
  35. def to_dict(self):
  36. propertys = {}
  37. for key, value in self.__dict__.items():
  38. if key not in (
  39. "__name__",
  40. "__table_name__",
  41. "__name_underline__",
  42. "__update_key__",
  43. "__unique_key__",
  44. ):
  45. if key.startswith(f"_{self.__class__.__name__}"):
  46. key = key.replace(f"_{self.__class__.__name__}", "")
  47. propertys[key] = value
  48. return propertys
  49. def to_sql(self, auto_update=False, update_columns=()):
  50. return tools.make_insert_sql(
  51. self.table_name, self.to_dict, auto_update, update_columns
  52. )
  53. @property
  54. def item_name(self):
  55. return self.__name__ or self.__class__.__name__
  56. @item_name.setter
  57. def item_name(self, name):
  58. self.__name__ = name
  59. self.__table_name__ = self.name_underline.replace("_item", "")
  60. @property
  61. def table_name(self):
  62. if not self.__table_name__:
  63. self.__table_name__ = self.name_underline.replace("_item", "")
  64. return self.__table_name__
  65. @table_name.setter
  66. def table_name(self, name):
  67. self.__table_name__ = name
  68. self.__name__ = tools.key2hump(name) + "Item"
  69. @property
  70. def name_underline(self):
  71. if not self.__name_underline__:
  72. self.__name_underline__ = tools.key2underline(self.item_name)
  73. return self.__name_underline__
  74. @name_underline.setter
  75. def name_underline(self, name):
  76. self.__name_underline__ = name
  77. @property
  78. def unique_key(self):
  79. return self.__unique_key__ or self.__class__.__unique_key__
  80. @unique_key.setter
  81. def unique_key(self, keys):
  82. if isinstance(keys, (tuple, list)):
  83. self.__unique_key__ = keys
  84. else:
  85. self.__unique_key__ = (keys,)
  86. @property
  87. def fingerprint(self):
  88. args = []
  89. for key, value in self.to_dict.items():
  90. if value:
  91. if (self.unique_key and key in self.unique_key) or not self.unique_key:
  92. args.append(str(value))
  93. if args:
  94. args = sorted(args)
  95. return tools.get_md5(*args)
  96. else:
  97. return None
  98. def to_UpdateItem(self):
  99. update_item = UpdateItem(**self.__dict__)
  100. update_item.item_name = self.item_name
  101. return update_item
  102. class UpdateItem(Item):
  103. __update_key__ = []
  104. def __init__(self, **kwargs):
  105. super(UpdateItem, self).__init__(**kwargs)
  106. @property
  107. def update_key(self):
  108. return self.__update_key__ or self.__class__.__update_key__
  109. @update_key.setter
  110. def update_key(self, keys):
  111. if isinstance(keys, (tuple, list)):
  112. self.__update_key__ = keys
  113. else:
  114. self.__update_key__ = (keys,)