Commit 79305bf74d3bb28210125c8f6866d0ea2486ff88

Authored by Василь Свідрик
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
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
  1 +# Default ignored files
  2 +/shelf/
  3 +/workspace.xml
  4 +# Editor-based HTTP Client requests
  5 +/httpRequests/
  6 +# Datasource local storage ignored files
  7 +/dataSources/
  8 +/dataSources.local.xml
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
  1 +<component name="InspectionProjectProfileManager">
  2 + <settings>
  3 + <option name="USE_PROJECT_PROFILE" value="false" />
  4 + <version value="1.0" />
  5 + </settings>
  6 +</component>
components/adm/adm/.idea/misc.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
  4 +</project>
components/adm/adm/.idea/modules.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="ProjectModuleManager">
  4 + <modules>
  5 + <module fileurl="file://$PROJECT_DIR$/.idea/adm.iml" filepath="$PROJECT_DIR$/.idea/adm.iml" />
  6 + </modules>
  7 + </component>
  8 +</project>
components/adm/adm/.idea/vcs.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project version="4">
  3 + <component name="VcsDirectoryMappings">
  4 + <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
  5 + </component>
  6 +</project>
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'},
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"
No preview for this file type
k2/__pycache__/k2inst.cpython-310.pyc
No preview for this file type
... ... @@ -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
1   -babel_translation_directories: languages;components/k2test/k2test/languages
  1 +babel_translation_directories: languages;components/k2test/k2test/languages;components/adm/adm/languages
... ... @@ -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')