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.
Files changed (84) hide show
  1. gencode/__init__.py +140 -0
  2. gencode/dd_models.py +256 -0
  3. gencode/ext.py +19 -0
  4. gencode/gen_code.py +343 -0
  5. gencode/gencode/__init__.py +0 -0
  6. gencode/gencode/export_class2swgclass.py +206 -0
  7. gencode/gencode/gen_bo_models_code.py +719 -0
  8. gencode/gencode/gen_state_code.py +171 -0
  9. gencode/gencode/gen_swagger_code.py +94 -0
  10. gencode/gencode/gen_tests_code.py +113 -0
  11. gencode/gencode/sample/__init__.py +2 -0
  12. gencode/gencode/sample/babel.cfg +3 -0
  13. gencode/gencode/sample/config-sample.ini +9 -0
  14. gencode/gencode/sample/config.ini +14 -0
  15. gencode/gencode/sample/create_new_table_run.pys +19 -0
  16. gencode/gencode/sample/dockerignore.dock +57 -0
  17. gencode/gencode/sample/file_utils.pys +396 -0
  18. gencode/gencode/sample/gencode.xmi +33 -0
  19. gencode/gencode/sample/gitignore.git +14 -0
  20. gencode/gencode/sample/migrate_run.bat +5 -0
  21. gencode/gencode/sample/migrate_run.pys +9 -0
  22. gencode/gencode/sample/requirements.txt +17 -0
  23. gencode/gencode/sample/run.sh +27 -0
  24. gencode/gencode/sample/seeds/__init__.py +0 -0
  25. gencode/gencode/sample/seeds/models_rm.pys +187 -0
  26. gencode/gencode/sample/seeds/seed_dev_data.pys +21 -0
  27. gencode/gencode/sample/seeds/seed_init.pys +17 -0
  28. gencode/gencode/sample/seeds/seed_rm.pys +39 -0
  29. gencode/gencode/sample/seeds/seed_run.pys +13 -0
  30. gencode/gencode/sample/seeds/seed_utils.pys +23 -0
  31. gencode/gencode/sample/test__init__.pys +6 -0
  32. gencode/gencode/sample/test_run.pys +4 -0
  33. gencode/gencode/sample/utils.pys +92 -0
  34. gencode/gencode/template/Dockerfile.tmp +55 -0
  35. gencode/gencode/template/README.md +91 -0
  36. gencode/gencode/template/__init__.py +0 -0
  37. gencode/gencode/template/__init__.pys +99 -0
  38. gencode/gencode/template/config.pys +134 -0
  39. gencode/gencode/template/default.conf +21 -0
  40. gencode/gencode/template/docker-compose-dev.yaml +52 -0
  41. gencode/gencode/template/docker-compose.yaml +55 -0
  42. gencode/gencode/template/drone.tmp +45 -0
  43. gencode/gencode/template/flask_models.pys +107 -0
  44. gencode/gencode/template/flask_models_base.pys +159 -0
  45. gencode/gencode/template/gen_code_flask.yaml +21 -0
  46. gencode/gencode/template/gen_code_run.pys +28 -0
  47. gencode/gencode/template/k8s-tmp.yml +141 -0
  48. gencode/gencode/template/run.pys +52 -0
  49. gencode/gencode/template/sample.mdj +1193 -0
  50. gencode/gencode/template/setup.tmp +48 -0
  51. gencode/gencode/template/supervisord.conf +21 -0
  52. gencode/gencode/template/swagger_file.yaml +195 -0
  53. gencode/gencode/template/swg_class.tmp +41 -0
  54. gencode/gencode/template/swg_ctrl_code.pys +130 -0
  55. gencode/gencode/template/swg_package_mng.tmp +4423 -0
  56. gencode/gencode/template/test_test_base.tmp +34 -0
  57. gencode/gencode/template/tests/__init__.py +0 -0
  58. gencode/gencode/template/tests/__init__.pys +5 -0
  59. gencode/gencode/template/tests/init_test_data.pys +80 -0
  60. gencode/gencode/template/tests/run.pys +4 -0
  61. gencode/gencode/template/tests/test_base.pys +87 -0
  62. gencode/gencode/template/tests/test_classmng.pys +58 -0
  63. gencode/gencode/template/uwsgi.ini +20 -0
  64. gencode/gencode/template/uwsgi_run.pys +44 -0
  65. gencode/importmdj/__init__.py +0 -0
  66. gencode/importmdj/import_dd_classes.py +369 -0
  67. gencode/importmdj/import_swagger2_class.py +371 -0
  68. gencode/importmdj/import_uml_models.py +466 -0
  69. gencode/importxmi/__init__.py +1 -0
  70. gencode/importxmi/import_classes.py +342 -0
  71. gencode/importxmi/import_sequences.py +291 -0
  72. gencode/importxmi/import_states.py +150 -0
  73. gencode/importxmi/import_swagger.py +151 -0
  74. gencode/swg2_class_models.py +179 -0
  75. gencode/uml_class_models.py +295 -0
  76. gencode/upgrade.py +113 -0
  77. gencode/utils.py +225 -0
  78. manage.py +194 -0
  79. mwgencode-1.4.1.dist-info/METADATA +325 -0
  80. mwgencode-1.4.1.dist-info/RECORD +84 -0
  81. mwgencode-1.4.1.dist-info/WHEEL +5 -0
  82. mwgencode-1.4.1.dist-info/entry_points.txt +2 -0
  83. mwgencode-1.4.1.dist-info/licenses/LICENSE.txt +19 -0
  84. mwgencode-1.4.1.dist-info/top_level.txt +2 -0
