forked from Boris-code/feapder
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathitem.py
More file actions
145 lines (114 loc) · 3.81 KB
/
item.py
File metadata and controls
145 lines (114 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# -*- coding: utf-8 -*-
"""
Created on 2018-07-26 22:28:10
---------
@summary: 定义实体
---------
@author: Boris
@email: boris_liu@foxmail.com
"""
import feapder.utils.tools as tools
class ItemMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs.setdefault("__name__", None)
attrs.setdefault("__table_name__", None)
attrs.setdefault("__name_underline__", None)
attrs.setdefault("__update_key__", None)
attrs.setdefault("__unique_key__", None)
return type.__new__(cls, name, bases, attrs)
class Item(metaclass=ItemMetaclass):
__unique_key__ = []
def __init__(self, **kwargs):
self.__dict__ = kwargs
def __repr__(self):
return "<{}: {}>".format(self.item_name, tools.dumps_json(self.to_dict))
def __getitem__(self, key):
return self.__dict__[key]
def __setitem__(self, key, value):
self.__dict__[key] = value
def pre_to_db(self):
"""
入库前的处理
"""
pass
@property
def to_dict(self):
propertys = {}
for key, value in self.__dict__.items():
if key not in (
"__name__",
"__table_name__",
"__name_underline__",
"__update_key__",
"__unique_key__",
):
if key.startswith(f"_{self.__class__.__name__}"):
key = key.replace(f"_{self.__class__.__name__}", "")
propertys[key] = value
return propertys
def to_sql(self, auto_update=False, update_columns=()):
return tools.make_insert_sql(
self.table_name, self.to_dict, auto_update, update_columns
)
@property
def item_name(self):
return self.__name__ or self.__class__.__name__
@item_name.setter
def item_name(self, name):
self.__name__ = name
self.__table_name__ = self.name_underline.replace("_item", "")
@property
def table_name(self):
if not self.__table_name__:
self.__table_name__ = self.name_underline.replace("_item", "")
return self.__table_name__
@table_name.setter
def table_name(self, name):
self.__table_name__ = name
self.__name__ = tools.key2hump(name) + "Item"
@property
def name_underline(self):
if not self.__name_underline__:
self.__name_underline__ = tools.key2underline(self.item_name)
return self.__name_underline__
@name_underline.setter
def name_underline(self, name):
self.__name_underline__ = name
@property
def unique_key(self):
return self.__unique_key__ or self.__class__.__unique_key__
@unique_key.setter
def unique_key(self, keys):
if isinstance(keys, (tuple, list)):
self.__unique_key__ = keys
else:
self.__unique_key__ = (keys,)
@property
def fingerprint(self):
args = []
for key, value in self.to_dict.items():
if value:
if (self.unique_key and key in self.unique_key) or not self.unique_key:
args.append(str(value))
if args:
args = sorted(args)
return tools.get_md5(*args)
else:
return None
def to_UpdateItem(self):
update_item = UpdateItem(**self.__dict__)
update_item.item_name = self.item_name
return update_item
class UpdateItem(Item):
__update_key__ = []
def __init__(self, **kwargs):
super(UpdateItem, self).__init__(**kwargs)
@property
def update_key(self):
return self.__update_key__ or self.__class__.__update_key__
@update_key.setter
def update_key(self, keys):
if isinstance(keys, (tuple, list)):
self.__update_key__ = keys
else:
self.__update_key__ = (keys,)