Commit c37dc1704e9b88b4cded220f2c0c58bf914a9203

Authored by Яна Степаненко
1 parent 4393fbe509
Exists in master

add adm directory

Showing 18 changed files with 315 additions and 0 deletions Side-by-side Diff

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/__pycache__/__init__.cpython-311.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 + try:
  21 + user = k2users(**params)
  22 + session.add(user)
  23 + session.commit()
  24 + token = user.get_token()
  25 + return {'access_token': token}
  26 + except:
  27 + return jsonify({'error': 'Unauthorized'}), 401
  28 +
  29 +
  30 +@adm.route('/login', methods=["POST"])
  31 +def login():
  32 + params = request.json
  33 + login = params.get('login')
  34 + password = params.get('password')
  35 + user = k2users.authenticate(login, password)
  36 + if user:
  37 + token = user.get_token()
  38 + return {'access_token': token}
  39 + else:
  40 + return jsonify({'error': 'Unauthorized'}), 401
  41 +
  42 +
  43 +@adm.route('/logout', methods=["GET"])
  44 +@jwt_required()
  45 +def logout():
  46 + response = {
  47 + 'message': 'Logged out successfully'
  48 + }
  49 + return jsonify(response)
  50 +
  51 +
  52 +@adm.route('/users', methods=["GET"])
  53 +@jwt_required()
  54 +def grid_users():
  55 + return jsonify({"data": "users"})
  56 +
  57 +
  58 +@adm.route('/roles', methods=["GET"])
  59 +@jwt_required()
  60 +def grid_roles():
  61 + return jsonify({"data": "roles"})
  62 +
  63 +
  64 +@adm.route('/usersclients', methods=["GET"])
  65 +@jwt_required()
  66 +def users_clients():
  67 + return jsonify({"data": "roles"})
  68 +
  69 +@adm.route('/menuaaccess', methods=["GET"])
  70 +@jwt_required()
  71 +def menu_aaccess():
  72 + return jsonify({"data": "roles"})
  73 +
  74 +
  75 +@adm.route('/newUser', methods=["GET", "POST"])
  76 +@jwt_required()
  77 +def newUser():
  78 + session = k2.extensions['sqlalchemy'].db.session
  79 + exist = session.query(k2users).filter_by(login=request.json['login']).first()
  80 + if not exist:
  81 + res = k2users(
  82 + user_id=hashlib.md5(str(uuid.uuid4()).encode()).hexdigest(),
  83 + login=request.json['login'],
  84 + name=request.json['name'],
  85 + email=request.json['email'],
  86 + password=hashlib.md5(request.json['password'].encode()).hexdigest(),
  87 + phone=request.json['phone'])
  88 + if res:
  89 + session.add(res)
  90 + session.commit()
  91 + return jsonify({'status': 'ok'})
  92 + else:
  93 + return jsonify({'error': 'Such user exist'}), 404
  94 +
  95 +
  96 +@adm.route('/changePassword', methods=["POST"])
  97 +@jwt_required()
  98 +def changePassword():
  99 + session = k2.extensions['sqlalchemy'].db.session
  100 + current_user = get_jwt_identity()
  101 + user = session.query(k2users).filter_by(user_id=current_user).first()
  102 + if user.password == hashlib.md5(request.json['old_password'].encode()).hexdigest():
  103 + if request.json['new_password'] == request.json['re_new_password']:
  104 + user.password = hashlib.md5(request.json['new_password'].encode()).hexdigest()
  105 + session.commit()
  106 + else:
  107 + return jsonify({'error': 'Пароль не найден в базе'}), 404
  108 + else:
  109 + return jsonify({'error': 'Пароль не совпвдает'}), 404
  110 + return jsonify({'status': 'ok'})
  111 +
  112 +
  113 +@adm.route('/menu-items')
  114 +def menu_items():
  115 + menu = [
  116 + {"heading": 'APPS & PAGES'},
  117 + {
  118 + "title": 'Адміністрування сайту',
  119 +
  120 + "icon": {"icon": 'mdi mdi-database'},
  121 + "children": [
  122 + {'title': 'Зміна паролю', 'to': 'adm-changePassword'},
  123 + {'title': 'Новий користувач', 'to': 'adm-newUser'},
  124 + {'title': 'Користувачі', 'to': 'adm-users'},
  125 + {'title': 'Користувачі клієнти', 'to': 'adm-usersclients'},
  126 + {'title': 'Права', 'to': 'adm-roles'},
  127 + {'title': 'Доступ до меню', 'to': 'adm-menuaaccess'},
  128 + ],
  129 + }]
  130 +
  131 + return menu
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 +)