@@ -0,0 +1,187 @@
1
+ ########################################
2
+ # create by :cxh-PC
3
+ # create time :2018-03-09 15:24:34.495989
4
+ ########################################
5
+ '''
6
+ 权限模块
7
+ '''
8
+ from datetime import datetime
9
+ from app import db
10
+ from flask import current_app
11
+ from .seed_utils import add_seed
12
+ def add_sys1(sys1id,sys1_name,sys1_caption=None):
13
+ '''
14
+ 增加根权限系统
15
+ :param sys1id: 第一层权限的id
16
+ :param sys1_name:第一层权限的名称
17
+ :param sys1_caption: 第一层权限的描述
18
+ :return:第一层权限的 subsystem物件
19
+ '''
20
+ # 大部分情况下不需要caption,避免覆盖其他地方的修改
21
+ if sys1_caption is None:
22
+ sys1 = add_seed(db.session,
23
+ Subsystem,
24
+ {'id':sys1id},
25
+ {'id':sys1id,'name':sys1_name,'parentid':'000'})
26
+ else:
27
+ sys1 = add_seed(db.session,
28
+ Subsystem,
29
+ {'id': sys1id},
30
+ {'id': sys1id, 'name': sys1_name,'caption':sys1_caption, 'parentid': '000'})
31
+ return sys1
32
+ def add_sys2(sys1,sys2_name,sys2_caption):
33
+ '''
34
+ 增加第二级权限
35
+ :param sys1:第一层权限物件
36
+ :param sys2_name: 第二层权限名
37
+ :param sys2_caption:第二层权限描述
38
+ :return:
39
+ '''
40
+ sys2 = add_seed(db.session,
41
+ Subsystem,
42
+ {'id':'%s-%s-2'%(sys1.id,sys2_name)},
43
+ {'id':'%s-%s-2'%(sys1.id,sys2_name),'name':sys2_name,'caption':sys2_caption,'parentid':sys1.id})
44
+ return sys2
45
+ def add_sys3(sys1,sys2,sys3_name,sys3_caption):
46
+ '''
47
+ 第三级权限
48
+ :param sys1:权限系统
49
+ :param sys2:权限的第二层节点
50
+ :param sys3_name : 英文名
51
+ :param sys3_caption : 中文名
52
+ :param ops: 有些权限可能只有浏览
53
+ :return:
54
+ '''
55
+ sys3 = add_seed(db.session,
56
+ Subsystem,
57
+ {'id':'%s-%s-3'%(sys1.id,sys3_name)},
58
+ {'id':'%s-%s-3'%(sys1.id,sys3_name),'name':sys3_name,'caption':sys3_caption,'parentid':sys2.id})
59
+ return sys3
60
+ def add_sys3_op(sys3,op_name,op_caption,op):
61
+ '''
62
+ 增加第三级权限下的操作,比如:op_name:upload,op_caption:上传文件,op:5
63
+ :param sys3: boclass
64
+ :param op_name: upload
65
+ :param op_caption: 上传文件
66
+ :param op: 操作码,比如:5
67
+ :return:
68
+ '''
69
+ sys3_op=add_seed(db.session,
70
+ Action,
71
+ {'id': '%s-%s' % (sys3.id,op)},
72
+ {'id': '%s-%s' % (sys3.id,op) , 'name': op_name, 'caption': op_caption, 'subsystemid': sys3.id,'operation':op})
73
+ return sys3_op
74
+ def add_sys3_and_op(sys1,sys2,sys3_name,sys3_caption,ops=None):
75
+ '''
76
+ 增加第三级boclass的权限和该boclass 下的1浏览,2新增,3修改,4删除。。。
77
+ :param cls:权限类
78
+ :param sys1:权限系统
79
+ :param sys2:权限的第二层节点
80
+ :param sys3_caption : 类别的中文名
81
+ :param ops: 有些权限可能只有浏览,新增,如:[1,2]
82
+ :return:
83
+ '''
84
+ if ops is None:
85
+ ops = [1,2,3,4]
86
+ cls_name = sys3_name.lower()
87
+ sys3 = add_sys3(sys1,sys2,cls_name,sys3_caption)
88
+ if 1 in ops:
89
+ add_sys3_op(sys3,'view','浏览',1)
90
+ if 2 in ops:
91
+ add_sys3_op(sys3,'insert','新增',2)
92
+ if 3 in ops:
93
+ add_sys3_op(sys3,'edit','修改',3)
94
+ if 4 in ops:
95
+ add_sys3_op(sys3,'delete','删除',4)
96
+ return sys3
97
+
98
+ def new_id():
99
+ sql_url=current_app.config['SQLALCHEMY_DATABASE_URI']
100
+ connection = db.engine.raw_connection()
101
+ try:
102
+ cursor = connection.cursor()
103
+ if sql_url.startswith('mysql+mysqldb'):
104
+ cursor.callproc("sp_getobjectids_new", [1])
105
+ else:
106
+ # 不知为何cursor.callproc 在 mssql中取不到资料??
107
+ cursor.execute("exec pro_gettableid 1")
108
+ newid = cursor.fetchone()[0]
109
+ cursor.close()
110
+ connection.commit()
111
+ finally:
112
+ connection.close()
113
+ return str(newid)
114
+
115
+ class Subsystem(db.Model):
116
+ __tablename__ = 'subsystem'
117
+ id = db.Column(db.String(50), primary_key=True)
118
+ name = db.Column(db.String(50))
119
+ caption = db.Column(db.String(50))
120
+ parentid = db.Column(db.String(50), db.ForeignKey('subsystem.id'))
121
+ subsystems = db.relationship("Subsystem")
122
+ actions = db.relationship("Action")
123
+ def __repr__(self):
124
+ return "subsystem(name:%s,caption:%s)"%(self.name,self.caption)
125
+ class Action(db.Model):
126
+ __tablename__ = 'appaction'
127
+ id = db.Column(db.String(50),primary_key=True)
128
+ name = db.Column(db.String(50))
129
+ caption = db.Column(db.String(50))
130
+ subsystemid = db.Column(db.String(50),db.ForeignKey('subsystem.id'))
131
+ operation = db.Column(db.Integer,default=1)
132
+ def __repr__(self):
133
+ return "appaction(name:%s,operation:%d)"%(self.name,self.operation)
134
+
135
+ # class Role(db.Model):
136
+ # __tablename__ = 'approle'
137
+ # id = db.Column(db.String(50), primary_key=True)
138
+ # name = db.Column(db.String(50), unique=True)
139
+ # description = db.Column(db.String(50))
140
+ # # 管理员新增的用户只能是False
141
+ # issystem = db.Column(db.Boolean, default=False)
142
+ #
143
+ # def to_json(self):
144
+ # return {"id": self.id,
145
+ # "name": self.name,
146
+ # "issystem": self.issystem or False,
147
+ # "description": self.description}
148
+ #
149
+ # def __repr__(self):
150
+ # return '<AppRole %r>' % self.name
151
+ # class Userrole(db.Model):
152
+ # __tablename__ = 'appuserrole'
153
+ # id = db.Column(db.String(50),primary_key=True)
154
+ # appuserid = db.Column(db.String(50))
155
+ # approleid = db.Column(db.String(50))
156
+ # def __repr__(self):
157
+ # return "appuserrole(appuserid:%s,approleid:%s)"%(self.appuserid,self.approleid)
158
+ # class Permission(db.Model):
159
+ # __tablename__ = 'permission'
160
+ # id = db.Column(db.String(50),primary_key=True)
161
+ # ptype = db.Column(db.Integer)
162
+ # appactionid = db.Column(db.String(50))
163
+ # baseactorid = db.Column(db.String(50))
164
+ # def __repr__(self):
165
+ # return "permission(id:%s,actorid:%s,actionid:%s,pttype:%d)"%\
166
+ # (self.id,self.baseactorid,self.appactionid,self.ptype)
167
+ # class User(db.Model):
168
+ # __tablename__ = 'appuser'
169
+ # uid = db.Column('id',db.String(50), primary_key=True)
170
+ # uname = db.Column("name",db.String(64), unique=True, index=True)
171
+ # passwordmd5 = db.Column("passwordmd5",db.String(100))
172
+ # description = db.Column(db.String(100))
173
+ # modifydatetime = db.Column(db.DateTime,default=datetime.now())
174
+ # insertdatetime = db.Column(db.DateTime, default=datetime.now())
175
+ # systemuser = db.Column('issystemuser',db.Boolean,default=False)
176
+ # manageuser = db.Column('ismanage',db.Boolean,default = False)
177
+ # manageuserid = db.Column(db.String(50),default = '')
178
+ # def to_json(self):
179
+ # return {"uid":self.uid,
180
+ # "uname":self.uname,
181
+ # "description":self.description,
182
+ # "systemuser":self.systemuser,
183
+ # 'manageuser':self.manageuser,
184
+ # 'manageuserid':self.manageuserid
185
+ # }
186
+ # def __repr__(self):
187
+ # return "user(id:%s),username:%s,issystemuser:%s"%(self.id,self.username,self.issystemuser)
@@ -0,0 +1,21 @@
1
+ '''
2
+ 开发用的测试数据
3
+ '''
4
+ from app import create_app_swagger,db
5
+ from app.models import *
6
+ from seeds.seed_utils import add_seed
7
+
8
+ def init_dev_data():
9
+ app = create_app_swagger('development').app
10
+ app_context = app.app_context()
11
+ app_context.push()
12
+ db.create_all()
13
+ # todo add dev data
14
+ # sample code
15
+ # company1 = add_seed(db.session,Company,{'company_name':'铨鼎科技测试'},{'company_name':'铨鼎科技测试'})
16
+ # company_auth = add_seed(db.session,Company_auth,{'appuserid':'2222','companyid':company1.id},{'appuserid':'2222','companyid':company1.id})
17
+ # depart1 = add_seed(db.session,Depart,{'companyid':company1.id},{'companyid':company1.id})
18
+ # employee = add_seed(db.session,Employee,{'emp_name':'cxh'},{'emp_name':'cxh','departid':depart1.id})
19
+
20
+
21
+
@@ -0,0 +1,17 @@
1
+ '''
2
+ 系统默认资料的初始化
3
+ '''
4
+ from app import create_app_swagger
5
+ from app.models import *
6
+ from seeds.seed_utils import add_seed
7
+
8
+ def init_default_data(config):
9
+ app = create_app_swagger(config).app
10
+ app_context = app.app_context()
11
+ app_context.push()
12
+ app.logger.info('start add default seeds ')
13
+ db.create_all()
14
+ # todo add default data
15
+ # sample code
16
+ # employee = add_seed(db.session,Employee,{'name':'李三'},{'name':'李三'})
17
+ app.logger.info('add default seeds success')
@@ -0,0 +1,39 @@
1
+ '''
2
+ 初始化权限资料
3
+ '''
4
+ from seeds.models_rm import *
5
+ from app.models import *
6
+ from app import create_app_swagger
7
+
8
+ def init_rm_data(config):
9
+ app = create_app_swagger(config).app
10
+ app_context = app.app_context()
11
+ app_context.push()
12
+ current_app.logger.info('start add right seeds ')
13
+ db.create_all()
14
+
15
+ # todo add right data
16
+ sys1 = add_sys1(os.environ.get('SYSTEM_ID','maxguide000') , os.environ.get('SYSTEM_NAME','maxguide'))
17
+
18
+ # sample code
19
+ # # 第一层权限
20
+ # sys1 = add_sys1('mis0', 'scs')
21
+ # # 第二层权限
22
+ # sys2 = add_sys2(sys1,'hrmng','人事管理')
23
+ # # 第三层权限和操作
24
+ # add_sys3_and_op(sys1,sys2,'company','公司管理',[1,2,3,4])
25
+ # add_sys3_and_op(sys1, sys2, 'depart','部门管理',[1,2,3,4])
26
+ # employee = add_sys3_and_op(sys1, sys2, 'employee','员工管理',[1,2,3,4])
27
+ # # 增加第5个操作
28
+ # add_sys3_op(employee, 'aud', '审核',5)
29
+ # add_sys3_and_op(sys1, sys2, 'emp_degree','教育经历',[1,2,3,4])
30
+ # add_sys3_and_op(sys1, sys2, 'work_experience','工作经历',[1,2,3,4])
31
+ # add_sys3_and_op(sys1, sys2, 'companyauth','公司授权',[1,2,3,4])
32
+ # # 自定义权限
33
+ # employee_pic = add_sys3(empsys,employeemng,'employee_pic','员工图片')
34
+ # add_sys3_op(employee_pic, 'view', '浏览图片', 1)
35
+ # add_sys3_op(employee_pic, 'insert', '上传图片',2)
36
+ # add_sys3_op(employee_pic, 'delete', '删除图片', 4)
37
+
38
+ current_app.logger.info('add right seeds success!')
39
+
@@ -0,0 +1,13 @@
1
+ '''
2
+ python seed_run.py 把资料写入资料库
3
+ '''
4
+ from seeds.seed_rm import init_rm_data
5
+ from seeds.seed_init import init_default_data
6
+ from seeds.seed_dev_data import init_dev_data
7
+ from app.config import is_development
8
+ if __name__ == '__main__':
9
+ if is_development:
10
+ init_dev_data()
11
+ init_rm_data('default')
12
+ init_default_data('default')
13
+
@@ -0,0 +1,23 @@
1
+ '''
2
+
3
+ '''
4
+ def add_seed(session,cls,flt,datas):
5
+ '''
6
+ 增加物件
7
+ :param session: sQLAlchemy session
8
+ :param cls: boclass,如:Employee
9
+ :param flt: 过滤条件,如:{'id':1000,'name':'cxh'}
10
+ :param datas: 物件body,如:
11
+ {'id':1000,'emp_name':'cxh',
12
+ 'departid':999}
13
+ :return: 企业物件,employee
14
+ '''
15
+ data = session.query(cls).filter_by(**flt).first()
16
+ if not data:
17
+ data = cls(**datas)
18
+ session.add(data)
19
+ session.commit()
20
+ else:
21
+ session.query(cls).filter_by(**flt).update(datas)
22
+ session.commit()
23
+ return data
@@ -0,0 +1,6 @@
1
+ import unittest
2
+
3
+ def test():
4
+ """Run the unit tests."""
5
+ tests = unittest.TestLoader().discover('tests')
6
+ unittest.TextTestRunner(verbosity=2).run(tests)
@@ -0,0 +1,4 @@
1
+ import tests
2
+
3
+ if __name__ == '__main__':
4
+ tests.test()
@@ -0,0 +1,92 @@
1
+ ########################################
2
+ # create by :cxh-PC
3
+ # create time :2019-12-06 16:48:34.283479
4
+ ########################################
5
+ from flask import current_app,g,request,session
6
+ from mwsdk import Rightmanage
7
+ from datetime import datetime,time,date
8
+ from mwutils.mw_time import str2datetime,str2date,date2str,datetime2isostr,get_locale_timezone
9
+
10
+ def get_lang(lang):
11
+ '''
12
+ 优先使用 用户设定 lang
13
+ 其次使用 用户设定中cookie的 lang
14
+ 没有时使用session中保存的
15
+ 最后才用 浏览器中的lang 语言设定
16
+
17
+ :param lang:
18
+ :return:
19
+ '''
20
+ if lang is None:
21
+ lang = request.cookies.get('locale')
22
+ if lang is None:
23
+ lang = session.get('locale')
24
+ if lang is None:
25
+ return request.accept_languages.best_match(['zh-TW','zh-CN', 'en','vi-VN','ja-JP']) or 'zh-CN'
26
+ if lang.lower() in('cn','zh_cn','zh-cn'):
27
+ return 'zh-CN'
28
+ elif lang.lower() in('tw','zh_tw','zh-tw'):
29
+ return 'zh-TW'
30
+ elif lang.lower() =='en':
31
+ return 'en'
32
+ elif lang.lower() in ('vi-vn','vi'):
33
+ return 'vi-VN'
34
+ elif lang.lower() in ('ja-jp','ja'):
35
+ return 'ja-JP'
36
+ else:
37
+ return lang or 'zh-CN'
38
+
39
+ def set_timezone(json_data:dict):
40
+ '''
41
+ 为json日期时间添加本地时区
42
+ :param body:
43
+ :return:
44
+ '''
45
+ for k, v in json_data.items():
46
+ if isinstance(v,datetime):
47
+ if v.tzinfo is None:
48
+ json_data[k]=v.astimezone(get_locale_timezone())
49
+ elif isinstance(v,time):
50
+ json_data[k]=v.strftime('%H:%M:%S')
51
+ elif isinstance(v,date):
52
+ json_data[k]=v.strftime('%Y-%m-%d')
53
+ return json_data
54
+
55
+ def datetime_add_timezone(dt:datetime):
56
+ '''
57
+ 为日期时间添加本地时区
58
+ :param body:
59
+ :return:
60
+ '''
61
+ if isinstance(dt,datetime):
62
+ if dt.tzinfo is None:
63
+ dt = dt.astimezone(get_locale_timezone())
64
+ return dt
65
+
66
+ def todate(body:dict,fields:list):
67
+ '''
68
+ 把body中的日期栏位的str 转换为日期
69
+ :param body: http post 或 put 的body
70
+ :param fields: body中的日期栏位
71
+ :return:
72
+ '''
73
+ if fields is None:
74
+ return body
75
+ for k,v in body.items():
76
+ if k in fields:
77
+ body[k] = str2date(v)
78
+ return body
79
+
80
+ def todatetime(body:dict,fields:list):
81
+ '''
82
+ 把body中的日期时间栏位的str 转换为日期时间
83
+ :param body: http post 或 put 的body
84
+ :param fields: body中的日期时间栏位
85
+ :return:
86
+ '''
87
+ if fields is None:
88
+ return body
89
+ for k,v in body.items():
90
+ if k in fields:
91
+ body[k] = str2datetime(v)
92
+ return body
@@ -0,0 +1,55 @@
1
+ FROM maxwinch/flask-py3.7:v2 as build
2
+ COPY ./requirements.txt /var/requirements.txt
3
+ COPY . /var/{{swagger.name}}
4
+ WORKDIR /var/{{swagger.name}}
5
+ RUN apk add --update --no-cache --virtual .build-deps \
6
+ make \
7
+ gcc \
8
+ libc-dev \
9
+ jpeg-dev \
10
+ zlib-dev \
11
+ linux-headers \
12
+ python3-dev \
13
+ # 解决 ImageFont.truetype 出错的问题
14
+ freetype \
15
+ freetype-dev \
16
+ && pip install --upgrade pip \
17
+ && pip3 install -r /var/requirements.txt \
18
+ && python /var/{{swagger.name}}/setup.py install \
19
+ && find /var/{{swagger.name}} -depth \
20
+ \( \
21
+ \( -type d -a -name app -o -name docs -o -name build -o -name .git -o -name migrations \
22
+ -o -name .idea -o -name __pycache__ -o -name swagger -o -name seeds -o -name -tests \) \
23
+ -o \
24
+ \( -type f -a -name '*.pyc' -o -name '*.pyo' -o -name '*.c' \
25
+ -o -name '*.md' -o -name '*.pot' -o -name 'config-sample.ini' \
26
+ -o -name 'migrate_run.*' -o -name '*.mdj' -o -name '*.sqlite' -o -name '*.yaml' \
27
+ -o -name 'gen_code_run.py' -o -name 'run.sh' -o -name 'run-dev.sh' -o -name 'uwsgi-dev.ini' \
28
+ -o -name 'setup.py' -o -name 'requirements.txt' -o -name 'Dockerfile' -o -name 'Dockerfile_dev' \
29
+ -o -name 'docker-compose-dev.yaml' \) \
30
+ \) -exec rm -rf '{}' + \
31
+ # 删除APP package 中的源码
32
+ && find /usr/local/lib/python3.7/site-packages/app -depth \
33
+ \( \
34
+ \( -type d -a -name __pycache__ \) \
35
+ -o \
36
+ \( -type f -a -name '*.pyc' -o -name '*.pyo' -o -name '*.c' -o -name '*.py' \) \
37
+ \) -exec rm -rf '{}' + \
38
+ && find /usr/local -depth \
39
+ \( \
40
+ \( -type d -a -name test -o -name tests -o -name __pycache__ \) \
41
+ -o \
42
+ \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
43
+ \) -exec rm -rf '{}' + \
44
+ && runDeps="$( \
45
+ scanelf --needed --nobanner --recursive /usr/local \
46
+ | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
47
+ | sort -u \
48
+ | xargs -r apk info --installed \
49
+ | sort -u \
50
+ )" \
51
+ && apk add --virtual .python-rundeps $runDeps \
52
+ && apk del .build-deps
53
+ FROM maxwinch/flask-py3.7:v2
54
+ COPY --from=build /var/{{swagger.name}} /var/{{swagger.name}}
55
+ COPY --from=build /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages
@@ -0,0 +1,91 @@
1
+
2
+
3
+ ### install package
4
+ ```
5
+ pip install -r requirements.txt
6
+ ```
7
+ ### run
8
+ python run.py
9
+
10
+ ### swagger debug:
11
+ ```
12
+ http://localhost:8888/{{ swagger.name }}/{{ swagger.version }}/ui/
13
+
14
+ ```
15
+
16
+ ### 环境变量设定
17
+ ```
18
+ True:自動註冊到kong
19
+ auto_register2kong = os.environ.get('kong_auto_register') or conf_parse.getboolean('reg_service','kong',fallback=False)
20
+ True:自動註冊到consul
21
+ auto_register2consul = os.environ.get('consul_auto_register') or conf_parse.getboolean('reg_service','consul',fallback=False)
22
+ web_port =os.environ.get('web_port') or conf_parse.getint('web','port',fallback=8000)
23
+ ```
24
+
25
+ ### 执行docker
26
+ sudo ./run.sh
27
+
28
+
29
+ ### 数据迁移
30
+ > 支持对开发环境下的sqlite资料的数据迁移,不建议在生产环境中执行,避免人工失误,导致损坏资料
31
+ 1. install or upgrade
32
+ ```bash
33
+ pip install --upgrade Flask-Migrate
34
+ ```
35
+ 2.指定Flask app
36
+ > linux 下
37
+ ```bash
38
+ export FLASK_APP=migrate_run.py
39
+ ```
40
+ > windows 下
41
+ ```bash
42
+ set FLASK_APP=migrate_run.py
43
+ ```
44
+ 3. 初始化
45
+ ```bash
46
+ flask db init
47
+ ```
48
+ 4. 产生迁移语句
49
+ ```bash
50
+ flask db migrate
51
+ ```
52
+ 5. 执行升级资料库
53
+ ```bash
54
+ flask db upgrade
55
+ ```
56
+ ### 增加seed
57
+ ```bash
58
+ cd seeds
59
+ ```
60
+ ```python
61
+ python seed_run.py
62
+ ```
63
+ ### babel
64
+ > 创建pot模板
65
+ ```bash
66
+ pybabel extract -F babel.cfg -o messages.pot app
67
+ ```
68
+ > 创建多语言的po文件(第一次需要)
69
+ ```bash
70
+ # 简体中文
71
+ pybabel init -i messages.pot -d app/translations -l zh_Hans_CN
72
+ # 繁体中文
73
+ pybabel init -i messages.pot -d app/translations -l zh_Hant_TW
74
+ # 越南文 vi_VN
75
+ pybabel init -i messages.pot -d app/translations -l vi_VN
76
+ # 英文
77
+ pybabel init -i messages.pot -d app/translations -l en
78
+ # 日文
79
+ pybabel init -i messages.pot -d app/translations -l ja
80
+ ```
81
+
82
+ > 更新多语言的po文件
83
+ ```bash
84
+ pybabel extract -F babel.cfg -o messages.pot app
85
+ pybabel update -i messages.pot -d app/translations
86
+ ```
87
+
88
+ > 产生mo文件
89
+ ```bash
90
+ pybabel compile -d app/translations
91
+ ```
File without changes
@@ -0,0 +1,99 @@
1
+ import connexion
2
+ from flask_redis import FlaskRedis
3
+ from app.config import config
4
+ from flask_cors import CORS
5
+ import logging
6
+ from flask import g, request,session
7
+ from flask_babel import Babel
8
+ from app.utils import get_lang
9
+ {% if include_model %}
10
+ from flask_sqlalchemy import SQLAlchemy
11
+ from mwauth import auth,AuthType
12
+ from mwpermission.permission import Permission
13
+ from mwauth.redis_session import RedisSessionInterface
14
+ import pymysql
15
+ pymysql.install_as_MySQLdb()
16
+ {% endif %}
17
+
18
+ {% if 'kafka' in plugins %}
19
+ producer = Producer()
20
+ {% endif %}
21
+
22
+ from app.config import redis_model,database_model
23
+ from flask_redis_sentinel import SentinelExtension
24
+ from mwutils.mw_consul import DatabaseConf
25
+ import os
26
+ # 创建哨兵
27
+ redis_sentinel = SentinelExtension()
28
+ # 普通
29
+ if redis_model==0:
30
+ rds = FlaskRedis()
31
+ elif redis_model==1: #哨兵模式
32
+ rds = redis_sentinel.master_for('mysession')
33
+ else: #集群
34
+ assert False,'暂不支持集群'
35
+
36
+ {% if include_model %}
37
+ db = SQLAlchemy()
38
+ # auth = auth(config['default'].AUTH_TYPE)
39
+ auth = auth()
40
+ p = Permission()
41
+ {% endif %}
42
+ babel = Babel()
43
+
44
+ def apikey_auth(token, required_scopes):
45
+ # 使用kong认证时,跳过该认证
46
+ return {}
47
+
48
+ def create_app_swagger(config_name):
49
+ conf = config[config_name]
50
+ app_swg = connexion.App(__name__,
51
+ # port = conf.PORT,
52
+ # debug= conf.DEBUG,
53
+ specification_dir='../swagger/'
54
+ )
55
+ app_swg.add_api('./{{ swagger.version.replace('.','_') }}/{{ swagger.name }}.yaml', arguments={'title': 'api {{ swagger.version }}','host':os.environ.get('SWAGGER_HOST',f'localhost:{conf.PORT}')})
56
+ #todo add other_api
57
+ app = app_swg.app
58
+ CORS(app)
59
+ app.config.from_object(conf)
60
+ config[config_name].init_app(app)
61
+
62
+ # 需要增加handler 这样docker 中才能看到log
63
+ # formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
64
+ # consoleHandler = logging.StreamHandler()
65
+ # consoleHandler.setFormatter(formatter)
66
+ # app.logger.addHandler(consoleHandler)
67
+ app.logger.level = app.config['LOG_LEVEL']
68
+ {% if include_model %}
69
+ db.init_app(app)
70
+ app.session_interface = RedisSessionInterface(app, rds)
71
+ auth.init_app(app)
72
+ p.init_app(app)
73
+ {% endif %}
74
+ babel.init_app(app)
75
+ {% if 'kafka' in plugins %}
76
+ producer.init_app(app)
77
+ {% endif %}
78
+
79
+ redis_sentinel.init_app(app)
80
+ if redis_model == 0:
81
+ rds.init_app(app)
82
+
83
+ @app.before_request
84
+ def before_request():
85
+ # 非单机模式,发现资料库URI不一致,则重启
86
+ if database_model != 0 and app.config['SQLALCHEMY_DATABASE_URI'] != \
87
+ DatabaseConf(os.environ.get('DATABASE_NAME', 'maxbus')).sqlalchemy_database_uri():
88
+ # 需要用os的exit,其它的只能退出过程
89
+ os._exit(1)
90
+
91
+ return app_swg
92
+
93
+ @babel.localeselector
94
+ def get_locale():
95
+ # 默认取英文
96
+ lang = get_lang(None)
97
+ # 当前版本的 flask_babel 只支持 “_”区隔
98
+ return lang.replace('-','_')
99
+