mwgencode 1.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gencode/__init__.py +140 -0
- gencode/dd_models.py +256 -0
- gencode/ext.py +19 -0
- gencode/gen_code.py +343 -0
- gencode/gencode/__init__.py +0 -0
- gencode/gencode/export_class2swgclass.py +206 -0
- gencode/gencode/gen_bo_models_code.py +719 -0
- gencode/gencode/gen_state_code.py +171 -0
- gencode/gencode/gen_swagger_code.py +94 -0
- gencode/gencode/gen_tests_code.py +113 -0
- gencode/gencode/sample/__init__.py +2 -0
- gencode/gencode/sample/babel.cfg +3 -0
- gencode/gencode/sample/config-sample.ini +9 -0
- gencode/gencode/sample/config.ini +14 -0
- gencode/gencode/sample/create_new_table_run.pys +19 -0
- gencode/gencode/sample/dockerignore.dock +57 -0
- gencode/gencode/sample/file_utils.pys +396 -0
- gencode/gencode/sample/gencode.xmi +33 -0
- gencode/gencode/sample/gitignore.git +14 -0
- gencode/gencode/sample/migrate_run.bat +5 -0
- gencode/gencode/sample/migrate_run.pys +9 -0
- gencode/gencode/sample/requirements.txt +17 -0
- gencode/gencode/sample/run.sh +27 -0
- gencode/gencode/sample/seeds/__init__.py +0 -0
- gencode/gencode/sample/seeds/models_rm.pys +187 -0
- gencode/gencode/sample/seeds/seed_dev_data.pys +21 -0
- gencode/gencode/sample/seeds/seed_init.pys +17 -0
- gencode/gencode/sample/seeds/seed_rm.pys +39 -0
- gencode/gencode/sample/seeds/seed_run.pys +13 -0
- gencode/gencode/sample/seeds/seed_utils.pys +23 -0
- gencode/gencode/sample/test__init__.pys +6 -0
- gencode/gencode/sample/test_run.pys +4 -0
- gencode/gencode/sample/utils.pys +92 -0
- gencode/gencode/template/Dockerfile.tmp +55 -0
- gencode/gencode/template/README.md +91 -0
- gencode/gencode/template/__init__.py +0 -0
- gencode/gencode/template/__init__.pys +99 -0
- gencode/gencode/template/config.pys +134 -0
- gencode/gencode/template/default.conf +21 -0
- gencode/gencode/template/docker-compose-dev.yaml +52 -0
- gencode/gencode/template/docker-compose.yaml +55 -0
- gencode/gencode/template/drone.tmp +45 -0
- gencode/gencode/template/flask_models.pys +107 -0
- gencode/gencode/template/flask_models_base.pys +159 -0
- gencode/gencode/template/gen_code_flask.yaml +21 -0
- gencode/gencode/template/gen_code_run.pys +28 -0
- gencode/gencode/template/k8s-tmp.yml +141 -0
- gencode/gencode/template/run.pys +52 -0
- gencode/gencode/template/sample.mdj +1193 -0
- gencode/gencode/template/setup.tmp +48 -0
- gencode/gencode/template/supervisord.conf +21 -0
- gencode/gencode/template/swagger_file.yaml +195 -0
- gencode/gencode/template/swg_class.tmp +41 -0
- gencode/gencode/template/swg_ctrl_code.pys +130 -0
- gencode/gencode/template/swg_package_mng.tmp +4423 -0
- gencode/gencode/template/test_test_base.tmp +34 -0
- gencode/gencode/template/tests/__init__.py +0 -0
- gencode/gencode/template/tests/__init__.pys +5 -0
- gencode/gencode/template/tests/init_test_data.pys +80 -0
- gencode/gencode/template/tests/run.pys +4 -0
- gencode/gencode/template/tests/test_base.pys +87 -0
- gencode/gencode/template/tests/test_classmng.pys +58 -0
- gencode/gencode/template/uwsgi.ini +20 -0
- gencode/gencode/template/uwsgi_run.pys +44 -0
- gencode/importmdj/__init__.py +0 -0
- gencode/importmdj/import_dd_classes.py +369 -0
- gencode/importmdj/import_swagger2_class.py +371 -0
- gencode/importmdj/import_uml_models.py +466 -0
- gencode/importxmi/__init__.py +1 -0
- gencode/importxmi/import_classes.py +342 -0
- gencode/importxmi/import_sequences.py +291 -0
- gencode/importxmi/import_states.py +150 -0
- gencode/importxmi/import_swagger.py +151 -0
- gencode/swg2_class_models.py +179 -0
- gencode/uml_class_models.py +295 -0
- gencode/upgrade.py +113 -0
- gencode/utils.py +225 -0
- manage.py +194 -0
- mwgencode-1.4.1.dist-info/METADATA +325 -0
- mwgencode-1.4.1.dist-info/RECORD +84 -0
- mwgencode-1.4.1.dist-info/WHEEL +5 -0
- mwgencode-1.4.1.dist-info/entry_points.txt +2 -0
- mwgencode-1.4.1.dist-info/licenses/LICENSE.txt +19 -0
- mwgencode-1.4.1.dist-info/top_level.txt +2 -0
gencode/__init__.py
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# from sqlalchemy import create_engine
|
|
2
|
+
# from sqlalchemy.orm import sessionmaker
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from mwutils.utils import none2default
|
|
5
|
+
# from . import importxmi
|
|
6
|
+
import logging
|
|
7
|
+
# engine = create_engine('sqlite:///:memory:')
|
|
8
|
+
# Session = sessionmaker(bind=engine)
|
|
9
|
+
|
|
10
|
+
uml="http://schema.omg.org/spec/UML/2.0"
|
|
11
|
+
xmi="{http://schema.omg.org/spec/XMI/2.1}"
|
|
12
|
+
_id = xmi+"id"
|
|
13
|
+
_type = xmi+"type"
|
|
14
|
+
_extension = xmi+'Extension'
|
|
15
|
+
|
|
16
|
+
# 可以用来定义企业相关的规则的物件类别
|
|
17
|
+
bo_types=['uml:DataType','uml:Signal','uml:PrimitiveType','uml:Class']
|
|
18
|
+
|
|
19
|
+
class AttribType(Enum):
|
|
20
|
+
none = 'none'
|
|
21
|
+
data = 'data'
|
|
22
|
+
object = 'object'
|
|
23
|
+
|
|
24
|
+
class ImportBase():
|
|
25
|
+
def find_bo_classes(self, pkg_p, types=bo_types, result = None):
|
|
26
|
+
# 查找package下所有符合类型的object
|
|
27
|
+
if result is None:
|
|
28
|
+
result = []
|
|
29
|
+
pkgs = pkg_p.findall('packagedElement')
|
|
30
|
+
for pkg in pkgs:
|
|
31
|
+
if pkg.attrib.get(_type) in ['uml:Model', 'uml:Package', 'uml:Subsystem']:
|
|
32
|
+
self.find_bo_classes(pkg, types, result)
|
|
33
|
+
if pkg.attrib.get(_type, None) in types:
|
|
34
|
+
result.append({'id': pkg.attrib.get(_id), 'obj': pkg})
|
|
35
|
+
return result
|
|
36
|
+
|
|
37
|
+
def _get_exten_value(self, attr,name):
|
|
38
|
+
extens = attr.find(_extension)
|
|
39
|
+
if extens is not None:
|
|
40
|
+
stereotype = extens.find(name)
|
|
41
|
+
if stereotype is not None:
|
|
42
|
+
return stereotype.attrib.get('value')
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
def get_stereotype(self, attr):
|
|
46
|
+
return none2default(self._get_exten_value(attr,'stereotype'),'').split('/')
|
|
47
|
+
|
|
48
|
+
def get_doc(self, attr):
|
|
49
|
+
result = self._get_exten_value(attr, 'documentation')
|
|
50
|
+
result = result if result else ''
|
|
51
|
+
# 替换“,避免yaml出错
|
|
52
|
+
return result.replace('"','\'')
|
|
53
|
+
|
|
54
|
+
def get_operations(self, pkg):
|
|
55
|
+
assert pkg.attrib.get(_type, None) in bo_types,'pkg必输是企业物件类型(%s)'%bo_types
|
|
56
|
+
own_op =pkg.findall('ownedOperation')
|
|
57
|
+
result = []
|
|
58
|
+
for op in own_op:
|
|
59
|
+
if op.attrib.get(_type)!= 'uml:Operation' :
|
|
60
|
+
continue
|
|
61
|
+
op_d= {}
|
|
62
|
+
is_array = False
|
|
63
|
+
# get,put,post,delete 等方法
|
|
64
|
+
op_d['stereotype'] = self.get_stereotype(op)
|
|
65
|
+
op_d['name'] = op.attrib.get('name')
|
|
66
|
+
op_d['doc'] = self.get_doc(op)
|
|
67
|
+
own_params = op.findall('ownedParameter')
|
|
68
|
+
for param in own_params:
|
|
69
|
+
type = param.attrib.get('type')
|
|
70
|
+
if type is None :
|
|
71
|
+
continue
|
|
72
|
+
try:
|
|
73
|
+
if type.endswith('_id'):
|
|
74
|
+
type = AttribType.data.value
|
|
75
|
+
typename = type.split('_')[0]
|
|
76
|
+
# 判断是否是数组
|
|
77
|
+
else:
|
|
78
|
+
typename = type
|
|
79
|
+
type = AttribType.object.value
|
|
80
|
+
is_array = param.find('upperValue') is not None
|
|
81
|
+
|
|
82
|
+
except Exception as e:
|
|
83
|
+
logging.error('参数没有指定type,example:【in:g_xxx_i(r)】,error:', e, param.attrib)
|
|
84
|
+
raise
|
|
85
|
+
direction = param.attrib.get('direction')
|
|
86
|
+
param_d = {#'id':param.attrib.get(_id),
|
|
87
|
+
'name':param.attrib.get('name'),
|
|
88
|
+
'type':type,
|
|
89
|
+
'typename':typename,
|
|
90
|
+
'is_array':is_array,
|
|
91
|
+
'doc':self.get_doc(param),
|
|
92
|
+
'stereotype':self.get_stereotype(param)}
|
|
93
|
+
op_d[direction] = param_d
|
|
94
|
+
result.append(op_d)
|
|
95
|
+
return result
|
|
96
|
+
|
|
97
|
+
def get_defaultvalue(self,attr):
|
|
98
|
+
def_value = attr.find('defaultValue')
|
|
99
|
+
if def_value is not None:
|
|
100
|
+
return def_value.get('value')
|
|
101
|
+
return ''
|
|
102
|
+
|
|
103
|
+
def get_attributes(self, pkg):
|
|
104
|
+
attrs = pkg.findall('ownedAttribute')
|
|
105
|
+
result = []
|
|
106
|
+
for attr in attrs:
|
|
107
|
+
if attr.attrib.get(_type) != 'uml:Property':
|
|
108
|
+
continue
|
|
109
|
+
type = attr.attrib.get('type')
|
|
110
|
+
is_array = False
|
|
111
|
+
if type is None :
|
|
112
|
+
typename = 'none'
|
|
113
|
+
type = AttribType.none.value
|
|
114
|
+
elif type.endswith('_id'):
|
|
115
|
+
typename = type.split('_')[0]
|
|
116
|
+
type = AttribType.data.value
|
|
117
|
+
is_array = attr.find('upperValue') is not None
|
|
118
|
+
# 判断是否是数组
|
|
119
|
+
else:
|
|
120
|
+
typename = type
|
|
121
|
+
type = AttribType.object.value
|
|
122
|
+
is_array = attr.find('upperValue') is not None
|
|
123
|
+
result.append({#'id': attr.attrib.get(_id),
|
|
124
|
+
'name': attr.attrib.get('name'),
|
|
125
|
+
'type': type,
|
|
126
|
+
'typename': typename,
|
|
127
|
+
'is_array':is_array,
|
|
128
|
+
'doc': self.get_doc(attr),
|
|
129
|
+
'stereotype': self.get_stereotype(attr),
|
|
130
|
+
'defaultvalue':self.get_defaultvalue(attr)})
|
|
131
|
+
return result
|
|
132
|
+
|
|
133
|
+
def get_bo_class(self, pkg):
|
|
134
|
+
return {'name': pkg.attrib.get('name'),
|
|
135
|
+
'id' : pkg.attrib.get(_id),
|
|
136
|
+
'doc': self.get_doc(pkg),
|
|
137
|
+
'stereotype': self.get_stereotype(pkg),
|
|
138
|
+
'type':pkg.attrib.get(_type),
|
|
139
|
+
'attrs': self.get_attributes(pkg),
|
|
140
|
+
'ops': self.get_operations(pkg)}
|
gencode/dd_models.py
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
|
|
2
|
+
from sqlalchemy.orm import relationship
|
|
3
|
+
from sqlalchemy.ext.declarative import declarative_base
|
|
4
|
+
import json
|
|
5
|
+
from .ext import Base
|
|
6
|
+
from enum import Enum
|
|
7
|
+
# Base = declarative_base()
|
|
8
|
+
|
|
9
|
+
class Relationship_type(Enum):
|
|
10
|
+
o2o = 'one_to_one'
|
|
11
|
+
o2m = 'one_to_many'
|
|
12
|
+
m2o = 'many_to_one'
|
|
13
|
+
m2m = 'many_to_many'
|
|
14
|
+
|
|
15
|
+
def get_relationship_type(multi1,multi2,navig1,navig2):
|
|
16
|
+
if (multi1 == 1) and (multi2 == 1):
|
|
17
|
+
return Relationship_type.o2o.value
|
|
18
|
+
elif (multi1 == 1 and multi2 > 1) or (multi1 > 1 and multi2 == 1 ):
|
|
19
|
+
if (navig1 and navig2) or (multi1 > multi2 and navig1) or (multi1 < multi2 and navig2):
|
|
20
|
+
return Relationship_type.o2m.value
|
|
21
|
+
else:
|
|
22
|
+
return Relationship_type.m2o.value
|
|
23
|
+
elif (multi1 > 1 and multi2 > 1):
|
|
24
|
+
return Relationship_type.m2m.value
|
|
25
|
+
return ''
|
|
26
|
+
|
|
27
|
+
def new_id():
|
|
28
|
+
from datetime import datetime
|
|
29
|
+
return datetime.today().strftime("%Y%m%d%H%M%S%f")
|
|
30
|
+
|
|
31
|
+
class Databasedictionary(Base):
|
|
32
|
+
__tablename__ = 'databasedictionary'
|
|
33
|
+
name = Column(String(50))
|
|
34
|
+
description = Column(String(255))
|
|
35
|
+
dbtype = Column(Integer)
|
|
36
|
+
id = Column(String(50), primary_key=True)
|
|
37
|
+
tabledictionarys = relationship("Tabledictionary", backref="databasedictionary",
|
|
38
|
+
cascade="all, delete-orphan")
|
|
39
|
+
|
|
40
|
+
def __repr__(self):
|
|
41
|
+
return json.dumps(self.to_json())
|
|
42
|
+
|
|
43
|
+
def to_json(self):
|
|
44
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()}
|
|
45
|
+
|
|
46
|
+
class Fielddictionary(Base):
|
|
47
|
+
__tablename__ = 'fielddictionary'
|
|
48
|
+
gb32name = Column(String(50))
|
|
49
|
+
doc = Column(String(50))
|
|
50
|
+
repfields = Column(String(50))
|
|
51
|
+
plkfieldpath = Column(String(50))
|
|
52
|
+
plkfieldcode = Column(String(50))
|
|
53
|
+
fieldname = Column(String(50), nullable=False)
|
|
54
|
+
|
|
55
|
+
#类图属性名可能同资料库的名称不同
|
|
56
|
+
mapname = Column(String(50))
|
|
57
|
+
fieldsize = Column(Integer)
|
|
58
|
+
englishname = Column(String(50))
|
|
59
|
+
isallownull = Column(Boolean,default=True)
|
|
60
|
+
# TKeyType=(ktUnkown,ktKey,ktForeignKey,ktNotKey,ktsys);
|
|
61
|
+
keytype = Column(Integer)
|
|
62
|
+
fieldtype = Column(String(50))
|
|
63
|
+
big5name = Column(String(50))
|
|
64
|
+
# TFieldFrom=(ffUnknown,ffDatabase,ffLookup,ffCustom);
|
|
65
|
+
fieldfrom = Column(Integer)
|
|
66
|
+
othername = Column(String(50))
|
|
67
|
+
defaultvalue = Column(String(50))
|
|
68
|
+
id = Column(String(50), primary_key=True)
|
|
69
|
+
tabledictionaryid = Column(String(50), ForeignKey("tabledictionary.id"), nullable=False)
|
|
70
|
+
|
|
71
|
+
def __repr__(self):
|
|
72
|
+
return json.dumps(self.to_json())
|
|
73
|
+
|
|
74
|
+
def to_json(self):
|
|
75
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class Roledictionary(Base):
|
|
79
|
+
__tablename__ = 'roledictionary'
|
|
80
|
+
end1_rolename = Column(String(50))
|
|
81
|
+
end1_multiplicity = Column(Integer,default=0)
|
|
82
|
+
end1_navigable = Column(Boolean)
|
|
83
|
+
end1_reftableid = Column(String(50), ForeignKey("tabledictionary.id"))
|
|
84
|
+
end1_reftable = relationship("Tabledictionary", foreign_keys=[end1_reftableid], uselist=False)
|
|
85
|
+
end1_mapid = Column(String(50))
|
|
86
|
+
end1_aggregation = Column(String(50))
|
|
87
|
+
end2_multiplicity = Column(Integer, default=0)
|
|
88
|
+
end2_navigable = Column(Boolean)
|
|
89
|
+
end2_rolename = Column(String(50))
|
|
90
|
+
end2_reftableid = Column(String(50), ForeignKey("tabledictionary.id"))
|
|
91
|
+
end2_reftable = relationship("Tabledictionary", foreign_keys=[end2_reftableid], uselist=False)
|
|
92
|
+
end2_mapid = Column(String(50))
|
|
93
|
+
end2_aggregation = Column(String(50))
|
|
94
|
+
# masterdetail = Column(Boolean)
|
|
95
|
+
ref = Column(Boolean)
|
|
96
|
+
req = Column(Boolean)
|
|
97
|
+
# primaryjoin
|
|
98
|
+
flt = Column(String(100))
|
|
99
|
+
# order_by
|
|
100
|
+
ord = Column(String(50))
|
|
101
|
+
ownertableid = Column(String(50), ForeignKey("tabledictionary.id"))
|
|
102
|
+
ownertable = relationship("Tabledictionary", foreign_keys=[ownertableid], backref="roledictionarys")
|
|
103
|
+
|
|
104
|
+
# 多对多关联类
|
|
105
|
+
is_assoc_table = Column(Boolean)
|
|
106
|
+
assoc_tableid = Column(String(50), ForeignKey("tabledictionary.id"))
|
|
107
|
+
assoc_table = relationship("Tabledictionary", foreign_keys=[assoc_tableid],uselist=False)
|
|
108
|
+
|
|
109
|
+
# refmasterdetail = Column(Boolean)
|
|
110
|
+
id = Column(String(50), primary_key=True)
|
|
111
|
+
# 关联id 是否要加下划线
|
|
112
|
+
underline = Column(Boolean,default=False)
|
|
113
|
+
# 记录database的id,用以区分是哪个资料库
|
|
114
|
+
ddid = Column(String(50))
|
|
115
|
+
end1_lazy = Column(String(50))
|
|
116
|
+
end2_lazy = Column(String(50))
|
|
117
|
+
@property
|
|
118
|
+
def end1_foreign_key_name(self):
|
|
119
|
+
get_id = lambda underline: '_id' if underline else 'id'
|
|
120
|
+
return (self.end1_rolename + get_id(self.underline)).lower()
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def end2_foreign_key_name(self):
|
|
124
|
+
get_id = lambda underline: '_id' if underline else 'id'
|
|
125
|
+
return (self.end2_rolename + get_id(self.underline)).lower()
|
|
126
|
+
|
|
127
|
+
def __get_relationship_type(self):
|
|
128
|
+
return get_relationship_type(self.end1_multiplicity, self.end2_multiplicity,
|
|
129
|
+
self.end1_navigable, self.end2_navigable)
|
|
130
|
+
# 是一对一关系,做双向
|
|
131
|
+
def is_o2o(self):
|
|
132
|
+
return self.__get_relationship_type()==Relationship_type.o2o.value
|
|
133
|
+
# 多对一关系,只处理单向,当lookup关系
|
|
134
|
+
def is_m2o(self):
|
|
135
|
+
return self.__get_relationship_type()==Relationship_type.m2o.value
|
|
136
|
+
# 一对多,做双向
|
|
137
|
+
def is_o2m(self):
|
|
138
|
+
return self.__get_relationship_type()==Relationship_type.o2m.value
|
|
139
|
+
|
|
140
|
+
# 多对多
|
|
141
|
+
def is_m2m(self):
|
|
142
|
+
return self.__get_relationship_type() == Relationship_type.m2m.value
|
|
143
|
+
|
|
144
|
+
# master-detail关系
|
|
145
|
+
def is_md(self):
|
|
146
|
+
return (self.end1_aggregation == 'composite' or
|
|
147
|
+
self.end2_aggregation == 'composite')\
|
|
148
|
+
and self.is_o2m()
|
|
149
|
+
|
|
150
|
+
# 自引用
|
|
151
|
+
def is_tree(self):
|
|
152
|
+
return (self.end1_reftableid== self.end2_reftableid)or\
|
|
153
|
+
(self.end1_reftable.is_sigletable and self.end2_reftable.is_sigletable and
|
|
154
|
+
self.end1_reftable.parentid==self.end2_reftable.id
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def __repr__(self):
|
|
158
|
+
return json.dumps(self.to_json())
|
|
159
|
+
|
|
160
|
+
def to_json(self):
|
|
161
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()}
|
|
162
|
+
|
|
163
|
+
class Tabledictionary(Base):
|
|
164
|
+
__tablename__ = 'tabledictionary'
|
|
165
|
+
# viewsql = Column(String(2048))
|
|
166
|
+
id = Column(String(50), primary_key=True)
|
|
167
|
+
databasedictionaryid = Column(String(50), ForeignKey("databasedictionary.id"), nullable=False)
|
|
168
|
+
tablename = Column(String(50), nullable=False, unique=True)
|
|
169
|
+
maptablename = Column(String(50))
|
|
170
|
+
# 第二个资料库
|
|
171
|
+
bind_db = Column(String(50))
|
|
172
|
+
description = Column(String(250))
|
|
173
|
+
fielddictionarys = relationship("Fielddictionary", backref="tabledictionary",
|
|
174
|
+
cascade="all, delete-orphan")
|
|
175
|
+
ddoperations = relationship("Ddoperation", backref="parent",
|
|
176
|
+
cascade="all, delete-orphan")
|
|
177
|
+
# 是父类
|
|
178
|
+
is_parentclass = Column(Boolean,default=False)
|
|
179
|
+
|
|
180
|
+
# 儿子类有parent
|
|
181
|
+
parentid = Column(String(50),ForeignKey("tabledictionary.id"))
|
|
182
|
+
parent = relationship("Tabledictionary", foreign_keys="Tabledictionary.parentid", remote_side=[id])
|
|
183
|
+
# 继承关系只有一个table
|
|
184
|
+
is_sigletable = Column(Boolean,default=False)
|
|
185
|
+
# 是多对多关联类
|
|
186
|
+
is_assoc_table = Column(Boolean)
|
|
187
|
+
# 纯多对多关联类,没有任何栏位的不需要在model中产生后代类
|
|
188
|
+
is_need_sonboclass = Column(Boolean, default=True)
|
|
189
|
+
# 抽象类
|
|
190
|
+
isabstract = Column(Boolean, default=False)
|
|
191
|
+
|
|
192
|
+
def get_keyfield(self):
|
|
193
|
+
for fld in self.fielddictionarys:
|
|
194
|
+
if fld.keytype==1:
|
|
195
|
+
return fld
|
|
196
|
+
return None
|
|
197
|
+
|
|
198
|
+
def __repr__(self):
|
|
199
|
+
return json.dumps(self.to_json())
|
|
200
|
+
|
|
201
|
+
def to_json(self):
|
|
202
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class Ddoperation(Base):
|
|
206
|
+
__tablename__ = 'ddoperation'
|
|
207
|
+
id = Column(String(50), primary_key=True)
|
|
208
|
+
name = Column(String(50))
|
|
209
|
+
stereotype = Column(String(50))
|
|
210
|
+
doc = Column(String(50))
|
|
211
|
+
py_params = Column(String(50))
|
|
212
|
+
specification = Column(String(500))
|
|
213
|
+
isabstract = Column(Boolean, default= False)
|
|
214
|
+
isquery = Column(Boolean, default= False)
|
|
215
|
+
isstatic = Column(Boolean, default= False)
|
|
216
|
+
parentid = Column(String(50),ForeignKey("tabledictionary.id"), nullable= False)
|
|
217
|
+
# parent = relationship("Tabledictionary", back_populates="ddoperations", foreign_keys="Ddoperation.parentid")
|
|
218
|
+
def __repr__(self):
|
|
219
|
+
return json.dumps(self.to_json())
|
|
220
|
+
def to_json(self):
|
|
221
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
222
|
+
if hasattr(self,key)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class DBEnumeration(Base):
|
|
227
|
+
__tablename__ = "dbenumeration"
|
|
228
|
+
name = Column(String(50))
|
|
229
|
+
# 支持string,integer,boolean
|
|
230
|
+
type = Column(String(50))
|
|
231
|
+
doc = Column(String(50))
|
|
232
|
+
# 关联类的关联
|
|
233
|
+
enumeitems = relationship("DBEnumeitem")
|
|
234
|
+
id = Column(String(50), primary_key=True)
|
|
235
|
+
# 记录database的id,用以区分专案
|
|
236
|
+
ddid = Column(String(50))
|
|
237
|
+
def __repr__(self):
|
|
238
|
+
return json.dumps(self.to_json())
|
|
239
|
+
|
|
240
|
+
def to_json(self):
|
|
241
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()}
|
|
242
|
+
|
|
243
|
+
class DBEnumeitem(Base):
|
|
244
|
+
__tablename__ = "dbenumeitem"
|
|
245
|
+
name = Column(String(50))
|
|
246
|
+
type = Column(String(50))
|
|
247
|
+
value = Column(String(50))
|
|
248
|
+
doc = Column(String(50))
|
|
249
|
+
id = Column(String(50), primary_key=True)
|
|
250
|
+
enumerationid = Column(String(50), ForeignKey("dbenumeration.id"))
|
|
251
|
+
|
|
252
|
+
def __repr__(self):
|
|
253
|
+
return json.dumps(self.to_json())
|
|
254
|
+
|
|
255
|
+
def to_json(self):
|
|
256
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()}
|
gencode/ext.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from sqlalchemy.ext.declarative import declarative_base
|
|
2
|
+
from sqlalchemy import create_engine
|
|
3
|
+
from sqlalchemy.orm import sessionmaker
|
|
4
|
+
|
|
5
|
+
Base = declarative_base()
|
|
6
|
+
|
|
7
|
+
# class Base(Model):
|
|
8
|
+
# # # create_at这个属性也是创建表结构默认都包含的
|
|
9
|
+
# # create_at = Column(DateTime, default=datetime.utcnow())
|
|
10
|
+
# def to_json(self):
|
|
11
|
+
# columns = self.__table__.columns.keys()
|
|
12
|
+
# return {key: getattr(self, key) for key in columns}
|
|
13
|
+
|
|
14
|
+
engine = create_engine('sqlite:///:memory:')
|
|
15
|
+
Session = sessionmaker(bind=engine)
|
|
16
|
+
|
|
17
|
+
def new_id():
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
return datetime.today().strftime("%Y%m%d%H%M%S%f")
|