Commit 0966a93c9fc9e6066557a3965d61fcfa2af0dd45

Authored by Яна Степаненко
1 parent 2cd26db164

add k2adm

Showing 17 changed files with 338 additions and 7 deletions Inline Diff

1 /components/adm/ 1 /components/vue2/
2 /components/grid/ 2 /components/grid/
3 /components/vue/ 3 /components/vue/
4 4
__pycache__/main.cpython-310.pyc
No preview for this file type
__pycache__/routes.cpython-310.pyc
No preview for this file type
components/k2adm/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/k2adm/k2adm/README.md
File was created 1 # main.py
2
3 from components.adm.adm.views import adm
4 from components.test.test.views import test
5
6 app.register_blueprint(adm, url_prefix='/adm')
7
8 cd components/adm
9 pip install -r requirements.txt
10
11
12 endpoint "http://127.0.0.1:5000/adm/register"
13 dictionary to register in such way
14 {
15 "login": "xxx",
16 "password": "xxx",
17 "name": "xxx",
18 "email": "xxx"
19 }
20
21
22 endpoint "http://127.0.0.1:5000/adm/login"
23 dictionary to login in such way
24 {
25 "login":"xxx",
26 "password":"xxx"
27 }
28
29 endpoint http://127.0.0.1:5000/adm/changePassword
30 dictionary to changePassword in such way
31 {
32 "old_password":"xxx",
33 "new_password": "xxx",
34 "re_new_password": "xxx"
35 }
36 endpoint http://127.0.0.1:5000/adm/newUser
37 {
38 "login": "xxx",
39 "password": "xxx",
40 "name": "xxx",
41 "email": "xxx",
42 "phone": "xxx",
43 "repassword": "xxx"
44
45 }
components/k2adm/k2adm/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/k2adm/k2adm/__pycache__/models.cpython-310.pyc
No preview for this file type
components/k2adm/k2adm/__pycache__/views.cpython-310.pyc
No preview for this file type
components/k2adm/k2adm/models.py
File was created 1 import uuid
2 from sqlalchemy import Column, Integer, String
3 from sqlalchemy.ext.declarative import declarative_base
4 from flask_jwt_extended import create_access_token, decode_token
5 from datetime import timedelta
6 import hashlib
7 from flask import current_app as k2
8
9
10 Base = declarative_base()
11
12 class k2users(Base):
13 __tablename__ = 'k2users'
14 user_id = Column(Integer, primary_key=True)
15 login = Column(String(50), unique=True)
16 name = Column(String(50))
17 email = Column(String(150))
18 password = Column(String(50))
19 phone = Column(String(20))
20 firstname = Column(String(50))
21 roleid = Column(String(50))
22
23 def __init__(self, **kwargs):
24 self.user_id = hashlib.md5(str(uuid.uuid4()).encode()).hexdigest()
25 self.login = kwargs.get('login')
26 self.password = hashlib.md5(kwargs.get('password').encode()).hexdigest()
27 self.name = kwargs.get('name')
28 self.email = kwargs.get('email')
29 self.phone = kwargs.get('phone')
30 self.firstname = kwargs.get('firstname')
31 self.roleid = kwargs.get('roleid')
32
33
34 def get_token(self, expire_time=24):
35 expires_delta = timedelta(expire_time)
36 token = create_access_token(identity=self.user_id, expires_delta=expires_delta)
37 if self.roleid == '1':
38 role = 'admin'
39 else:
40 role = "client"
41
42 userData = {
43 "avatar": "/src/assets/images/avatars/avatar-4.png",
44 "email": self.email,
45 "fullName": self.name,
46 "id": self.user_id,
47 "role": role,
48 "username": self.login
49
50 }
51 if self.roleid != '1':
52 userAbilities = [
53 {
54 "action": "read",
55 "subject": "Auth"},
56
57 {
58 "action": "read",
59 "subject": "AclDemo"}
60 ]
61 else:
62 userAbilities = [
63 {
64 "action": "manage",
65 "subject": "all"
66 }
67 ]
68 return (token, userData,userAbilities)
69
70 @classmethod
71 def authenticate(cls, login, password):
72 session = k2.extensions['sqlalchemy'].db.session
73 user = ''
74 try:
75 user = session.query(cls).filter(cls.login == login).filter(cls.password == hashlib.md5(password.encode()).hexdigest()).one()
76 except:
77 user = None
78 return user
79
80 @classmethod
81 def user_by_login(cls, login):
82 session = k2.extensions['sqlalchemy'].db.session
83 user = session.query(cls).filter(cls.login == login).first()
84 return user
85
86
87
88
89
90
components/k2adm/k2adm/requirements.txt
File was created 1 alembic==1.11.1
2 Babel==2.12.1
3 bcrypt==4.0.1
4 bidict==0.22.1
5 blinker==1.6.2
6 certifi==2023.5.7
7 charset-normalizer==3.1.0
8 click==8.1.3
9 colorama==0.4.6
10 dnspython==2.3.0
11 email-validator==2.0.0.post2
12 Flask==2.3.2
13 flask-babel==3.1.0
14 Flask-Bcrypt==1.0.1
15 Flask-Cors==3.0.10
16 Flask-JWT-Extended==4.5.2
17 Flask-Login==0.6.2
18 Flask-Migrate==4.0.4
19 Flask-MySQLdb==1.0.1
20 Flask-SQLAlchemy==3.0.3
21 flask-staticdirs==1.0.1
22 Flask-WTF==1.1.1
23 greenlet==2.0.2
24 idna==3.4
25 itsdangerous==2.1.2
26 Jinja2==3.1.2
27 jsonify==0.5
28 Mako==1.2.4
29 MarkupSafe==2.1.2
30 mysql==0.0.3
31 mysql-connector==2.2.9
32 mysql-connector-python==8.0.33
33 mysqlclient==2.1.1
34 peppercorn==0.6
35 protobuf==3.20.3
36 PyJWT==2.7.0
37 python-engineio==4.4.1
38 python-socketio==5.8.0
39 pytz==2023.3
40 PyYAML==6.0
41 requests==2.31.0
42 six==1.16.0
43 SQLAlchemy==2.0.15
44 typing_extensions==4.6.2
45 urllib3==2.0.2
46 Werkzeug==2.3.4
47 WTForms==3.0.1
components/k2adm/k2adm/setup.py
File was created 1 from setuptools import setup
2
3 setup(
4 name='adm',
5 version='1.0.0',
6 description='Description of my project',
7 author='Your Name',
8 author_email='yourname@example.com',
9 keywords="adm, k2",
10 python_requires=">=3.7, <=3.11.2",
11 packages=['adm'],
12 package_data={ # Optional
13 },
14 install_requires=[""],
15 )
components/k2adm/k2adm/views.py
File was created 1 import hashlib
2 import uuid
3 from flask import Blueprint, request, jsonify
4 from flask import current_app as k2
5 from flask_jwt_extended import jwt_required, get_jwt_identity
6
7
8 from .models import k2users
9
10
11 k2adm = Blueprint('adm', __name__, template_folder='templates', static_folder='static', static_url_path='/adm')
12
13
14 @k2adm.route('/usersclients', methods=["GET"])
15 @jwt_required()
16 def users_clients():
17 return jsonify({"data": "roles"})
18
19
20 @k2adm.route('/users', methods=["GET"])
21 @jwt_required()
22 def grid_users():
23 return jsonify({"data": "users"})
24
25
26 @k2adm.route('/roles', methods=["GET"])
27 @jwt_required()
28 def grid_roles():
29 return jsonify({"data": "roles"})
30
31
32
33 # @adm.route('/register', methods=["POST"])
34 # def register():
35 # params = request.json
36 # session = k2.extensions['sqlalchemy'].db.session
37 # exist = k2users.user_by_login(request.json['login'])
38 # if not exist:
39 # user = k2users(**params)
40 # session.add(user)
41 # session.commit()
42 # token, userData, userAbilities = user.get_token()
43 # return {'accessToken': token, "userData": userData, "userAbilities": userAbilities}
44 # else:
45 # return jsonify({'error': 'User exist'}), 401
46
47
48 # @adm.route('/login', methods=["POST"])
49 # def login():
50 # params = request.json
51 # user = k2users.authenticate(**params)
52 # if user:
53 # token, userData, userAbilities = user.get_token()
54 # return {'accessToken': token, "userData": userData, "userAbilities": userAbilities}
55 # else:
56 # return jsonify({'error': 'Unauthorized'}), 401
57
58
59 # @adm.route('/logout', methods=["GET"])
60 # @jwt_required()
61 # def logout():
62 #
63 # response = {
64 # 'message': 'Logged out successfully'
65 # }
66
67 # return jsonify(response)
68
69
70 @k2adm.route('/api_get_roles', methods=["GET"])
71 @jwt_required()
72 def roles():
73 db = k2.extensions['sqlalchemy'].db
74 connection = db.engine.connect()
75 query = db.text("SELECT roleid, rolename FROM k2roles")
76 result = connection.execute(query).fetchall()
77 roles = [dict(id=res.roleid, role=res.rolename) for res in result]
78 return {'roles': roles}
79
80
81 @k2adm.route('/newUser', methods=["GET", "POST"])
82 @jwt_required()
83 def newUser():
84 session = k2.extensions['sqlalchemy'].db.session
85 exist = k2users.user_by_login(request.json['login'])
86 if not exist:
87 res = k2users(
88 user_id=hashlib.md5(str(uuid.uuid4()).encode()).hexdigest(),
89 login=request.json['login'],
90 name=request.json['name'],
91 email=request.json['email'],
92 password=hashlib.md5(request.json['password'].encode()).hexdigest(),
93 phone=request.json['phone'])
94 if res:
95 session.add(res)
96 session.commit()
97 return jsonify({'status': 'ok'})
98 else:
99 return jsonify({'error': 'Such user exist'}), 404
100
101
102 @k2adm.route('/changePassword', methods=["POST"])
103 @jwt_required()
104 def changePassword():
105 session = k2.extensions['sqlalchemy'].db.session
106 current_user = get_jwt_identity()
107 user = session.query(k2users).filter_by(user_id=current_user).first()
108 if user.password == hashlib.md5(request.json['old_password'].encode()).hexdigest():
109 if request.json['new_password'] == request.json['re_new_password']:
110 user.password = hashlib.md5(request.json['new_password'].encode()).hexdigest()
111 session.commit()
112 else:
113 return jsonify({'error': 'Пароль не найден в базе'}), 404
114 else:
115 return jsonify({'error': 'Пароль не совпвдает'}), 404
116 return jsonify({'status': 'ok'})
117
118
119 @k2adm.route('/menu-items')
120 def menu_items():
121 menu = [
122 {
123 "title": 'Site administration',
124 "icon": {"icon": 'mdi-account-circle-outline'},
125 "children": [
126 {'title': 'Password change', 'to': 'adm-changePassword'},
127 {'title': 'New user', 'to': 'adm-newUser'},
128 {'title': 'Users', 'to': 'adm-users'},
129 {'title': 'Users are clients', 'to': 'adm-usersclients'},
130 {'title': 'Roles', 'to': 'adm-roles'},
131 {'title': 'Access to the menu', 'to': 'adm-menuaaccess'},
132 ],
133 }]
134
135 return menu
components/k2auth/k2auth/views.py
1 # import hashlib 1 # import hashlib
2 # import uuid 2 # import uuid
3 from flask import Blueprint, request, jsonify 3 from flask import Blueprint, request, jsonify
4 from flask import current_app as k2 4 from flask import current_app as k2
5 from flask_jwt_extended import jwt_required 5 from flask_jwt_extended import jwt_required
6 6
7 from .models import k2users 7 from .models import k2users
8 8
9 k2auth = Blueprint('k2auth', __name__, template_folder='templates', static_folder='static', static_url_path='/adm') 9 k2auth = Blueprint('k2auth', __name__, template_folder='templates', static_folder='static', static_url_path='/vue2')
10 10
11 11
12 class Auth(): 12 class Auth():
13 def __init__(self): 13 def __init__(self):
14 pass 14 pass
15 15
16 def register(self): 16 def register(self):
17 params = request.json 17 params = request.json
18 session = k2.extensions['sqlalchemy'].db.session 18 session = k2.extensions['sqlalchemy'].db.session
19 try: 19 try:
20 user = k2users(**params) 20 user = k2users(**params)
21 session.add(user) 21 session.add(user)
22 session.commit() 22 session.commit()
23 token = user.get_token() 23 token = user.get_token()
24 24
25 return {'access_token': token} 25 return {'access_token': token}
26 except: 26 except:
27 return jsonify({'error': 'Unauthorized'}), 401 27 return jsonify({'error': 'Unauthorized'}), 401
28 28
29 29
30 def login(self): 30 def login(self):
31 params = request.json 31 params = request.json
32 user = k2users.authenticate(**params) 32 user = k2users.authenticate(**params)
33 if user: 33 if user:
34 token, userData, userAbilities = user.get_token() 34 token, userData, userAbilities = user.get_token()
35 return {'accessToken': token, "userData": userData, "userAbilities": userAbilities} 35 return {'accessToken': token, "userData": userData, "userAbilities": userAbilities}
36 else: 36 else:
37 k2.logger.error(('%s failed to log in ', params.get('login'), params.get('password'))) 37 k2.logger.error(('%s failed to log in ', params.get('login'), params.get('password')))
38 return jsonify({'error': 'Unauthorized'}), 401 38 return jsonify({'error': 'Unauthorized'}), 401
39 39
40 40
41 @jwt_required() 41 @jwt_required()
42 def logout(self): 42 def logout(self):
43 response = { 43 response = {
44 'message': 'Logged out successfully' 44 'message': 'Logged out successfully'
45 } 45 }
46 return jsonify(response) 46 return jsonify(response)
47 47
48 48
49 49
50 auth = Auth() 50 auth = Auth()
51 k2auth.add_url_rule('/login', methods=['POST'], view_func=auth.login) 51 k2auth.add_url_rule('/login', methods=['POST'], view_func=auth.login)
52 k2auth.add_url_rule('/logout', methods=['GET'], view_func=auth.logout) 52 k2auth.add_url_rule('/logout', methods=['GET'], view_func=auth.logout)
53 k2auth.add_url_rule('/register', methods=['POST'], view_func=auth.register) 53 k2auth.add_url_rule('/register', methods=['POST'], view_func=auth.register)
54 54
1 users: 1 users:
2 - username: adm 2 - username: vue2
3 password: k2cloud123456 3 password: k2cloud123456
languages/babel_translation_directories.yml
1 babel_translation_directories: languages;components/k2test/k2test/languages;components/grid/grid/languages;components/adm/adm/languages 1 babel_translation_directories: languages;components/k2test/k2test/languages;components/grid/grid/languages;components/vue2/vue2/languages
2 2
1 #app = Flask(__name__) 1 #app = Flask(__name__)
2 from main import app 2 from main import app
3 from k2.k2rout import components_bp 3 from k2.k2rout import components_bp
4 app.register_blueprint(components_bp) 4 app.register_blueprint(components_bp)
5 from components.k2test.k2test.views import k2test 5 from components.k2test.k2test.views import k2test
6 app.register_blueprint(k2test, url_prefix='/k2test') 6 app.register_blueprint(k2test, url_prefix='/k2test')
7 7
8 # from components.grid.grid.views import grid 8 # from components.grid.grid.views import grid
9 # app.register_blueprint(grid, url_prefix='/grid') 9 # app.register_blueprint(grid, url_prefix='/grid')
10 # from components.vue.vue.views import vue2 10 # from components.vue.vue.views import vue2
11 # app.register_blueprint(vue2, url_prefix='/') 11 # app.register_blueprint(vue2, url_prefix='/')
12 12
13 13
14 from components.k2auth.k2auth.views import k2auth 14 from components.k2auth.k2auth.views import k2auth
15 app.register_blueprint(k2auth, url_prefix='/k2auth') 15 app.register_blueprint(k2auth, url_prefix='/k2auth')
16 16
17 17
18 from components.adm.adm.views import adm 18 from components.k2adm.k2adm.views import k2adm
19 app.register_blueprint(adm, url_prefix='/adm') 19 app.register_blueprint(k2adm, url_prefix='/adm')
1 select: 1 select:
2 select u.user_id, u.name, u.login, u.password, u.email, u.phone, u.photo, u.firstname, u.middlename, 2 select u.user_id, u.name, u.login, u.password, u.email, u.phone, u.photo, u.firstname, u.middlename,
3 u.lastname, u.roleid, u.create_datetime, u.who_create, u.firmid, u.partner_transid, u.departmentid, u.tab_number, u.name_rod, u.posada_rod, 3 u.lastname, u.roleid, u.create_datetime, u.who_create, u.firmid, u.partner_transid, u.departmentid, u.tab_number, u.name_rod, u.posada_rod,
4 u.all_obl, u.order_ins, u.prover, u.active, u.birth_date, f.name_firm, f.edrpou, r.rolename, r.classrole, d.department_name, u.passwd_decode 4 u.all_obl, u.order_ins, u.prover, u.active, u.birth_date, f.name_firm, f.edrpou, r.rolename, r.classrole, d.department_name, u.passwd_decode
5 from k2users u 5 from k2users u
6 6
7 left join k2firms f 7 left join k2firms f
8 on u.firmid=f.firmid 8 on u.firmid=f.firmid
9 9
10 left join k2roles r 10 left join k2roles r
11 on u.roleid=r.roleid 11 on u.roleid=r.roleid
12 12
13 left join k2department d 13 left join k2department d
14 on u.departmentid=d.departmentid 14 on u.departmentid=d.departmentid
15 15
16 table: k2users 16 table: k2users
17 typeid: 1 17 typeid: 1
18 rows: 20 18 rows: 20
19 sortname: create_datetime 19 sortname: create_datetime
20 sortorder: desc 20 sortorder: desc
21 detile: k2users_obl 21 detile: k2users_obl
22 caption: <%lnUsers%> 22 caption: <%lnUsers%>
23 readonly_form: 23 readonly_form:
24 who_create: 24 who_create:
25 height: 550 25 height: 550
26 form_height: 325 26 form_height: 325
27 custom_form: true 27 custom_form: true
28 28
29 fields: 29 fields:
30 user_id: 30 user_id:
31 field: user_id 31 field: user_id
32 caption: ID 32 caption: ID
33 width: 40 33 width: 40
34 readonly: true 34 readonly: true
35 align: left 35 align: left
36 hidden: true 36 hidden: true
37 37
38 order_ins: 38 order_ins:
39 field: order_ins 39 field: order_ins
40 caption: № 40 caption: №
41 width: 40 41 width: 40
42 readonly: true 42 readonly: true
43 align: left 43 align: left
44 hidden: true 44 hidden: true
45 45
46 46
47 47
48 login: 48 login:
49 field: login 49 field: login
50 caption: Email 50 caption: Email
51 width: 100 51 width: 100
52 width_form: 250 52 width_form: 250
53 readonly: false 53 readonly: false
54 align: left 54 align: left
55 55
56 act: 56 act:
57 field: " " 57 field: " "
58 alias: u.active 58 alias: u.active
59 caption: Акт. 59 caption: Акт.
60 width: 95 60 width: 95
61 readonly: true 61 readonly: true
62 align: center 62 align: center
63 type_field: condition 63 type_field: condition
64 cond: 64 cond:
65 exp: ($row["active"]==0) 65 exp: ($row["active"]==0)
66 url1: "" 66 url1: ""
67 target1: _self 67 target1: _self
68 target2: _self 68 target2: _self
69 caption1: <button style="color:red" onclick="doAkt('{user_id}')">Активувати</button> 69 caption1: <button style="color:red" onclick="doAkt('{user_id}')">Активувати</button>
70 url2: "" 70 url2: ""
71 caption2: <button onclick="doAkt('{user_id}')">Вимкнути</button> 71 caption2: <button onclick="doAkt('{user_id}')">Вимкнути</button>
72 72
73 2: 73 2:
74 field: " " 74 field: " "
75 caption: Зміна пароля 75 caption: Зміна пароля
76 width: 110 76 width: 110
77 readonly: true 77 readonly: true
78 align: center 78 align: center
79 type_field: condition 79 type_field: condition
80 cond: 80 cond:
81 exp: (false) 81 exp: (false)
82 url2: "/?adm=k2adminfunc_changepassword&userid={login}&mode=admin" 82 url2: "/?vue2=k2adminfunc_changepassword&userid={login}&mode=admin"
83 caption2: "Змінити" 83 caption2: "Змінити"
84 84
85 85
86 name: 86 name:
87 field: name 87 field: name
88 caption: Ім'я 88 caption: Ім'я
89 width: 250 89 width: 250
90 readonly: false 90 readonly: false
91 align: left 91 align: left
92 92
93 birth_date: 93 birth_date:
94 field: birth_date 94 field: birth_date
95 caption: Дата<br>народження 95 caption: Дата<br>народження
96 width: 100 96 width: 100
97 width_form: 250 97 width_form: 250
98 readonly: false 98 readonly: false
99 align: left 99 align: left
100 type_field: date 100 type_field: date
101 101
102 email: 102 email:
103 field: email 103 field: email
104 alias: u.email 104 alias: u.email
105 caption: Електронна пошта 105 caption: Електронна пошта
106 width: 175 106 width: 175
107 width_form: 250 107 width_form: 250
108 readonly: false 108 readonly: false
109 align: left 109 align: left
110 110
111 phone: 111 phone:
112 field: phone 112 field: phone
113 caption: Номер 113 caption: Номер
114 width: 100 114 width: 100
115 width_form: 250 115 width_form: 250
116 readonly: false 116 readonly: false
117 align: left 117 align: left
118 118
119 tab_number: 119 tab_number:
120 field: tab_number 120 field: tab_number
121 caption: Таб. номер 121 caption: Таб. номер
122 width: 75 122 width: 75
123 width_form: 250 123 width_form: 250
124 readonly: false 124 readonly: false
125 align: left 125 align: left
126 126
127 127
128 rolename: 128 rolename:
129 field: rolename 129 field: rolename
130 alias: r.rolename 130 alias: r.rolename
131 caption: Права 131 caption: Права
132 width: 150 132 width: 150
133 width_form: 250 133 width_form: 250
134 readonly: false 134 readonly: false
135 align: left 135 align: left
136 # type_field: DropDown 136 # type_field: DropDown
137 multy: false 137 multy: false
138 # sql: "select roleid as k, rolename as v from k2roles where (active='1') order by rolename" 138 # sql: "select roleid as k, rolename as v from k2roles where (active='1') order by rolename"
139 type_fieldform: DropDown 139 type_fieldform: DropDown
140 alias_form: roleid 140 alias_form: roleid
141 sql_form: select roleid as k, rolename as v from k2roles where (active='1') order by rolename 141 sql_form: select roleid as k, rolename as v from k2roles where (active='1') order by rolename
142 142
143 roleid: 143 roleid:
144 field: roleid 144 field: roleid
145 caption: 145 caption:
146 width: 150 146 width: 150
147 readonly: true 147 readonly: true
148 hidden: true 148 hidden: true
149 149
150 department_name: 150 department_name:
151 field: department_name 151 field: department_name
152 alias: d.department_name 152 alias: d.department_name
153 caption: Підрозділ 153 caption: Підрозділ
154 width: 150 154 width: 150
155 width_form: 250 155 width_form: 250
156 readonly: false 156 readonly: false
157 align: left 157 align: left
158 # type_field: DropDown 158 # type_field: DropDown
159 multy: false 159 multy: false
160 # sql: "select roleid as k, rolename as v from k2roles where (active='1') order by rolename" 160 # sql: "select roleid as k, rolename as v from k2roles where (active='1') order by rolename"
161 type_fieldform: DropDown 161 type_fieldform: DropDown
162 alias_form: departmentid 162 alias_form: departmentid
163 additems: 163 additems:
164 '': --------------- 164 '': ---------------
165 sql_form: select departmentid as k, department_name as v from k2department 165 sql_form: select departmentid as k, department_name as v from k2department
166 166
167 departmentid: 167 departmentid:
168 field: departmentid 168 field: departmentid
169 caption: 169 caption:
170 width: 150 170 width: 150
171 readonly: true 171 readonly: true
172 hidden: true 172 hidden: true
173 173
174 174
175 175