-
Notifications
You must be signed in to change notification settings - Fork 546
Expand file tree
/
Copy pathitem.py
More file actions
176 lines (140 loc) · 4.72 KB
/
Copy pathitem.py
File metadata and controls
176 lines (140 loc) · 4.72 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# -*- coding: utf-8 -*-
"""
Created on 2018-07-26 22:28:10
---------
@summary: 定义实体
---------
@author: Boris
@email: boris_liu@foxmail.com
"""
import re
from typing import List
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)
attrs.setdefault("__pipelines__", None)
return type.__new__(cls, name, bases, attrs)
class Item(metaclass=ItemMetaclass):
__unique_key__: List = []
__pipelines__: List = None
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 update(self, *args, **kwargs):
"""
更新字段,与字典使用方法一致
"""
self.__dict__.update(*args, **kwargs)
def update_strict(self, *args, **kwargs):
"""
更新严格更新,只更新item中有的字段
"""
for key, value in dict(*args, **kwargs).items():
if key in self.__dict__:
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__",
"__pipelines__",
):
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__ = re.sub("_item$", "", self.name_underline)
@property
def table_name(self):
if not self.__table_name__:
self.__table_name__ = re.sub("_item$", "", self.name_underline)
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 pipelines(self):
return self.__pipelines__ or self.__class__.__pipelines__
@pipelines.setter
def pipelines(self, pipelines):
if isinstance(pipelines, (tuple, list)):
self.__pipelines__ = pipelines
else:
self.__pipelines__ = (pipelines,)
@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(key + 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,)