Commit 79305bf74d3bb28210125c8f6866d0ea2486ff88
1 parent
4f534de3e3
Exists in
master
add adm
Showing 27 changed files with 393 additions and 16 deletions Side-by-side Diff
- __pycache__/routes.cpython-310.pyc
- components/adm/README.md
- components/adm/__pycache__/__init__.cpython-310.pyc
- components/adm/adm/.idea/.gitignore
- components/adm/adm/.idea/adm.iml
- components/adm/adm/.idea/inspectionProfiles/Project_Default.xml
- components/adm/adm/.idea/inspectionProfiles/profiles_settings.xml
- components/adm/adm/.idea/misc.xml
- components/adm/adm/.idea/modules.xml
- components/adm/adm/.idea/vcs.xml
- components/adm/adm/__pycache__/__init__.cpython-310.pyc
- components/adm/adm/__pycache__/__init__.cpython-311.pyc
- components/adm/adm/__pycache__/models.cpython-310.pyc
- components/adm/adm/__pycache__/views.cpython-310.pyc
- components/adm/adm/__pycache__/views.cpython-311.pyc
- components/adm/adm/models.py
- components/adm/adm/views.py
- components/adm/requirements.txt
- components/adm/setup.py
- components/k2test/k2test/__pycache__/views.cpython-310.pyc
- components/k2test/k2test/views.py
- components/menu.yml
- db/database.db
- k2/__pycache__/k2inst.cpython-310.pyc
- k2/k2inst.py
- languages/babel_translation_directories.yml
- routes.py
__pycache__/routes.cpython-310.pyc
No preview for this file type
components/adm/README.md
| 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/adm/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/adm/adm/.idea/.gitignore
components/adm/adm/.idea/adm.iml
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<module type="PYTHON_MODULE" version="4"> | |
| 3 | + <component name="NewModuleRootManager"> | |
| 4 | + <content url="file://$MODULE_DIR$" /> | |
| 5 | + <orderEntry type="inheritedJdk" /> | |
| 6 | + <orderEntry type="sourceFolder" forTests="false" /> | |
| 7 | + </component> | |
| 8 | + <component name="TemplatesService"> | |
| 9 | + <option name="TEMPLATE_CONFIGURATION" value="Jinja2" /> | |
| 10 | + <option name="TEMPLATE_FOLDERS"> | |
| 11 | + <list> | |
| 12 | + <option value="$MODULE_DIR$/templates" /> | |
| 13 | + </list> | |
| 14 | + </option> | |
| 15 | + </component> | |
| 16 | +</module> |
components/adm/adm/.idea/inspectionProfiles/Project_Default.xml
| 1 | +<component name="InspectionProjectProfileManager"> | |
| 2 | + <profile version="1.0"> | |
| 3 | + <option name="myName" value="Project Default" /> | |
| 4 | + <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" /> | |
| 5 | + <inspection_tool class="JSHint" enabled="true" level="ERROR" enabled_by_default="true" /> | |
| 6 | + <inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true"> | |
| 7 | + <option name="ignoredPackages"> | |
| 8 | + <value> | |
| 9 | + <list size="13"> | |
| 10 | + <item index="0" class="java.lang.String" itemvalue="blinker" /> | |
| 11 | + <item index="1" class="java.lang.String" itemvalue="greenlet" /> | |
| 12 | + <item index="2" class="java.lang.String" itemvalue="Werkzeug" /> | |
| 13 | + <item index="3" class="java.lang.String" itemvalue="Flask-WTF" /> | |
| 14 | + <item index="4" class="java.lang.String" itemvalue="SQLAlchemy" /> | |
| 15 | + <item index="5" class="java.lang.String" itemvalue="MarkupSafe" /> | |
| 16 | + <item index="6" class="java.lang.String" itemvalue="click" /> | |
| 17 | + <item index="7" class="java.lang.String" itemvalue="Flask-SQLAlchemy" /> | |
| 18 | + <item index="8" class="java.lang.String" itemvalue="Jinja2" /> | |
| 19 | + <item index="9" class="java.lang.String" itemvalue="Flask-Login" /> | |
| 20 | + <item index="10" class="java.lang.String" itemvalue="WTForms" /> | |
| 21 | + <item index="11" class="java.lang.String" itemvalue="itsdangerous" /> | |
| 22 | + <item index="12" class="java.lang.String" itemvalue="Flask" /> | |
| 23 | + </list> | |
| 24 | + </value> | |
| 25 | + </option> | |
| 26 | + </inspection_tool> | |
| 27 | + </profile> | |
| 28 | +</component> |
components/adm/adm/.idea/inspectionProfiles/profiles_settings.xml
components/adm/adm/.idea/misc.xml
components/adm/adm/.idea/modules.xml
components/adm/adm/.idea/vcs.xml
components/adm/adm/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/adm/adm/__pycache__/__init__.cpython-311.pyc
No preview for this file type
components/adm/adm/__pycache__/models.cpython-310.pyc
No preview for this file type
components/adm/adm/__pycache__/views.cpython-310.pyc
No preview for this file type
components/adm/adm/__pycache__/views.cpython-311.pyc
No preview for this file type
components/adm/adm/models.py
| 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 | |
| 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)) | |
| 16 | + name = Column(String(50)) | |
| 17 | + email = Column(String(150)) | |
| 18 | + password = Column(String(50)) | |
| 19 | + phone = Column(String(20)) | |
| 20 | + | |
| 21 | + def __init__(self, **kwargs): | |
| 22 | + self.user_id = hashlib.md5(str(uuid.uuid4()).encode()).hexdigest() | |
| 23 | + self.login = kwargs.get('login') | |
| 24 | + self.password = hashlib.md5(kwargs.get('password').encode()).hexdigest() | |
| 25 | + self.name = kwargs.get('name') | |
| 26 | + self.email = kwargs.get('email') | |
| 27 | + self.phone = kwargs.get('phone') | |
| 28 | + | |
| 29 | + def get_token(self, expire_time=24): | |
| 30 | + expires_delta = timedelta(expire_time) | |
| 31 | + token = create_access_token(identity=self.user_id, expires_delta=expires_delta) | |
| 32 | + return token | |
| 33 | + | |
| 34 | + @classmethod | |
| 35 | + def authenticate(cls, login, password): | |
| 36 | + session = k2.extensions['sqlalchemy'].db.session | |
| 37 | + user = '' | |
| 38 | + try: | |
| 39 | + user = session.query(cls).filter(cls.login == login).filter(cls.password == hashlib.md5(password.encode()).hexdigest()).one() | |
| 40 | + except: | |
| 41 | + user = None | |
| 42 | + | |
| 43 | + return user |
components/adm/adm/views.py
| 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 | +# from flask_sqlalchemy import session | |
| 7 | +# from sqlalchemy.orm import sessionmaker | |
| 8 | +# from k2.k2inst import Component | |
| 9 | + | |
| 10 | +from .models import k2users | |
| 11 | + | |
| 12 | + | |
| 13 | +adm = Blueprint('adm', __name__, template_folder='templates', static_folder='static', static_url_path='/adm') | |
| 14 | + | |
| 15 | + | |
| 16 | +@adm.route('/register', methods=["POST"]) | |
| 17 | +def register(): | |
| 18 | + params = request.json | |
| 19 | + session = k2.extensions['sqlalchemy'].db.session | |
| 20 | + exist = session.query(k2users).filter_by(login=request.json['login']).first() | |
| 21 | + if not exist: | |
| 22 | + user = k2users(**params) | |
| 23 | + session.add(user) | |
| 24 | + session.commit() | |
| 25 | + token = user.get_token() | |
| 26 | + return {'access_token': token} | |
| 27 | + else: | |
| 28 | + return jsonify({'error': 'User exist'}), 401 | |
| 29 | + | |
| 30 | + | |
| 31 | +@adm.route('/login', methods=["POST"]) | |
| 32 | +def login(): | |
| 33 | + params = request.json | |
| 34 | + login = params.get('login') | |
| 35 | + password = params.get('password') | |
| 36 | + user = k2users.authenticate(login, password) | |
| 37 | + if user: | |
| 38 | + token = user.get_token() | |
| 39 | + return {'access_token': token} | |
| 40 | + else: | |
| 41 | + return jsonify({'error': 'Unauthorized'}), 401 | |
| 42 | + | |
| 43 | + | |
| 44 | +@adm.route('/logout', methods=["GET"]) | |
| 45 | +@jwt_required() | |
| 46 | +def logout(): | |
| 47 | + response = { | |
| 48 | + 'message': 'Logged out successfully' | |
| 49 | + } | |
| 50 | + return jsonify(response) | |
| 51 | + | |
| 52 | + | |
| 53 | +@adm.route('/users', methods=["GET"]) | |
| 54 | +@jwt_required() | |
| 55 | +def grid_users(): | |
| 56 | + return jsonify({"data": "users"}) | |
| 57 | + | |
| 58 | + | |
| 59 | +@adm.route('/roles', methods=["GET"]) | |
| 60 | +@jwt_required() | |
| 61 | +def grid_roles(): | |
| 62 | + return jsonify({"data": "roles"}) | |
| 63 | + | |
| 64 | + | |
| 65 | +@adm.route('/usersclients', methods=["GET"]) | |
| 66 | +@jwt_required() | |
| 67 | +def users_clients(): | |
| 68 | + return jsonify({"data": "roles"}) | |
| 69 | + | |
| 70 | +@adm.route('/menuaaccess', methods=["GET"]) | |
| 71 | +@jwt_required() | |
| 72 | +def menu_aaccess(): | |
| 73 | + return jsonify({"data": "roles"}) | |
| 74 | + | |
| 75 | + | |
| 76 | +@adm.route('/newUser', methods=["GET", "POST"]) | |
| 77 | +@jwt_required() | |
| 78 | +def newUser(): | |
| 79 | + session = k2.extensions['sqlalchemy'].db.session | |
| 80 | + exist = session.query(k2users).filter_by(login=request.json['login']).first() | |
| 81 | + if not exist: | |
| 82 | + res = k2users( | |
| 83 | + user_id=hashlib.md5(str(uuid.uuid4()).encode()).hexdigest(), | |
| 84 | + login=request.json['login'], | |
| 85 | + name=request.json['name'], | |
| 86 | + email=request.json['email'], | |
| 87 | + password=hashlib.md5(request.json['password'].encode()).hexdigest(), | |
| 88 | + phone=request.json['phone']) | |
| 89 | + if res: | |
| 90 | + session.add(res) | |
| 91 | + session.commit() | |
| 92 | + return jsonify({'status': 'ok'}) | |
| 93 | + else: | |
| 94 | + return jsonify({'error': 'Such user exist'}), 404 | |
| 95 | + | |
| 96 | + | |
| 97 | +@adm.route('/changePassword', methods=["POST"]) | |
| 98 | +@jwt_required() | |
| 99 | +def changePassword(): | |
| 100 | + session = k2.extensions['sqlalchemy'].db.session | |
| 101 | + current_user = get_jwt_identity() | |
| 102 | + user = session.query(k2users).filter_by(user_id=current_user).first() | |
| 103 | + if user.password == hashlib.md5(request.json['old_password'].encode()).hexdigest(): | |
| 104 | + if request.json['new_password'] == request.json['re_new_password']: | |
| 105 | + user.password = hashlib.md5(request.json['new_password'].encode()).hexdigest() | |
| 106 | + session.commit() | |
| 107 | + else: | |
| 108 | + return jsonify({'error': 'Пароль не найден в базе'}), 404 | |
| 109 | + else: | |
| 110 | + return jsonify({'error': 'Пароль не совпвдает'}), 404 | |
| 111 | + return jsonify({'status': 'ok'}) | |
| 112 | + | |
| 113 | + | |
| 114 | +@adm.route('/menu-items') | |
| 115 | +def menu_items(): | |
| 116 | + menu = [ | |
| 117 | + { | |
| 118 | + "title": 'Адміністрування сайту', | |
| 119 | + "icon": {"icon": 'mdi mdi-database'}, | |
| 120 | + "children": [ | |
| 121 | + {'title': 'Зміна паролю', 'to': 'adm-changePassword'}, | |
| 122 | + {'title': 'Новий користувач', 'to': 'adm-newUser'}, | |
| 123 | + {'title': 'Користувачі', 'to': 'adm-users'}, | |
| 124 | + {'title': 'Користувачі клієнти', 'to': 'adm-usersclients'}, | |
| 125 | + {'title': 'Права', 'to': 'adm-roles'}, | |
| 126 | + {'title': 'Доступ до меню', 'to': 'adm-menuaaccess'}, | |
| 127 | + ], | |
| 128 | + }] | |
| 129 | + | |
| 130 | + return menu |
components/adm/requirements.txt
| 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/adm/setup.py
| 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/k2test/k2test/__pycache__/views.cpython-310.pyc
No preview for this file type
components/k2test/k2test/views.py
| 1 | -from flask import render_template, redirect, request | |
| 1 | +from flask import render_template, redirect, request, jsonify | |
| 2 | 2 | from flask_login import login_user, current_user, logout_user, login_required |
| 3 | 3 | from flask import current_app as k2 |
| 4 | 4 | from flask import Blueprint, json |
| 5 | 5 | |
| 6 | 6 | |
| 7 | 7 | |
| ... | ... | @@ -27,20 +27,18 @@ |
| 27 | 27 | |
| 28 | 28 | @k2test.route('/new3') |
| 29 | 29 | def new_component3(): |
| 30 | - return 'сторінка 3' | |
| 30 | + return jsonify({'data': 'page new3'}) | |
| 31 | 31 | |
| 32 | 32 | @k2test.route('/new4') |
| 33 | 33 | def new_component4(): |
| 34 | - return 'сторінка 4' | |
| 34 | + return jsonify({'data': 'page new4'}) | |
| 35 | 35 | |
| 36 | 36 | |
| 37 | 37 | @k2test.route('/menu-items') |
| 38 | 38 | def menu_items(): |
| 39 | 39 | data = [ |
| 40 | 40 | { |
| 41 | - | |
| 42 | 41 | 'title': 'Тестова компонента', |
| 43 | - 'category': 'Тест', | |
| 44 | 42 | 'icon': {'icon': 'mdi-chart-timeline-variant'}, |
| 45 | 43 | 'children': [ |
| 46 | 44 | {'title': 'Тест 3', 'to': 'k2test-new3'}, |
components/menu.yml
| 1 | -- category: "\u0422\u0435\u0441\u0442" | |
| 2 | - children: | |
| 1 | +- heading: APPS & PAGES | |
| 2 | +- children: | |
| 3 | 3 | - title: "\u0422\u0435\u0441\u0442 3" |
| 4 | 4 | to: k2test-new3 |
| 5 | 5 | - title: "\u0422\u0435\u0441\u0442 3" |
| ... | ... | @@ -10,4 +10,25 @@ |
| 10 | 10 | id: 2 |
| 11 | 11 | title: "\u0422\u0435\u0441\u0442\u043E\u0432\u0430 \u043A\u043E\u043C\u043F\u043E\ |
| 12 | 12 | \u043D\u0435\u043D\u0442\u0430" |
| 13 | +- children: | |
| 14 | + - title: "\u0417\u043C\u0456\u043D\u0430 \u043F\u0430\u0440\u043E\u043B\u044E" | |
| 15 | + to: adm-changePassword | |
| 16 | + - title: "\u041D\u043E\u0432\u0438\u0439 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\ | |
| 17 | + \u0432\u0430\u0447" | |
| 18 | + to: adm-newUser | |
| 19 | + - title: "\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456" | |
| 20 | + to: adm-users | |
| 21 | + - title: "\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456 \u043A\ | |
| 22 | + \u043B\u0456\u0454\u043D\u0442\u0438" | |
| 23 | + to: adm-usersclients | |
| 24 | + - title: "\u041F\u0440\u0430\u0432\u0430" | |
| 25 | + to: adm-roles | |
| 26 | + - title: "\u0414\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0435\u043D\u044E" | |
| 27 | + to: adm-menuaaccess | |
| 28 | + component_name: adm | |
| 29 | + icon: | |
| 30 | + icon: mdi mdi-database | |
| 31 | + id: 3 | |
| 32 | + title: "\u0410\u0434\u043C\u0456\u043D\u0456\u0441\u0442\u0440\u0443\u0432\u0430\ | |
| 33 | + \u043D\u043D\u044F \u0441\u0430\u0439\u0442\u0443" |
db/database.db
No preview for this file type
k2/__pycache__/k2inst.cpython-310.pyc
No preview for this file type
k2/k2inst.py
| ... | ... | @@ -337,14 +337,9 @@ |
| 337 | 337 | response = requests.get(f"{k2.domain}{selected_component_name}/menu-items") |
| 338 | 338 | if response.status_code == 200: |
| 339 | 339 | data = response.json() |
| 340 | - print(data) | |
| 340 | + | |
| 341 | 341 | else: |
| 342 | - data = [{ | |
| 343 | - 'url': {'name': 'error'}, | |
| 344 | - 'icon': 'error', | |
| 345 | - 'title': f"{selected_component_name}--error", | |
| 346 | - 'category': 'error', | |
| 347 | - }] | |
| 342 | + data = [] | |
| 348 | 343 | # add component_name key for menu items |
| 349 | 344 | for item in data: |
| 350 | 345 | item['component_name'] = selected_component_name |
languages/babel_translation_directories.yml
routes.py
| ... | ... | @@ -3,7 +3,9 @@ |
| 3 | 3 | from main import app, babel |
| 4 | 4 | from k2.k2inst import components_bp |
| 5 | 5 | app.register_blueprint(components_bp) |
| 6 | - | |
| 7 | 6 | from components.k2test.k2test.views import k2test |
| 8 | 7 | app.register_blueprint(k2test, url_prefix='/k2test') |
| 8 | + | |
| 9 | +from components.adm.adm.views import adm | |
| 10 | +app.register_blueprint(adm, url_prefix='/adm') |