From 79305bf74d3bb28210125c8f6866d0ea2486ff88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B0=D1=81=D0=B8=D0=BB=D1=8C=20=D0=A1=D0=B2=D1=96?= =?UTF-8?q?=D0=B4=D1=80=D1=96=D0=BA?= Date: Thu, 15 Jun 2023 12:24:21 +0300 Subject: [PATCH] add adm --- __pycache__/routes.cpython-310.pyc | Bin 411 -> 485 bytes components/adm/README.md | 45 +++++++ components/adm/__init__.py | 0 .../adm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes components/adm/adm/.idea/.gitignore | 8 ++ components/adm/adm/.idea/adm.iml | 16 +++ .../.idea/inspectionProfiles/Project_Default.xml | 28 +++++ .../.idea/inspectionProfiles/profiles_settings.xml | 6 + components/adm/adm/.idea/misc.xml | 4 + components/adm/adm/.idea/modules.xml | 8 ++ components/adm/adm/.idea/vcs.xml | 6 + components/adm/adm/__init__.py | 0 .../adm/adm/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 170 bytes .../adm/adm/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 180 bytes .../adm/adm/__pycache__/models.cpython-310.pyc | Bin 0 -> 1782 bytes .../adm/adm/__pycache__/views.cpython-310.pyc | Bin 0 -> 3941 bytes .../adm/adm/__pycache__/views.cpython-311.pyc | Bin 0 -> 1119 bytes components/adm/adm/models.py | 43 +++++++ components/adm/adm/views.py | 135 +++++++++++++++++++++ components/adm/requirements.txt | 47 +++++++ components/adm/setup.py | 15 +++ .../k2test/__pycache__/views.cpython-310.pyc | Bin 1959 -> 1946 bytes components/k2test/k2test/views.py | 8 +- components/menu.yml | 25 +++- db/database.db | Bin 36864 -> 36864 bytes k2/__pycache__/k2inst.cpython-310.pyc | Bin 13729 -> 13633 bytes k2/k2inst.py | 9 +- languages/babel_translation_directories.yml | 2 +- routes.py | 4 +- 29 files changed, 393 insertions(+), 16 deletions(-) create mode 100644 components/adm/README.md create mode 100644 components/adm/__init__.py create mode 100644 components/adm/__pycache__/__init__.cpython-310.pyc create mode 100644 components/adm/adm/.idea/.gitignore create mode 100644 components/adm/adm/.idea/adm.iml create mode 100644 components/adm/adm/.idea/inspectionProfiles/Project_Default.xml create mode 100644 components/adm/adm/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 components/adm/adm/.idea/misc.xml create mode 100644 components/adm/adm/.idea/modules.xml create mode 100644 components/adm/adm/.idea/vcs.xml create mode 100644 components/adm/adm/__init__.py create mode 100644 components/adm/adm/__pycache__/__init__.cpython-310.pyc create mode 100644 components/adm/adm/__pycache__/__init__.cpython-311.pyc create mode 100644 components/adm/adm/__pycache__/models.cpython-310.pyc create mode 100644 components/adm/adm/__pycache__/views.cpython-310.pyc create mode 100644 components/adm/adm/__pycache__/views.cpython-311.pyc create mode 100644 components/adm/adm/models.py create mode 100644 components/adm/adm/views.py create mode 100644 components/adm/requirements.txt create mode 100644 components/adm/setup.py diff --git a/__pycache__/routes.cpython-310.pyc b/__pycache__/routes.cpython-310.pyc index 4ed4611f3400e701e13c88288a9e27c561aa220f..ea7bb651116323301ecd938fd9b2d7e2a505cf0e 100644 GIT binary patch delta 147 zcmbQu{FIqDpO=@50SGLwccsKn|AU`iPucTNHC=AABnW^Q) oMI1moRx%Xv0I4FL$@YvsA_71r4}$;`4N4g`k0?X@NDIoeWh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w$*(xTqIJKxa zrnpSEJijPACZIAoBe5tqpeR2pHMyiXCfleeKfeS + + + + + + + + + + \ No newline at end of file diff --git a/components/adm/adm/.idea/inspectionProfiles/Project_Default.xml b/components/adm/adm/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..62102dd --- /dev/null +++ b/components/adm/adm/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,28 @@ + + + + \ No newline at end of file diff --git a/components/adm/adm/.idea/inspectionProfiles/profiles_settings.xml b/components/adm/adm/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/components/adm/adm/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/components/adm/adm/.idea/misc.xml b/components/adm/adm/.idea/misc.xml new file mode 100644 index 0000000..dc9ea49 --- /dev/null +++ b/components/adm/adm/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/components/adm/adm/.idea/modules.xml b/components/adm/adm/.idea/modules.xml new file mode 100644 index 0000000..52b9a11 --- /dev/null +++ b/components/adm/adm/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/components/adm/adm/.idea/vcs.xml b/components/adm/adm/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/components/adm/adm/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/components/adm/adm/__init__.py b/components/adm/adm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/components/adm/adm/__pycache__/__init__.cpython-310.pyc b/components/adm/adm/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bea620f5b9c69bd92e02852f794251c1782991f GIT binary patch literal 170 zcmd1j<>g`k0?X@NDIoeWh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w)*(xTqIJKxa zrnpSEJijPACZIAoBe5tqpeR2pHMyiXCfleeKfeSTZlX-=vg$eLm%Ai=@_0N3R!b^rhX literal 0 HcmV?d00001 diff --git a/components/adm/adm/__pycache__/__init__.cpython-311.pyc b/components/adm/adm/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27e41f64ba8e2fb7b1563d6fae0ca678a0dbc4fe GIT binary patch literal 180 zcmZ3^%ge<81S(2pDIoeWh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09t%UwSsKQ~oB zKPNT2I597!NI#$`KPxr4q*&j`z{ptN+sHX5zcj@)C_q0sKer%1FEtM+m6(zX#_{o) td6^~g@p=W7zc_4i^HWN5QtgUZf#!m2F6IXkAD9^#89y+@v3>Z{UM8rIZEQEz9ViPPnU6q-h>C2?5Cdq`! zQ}QJ2tKi$rqrXU~SD*411i^D^b~c06)Yqp@ovuEY?^NCCGzp9^|N2e*5fJh>E;fe` zi*I4-3P2D+3zFcQ6|`gtE4{=k{lurJ^NOGhlhDb25tVTgJ2@yCWix3ynHH_21-4<) zE;~t=5*gl*Wb1n(A`#yb5zDO`FX;(-MEZ?8_$N8+dp10%i)mTe=!eS4fmAj;GAgeI zeQJ9`W<{z}lb=g|l4=RMhnbS8kvz>ZsWmtCSXQ8Jn7oui7AA#7E1N1ME5p;tB*Xt~ zjyF-CgI1D+3X(9Gp7doPs9>*H5`r8F?}pycB;Jr4PWGL?xuI`4IdJ;62t{;Dl8)$# zhG^c>q${^XOSEqZoYoT^h1jjsf~>=6&y^wfi$WMk*O_&9>O-l1AsoWzLv$Q4aXO$ z8t6ZXdKc9Hyg2yk_$SQeu|EF<92+0MoMppQl`mC2l9|!R<9$`vX8p?QassYau#t+= z%@Q0c^xkAFx#|8uX?Y`wzoFBdk0K1tju~Kzi=MF)VlzN z%z;PO%s?$hY|aFI#jd@%2U%r@5LBECa3(i1+mV-(TuIGWMD|n!pQ{i759<5sF}#x2 z%8VoB)rX+5folVojupIz+6H8E)gVt`sqvhccBxOVw%1|2vB*5wT@NG~{@R7`D+q>+ zsGyI){gHR=33lyYJ(&aT=18~z!V2ef?8pUjWa33*&K6Ba$JUa#o%WJk`#+Ppe?+Kz z1gw8?>%MnroBFIsi)<*%nI-*>W#fI@l$S@FR1T_ z|Ay3OS3BzzZkiwVsd@_5{cR)?wg>07$vNV1Td0N}POpd(9ZhP6|x(-4!LbqMedy&d)+k6p80 literal 0 HcmV?d00001 diff --git a/components/adm/adm/__pycache__/views.cpython-310.pyc b/components/adm/adm/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11f4131c1f71ba9b544c6fb508cf81504cc5411b GIT binary patch literal 3941 zcmbtXNsk-H74GVd%QP3wXd79Q>D_d!45Gvd>^P2MC641bV*#=*!~jH#)x&8{lN?ud zTN;7_Y)yawL8K&rAOnE|lRz#4d{7Jvkr&B-p?L~W*PL|7DK`Oz^Sx@$Xee38Asp1} zs(P=s_rAAGzf>w3_`Ueg-}8T04C7xk*!|04Z~{%9XNJKI&LX3ceOZHHY({3+YFJ&n zVRxN|!-!{L&TZs$-;VO#LZi?vHi{TK+>PeCUc+NXVDVf~;(1=+MLu`QX_SL7xerdJ-?Ul%jAQ?mcjS)1H{9sdCfgI!(HTurrZV1 zePo7vm>-#P_iFCZ8SbOJHs$Wq+{b3PkMk#{-2IySB;SYon)D8Ruc!FaQ~m+Xe`fnN zn)@uTPq_z!@~Fa}8#DeL{yfb!7CAd@)Q{aEn=IEYRd_W@f(;S&VwDrYJ4qnX>BxRB zT-~fQHP=dn2zqhT-`J>|%IlnqnaEjn(_!5pUh8w&q9<+t9CU27lV~yqiH#1sV8mv};%w3A*d6Br8?uob=f3c9~tUAYB|&4p!Elp@RBfe?K$D4v1dYQcFt z@y?&2&1*)zEG!bY$tcQPKdy?w`8epwu-}u)UXf>afDVo`Uc7-D=H_GI|zm#a`%msFRjo$ z<%)dw*txz~UpckeTJuHsl<0SYRxDT6kBfdk-u~dsjeZXhkt;B}ZtsS{Ir-g@A7~)-t(}lzuxH9C)+e zZU?-Et!gsS_*_k*XcL&#mu6%y31hILV{z`!#nSYT0LIf*7e2hkyu zLMcM(1z>4p#|}a%0%|8e6G{SY9s$*kYUVrVyZ0z7m z^0b$`Xxt~AL!i!Iaw$lQ(>Qq#e44_tF`B2a94}A}kO7Gs2+Iq6j(gg#OWLo?%VHic z$b64NjmDI;m#8Gu4Y5IG2_e7N4o*#D;{#}+6s*zmF*>toiR~>z zM`kB>ftlP8j*rBf&k}E^kYS}$;udTVyZ|Y{%epCEk3Gy1O6UueVD7|@H0JL~56xx) zhycQv(W}OLxXW`I19`%L9v5cDs2VfO)V&NJbtZm_t2aE9Ca6BL6wvUXuzRD52%5Vm zGyoF9M*2~Deezy(aLTNtz zAloCoUV~Y-O?-JUkJ9GYtS(S6J1C2zK$&qrA^%SQs?B*b{j8RLp56vNZt9!pdrW>e zn4?Xm9+^;`k^bdDsmawrf#k>}G9l0Yb}2gI3q17-o_8_5IjHU|nx>b8l%0NrTU;kS zWV`AFmr$rmui$Lb(^mRb4XV3cOTQ%SPA(5BwAHR;RJX)iSRs}{RKB$qMjZb&=vada z-6qNV15Z(>APoY6Rgz$3+AhnRS#SC zL3;M4mqJcf(QE&YjRcedLFlQs6mOpTX4`xn`j~k;^WK}^{^tGWdm<4>V659BzJ$O)_%9L3$vpPbYSIR)J3iMoJ=dvk?C>c@ z9YUGuQ@df6eVW5O=GEM7v&!m(%VlC$@DLCo71lD$TOZsZ^2c%ni*5{TlG`3`q0U%# zP=%1Mjn+gu2E4N&=Hw2e7KYo%Ydj9D%to1&ZI36atm*g_*YTNac{zm%c06jDPT8iW z$)_2u);%9?_-Sx?7J-tS1ea?xcxr?-s_+EWZ1!%&sJS*ZT#IgbWrr|how=K|;(Ny8 z!eZWdv-rw#n`HIvx>0fMhU-uVQUDmv&vm-(%{O+~Jpc=x_^($0*GAWw$DNNqmb;l^ zFH;PZnSK9{1omJMj8e;Fp>+mMN%-4L|I>lTOt;}I2 zv}gChc|xHqn-crfz=@rg2G>S6`gD8cT2CJpPe`EWyL!H-=L03rl8|1@>0I5g%HCEe z6%$-TX#Qx_#ChNm&aseqkfC%;ha)@zB_qYc{&JPMO^{k}Iz{2%LXvmUqV1BVMPIOo zkP_^@18{vAV|;~{g8z>zv>Z&1o8*Io*wK^DOgA~#OU|_ueMQ6BJ{r1dBu!o7)CEo* hd^k}%+W}5>vC+duUy|^%J_7e!M$*DWBn*d){{S6C2-^Sv literal 0 HcmV?d00001 diff --git a/components/adm/adm/models.py b/components/adm/adm/models.py new file mode 100644 index 0000000..d765f05 --- /dev/null +++ b/components/adm/adm/models.py @@ -0,0 +1,43 @@ +import uuid +from sqlalchemy import Column, Integer, String +from sqlalchemy.ext.declarative import declarative_base +from flask_jwt_extended import create_access_token +from datetime import timedelta +import hashlib +from flask import current_app as k2 + + +Base = declarative_base() + +class k2users(Base): + __tablename__ = 'k2users' + user_id = Column(Integer, primary_key=True) + login = Column(String(50)) + name = Column(String(50)) + email = Column(String(150)) + password = Column(String(50)) + phone = Column(String(20)) + + def __init__(self, **kwargs): + self.user_id = hashlib.md5(str(uuid.uuid4()).encode()).hexdigest() + self.login = kwargs.get('login') + self.password = hashlib.md5(kwargs.get('password').encode()).hexdigest() + self.name = kwargs.get('name') + self.email = kwargs.get('email') + self.phone = kwargs.get('phone') + + def get_token(self, expire_time=24): + expires_delta = timedelta(expire_time) + token = create_access_token(identity=self.user_id, expires_delta=expires_delta) + return token + + @classmethod + def authenticate(cls, login, password): + session = k2.extensions['sqlalchemy'].db.session + user = '' + try: + user = session.query(cls).filter(cls.login == login).filter(cls.password == hashlib.md5(password.encode()).hexdigest()).one() + except: + user = None + + return user \ No newline at end of file diff --git a/components/adm/adm/views.py b/components/adm/adm/views.py new file mode 100644 index 0000000..d560937 --- /dev/null +++ b/components/adm/adm/views.py @@ -0,0 +1,135 @@ +import hashlib +import uuid +from flask import Blueprint, request, jsonify +from flask import current_app as k2 +from flask_jwt_extended import jwt_required, get_jwt_identity +# from flask_sqlalchemy import session +# from sqlalchemy.orm import sessionmaker +# from k2.k2inst import Component + +from .models import k2users + + +adm = Blueprint('adm', __name__, template_folder='templates', static_folder='static', static_url_path='/adm') + + +@adm.route('/register', methods=["POST"]) +def register(): + params = request.json + session = k2.extensions['sqlalchemy'].db.session + exist = session.query(k2users).filter_by(login=request.json['login']).first() + if not exist: + user = k2users(**params) + session.add(user) + session.commit() + token = user.get_token() + return {'access_token': token} + else: + return jsonify({'error': 'User exist'}), 401 + + +@adm.route('/login', methods=["POST"]) +def login(): + params = request.json + login = params.get('login') + password = params.get('password') + user = k2users.authenticate(login, password) + if user: + token = user.get_token() + return {'access_token': token} + else: + return jsonify({'error': 'Unauthorized'}), 401 + + +@adm.route('/logout', methods=["GET"]) +@jwt_required() +def logout(): + response = { + 'message': 'Logged out successfully' + } + return jsonify(response) + + +@adm.route('/users', methods=["GET"]) +@jwt_required() +def grid_users(): + return jsonify({"data": "users"}) + + +@adm.route('/roles', methods=["GET"]) +@jwt_required() +def grid_roles(): + return jsonify({"data": "roles"}) + + +@adm.route('/usersclients', methods=["GET"]) +@jwt_required() +def users_clients(): + return jsonify({"data": "roles"}) + +@adm.route('/menuaaccess', methods=["GET"]) +@jwt_required() +def menu_aaccess(): + return jsonify({"data": "roles"}) + + +@adm.route('/newUser', methods=["GET", "POST"]) +@jwt_required() +def newUser(): + session = k2.extensions['sqlalchemy'].db.session + exist = session.query(k2users).filter_by(login=request.json['login']).first() + if not exist: + res = k2users( + user_id=hashlib.md5(str(uuid.uuid4()).encode()).hexdigest(), + login=request.json['login'], + name=request.json['name'], + email=request.json['email'], + password=hashlib.md5(request.json['password'].encode()).hexdigest(), + phone=request.json['phone']) + if res: + session.add(res) + session.commit() + return jsonify({'status': 'ok'}) + else: + return jsonify({'error': 'Such user exist'}), 404 + + +@adm.route('/changePassword', methods=["POST"]) +@jwt_required() +def changePassword(): + session = k2.extensions['sqlalchemy'].db.session + current_user = get_jwt_identity() + user = session.query(k2users).filter_by(user_id=current_user).first() + if user.password == hashlib.md5(request.json['old_password'].encode()).hexdigest(): + if request.json['new_password'] == request.json['re_new_password']: + user.password = hashlib.md5(request.json['new_password'].encode()).hexdigest() + session.commit() + else: + return jsonify({'error': 'Пароль не найден в базе'}), 404 + else: + return jsonify({'error': 'Пароль не совпвдает'}), 404 + return jsonify({'status': 'ok'}) + + +@adm.route('/menu-items') +def menu_items(): + menu = [ + { + "title": 'Адміністрування сайту', + "icon": {"icon": 'mdi mdi-database'}, + "children": [ + {'title': 'Зміна паролю', 'to': 'adm-changePassword'}, + {'title': 'Новий користувач', 'to': 'adm-newUser'}, + {'title': 'Користувачі', 'to': 'adm-users'}, + {'title': 'Користувачі клієнти', 'to': 'adm-usersclients'}, + {'title': 'Права', 'to': 'adm-roles'}, + {'title': 'Доступ до меню', 'to': 'adm-menuaaccess'}, + ], + }] + + return menu + + + + + diff --git a/components/adm/requirements.txt b/components/adm/requirements.txt new file mode 100644 index 0000000..85526b6 --- /dev/null +++ b/components/adm/requirements.txt @@ -0,0 +1,47 @@ +alembic==1.11.1 +Babel==2.12.1 +bcrypt==4.0.1 +bidict==0.22.1 +blinker==1.6.2 +certifi==2023.5.7 +charset-normalizer==3.1.0 +click==8.1.3 +colorama==0.4.6 +dnspython==2.3.0 +email-validator==2.0.0.post2 +Flask==2.3.2 +flask-babel==3.1.0 +Flask-Bcrypt==1.0.1 +Flask-Cors==3.0.10 +Flask-JWT-Extended==4.5.2 +Flask-Login==0.6.2 +Flask-Migrate==4.0.4 +Flask-MySQLdb==1.0.1 +Flask-SQLAlchemy==3.0.3 +flask-staticdirs==1.0.1 +Flask-WTF==1.1.1 +greenlet==2.0.2 +idna==3.4 +itsdangerous==2.1.2 +Jinja2==3.1.2 +jsonify==0.5 +Mako==1.2.4 +MarkupSafe==2.1.2 +mysql==0.0.3 +mysql-connector==2.2.9 +mysql-connector-python==8.0.33 +mysqlclient==2.1.1 +peppercorn==0.6 +protobuf==3.20.3 +PyJWT==2.7.0 +python-engineio==4.4.1 +python-socketio==5.8.0 +pytz==2023.3 +PyYAML==6.0 +requests==2.31.0 +six==1.16.0 +SQLAlchemy==2.0.15 +typing_extensions==4.6.2 +urllib3==2.0.2 +Werkzeug==2.3.4 +WTForms==3.0.1 diff --git a/components/adm/setup.py b/components/adm/setup.py new file mode 100644 index 0000000..8370eae --- /dev/null +++ b/components/adm/setup.py @@ -0,0 +1,15 @@ +from setuptools import setup + +setup( + name='adm', + version='1.0.0', + description='Description of my project', + author='Your Name', + author_email='yourname@example.com', + keywords="adm, k2", + python_requires=">=3.7, <=3.11.2", + packages=['adm'], + package_data={ # Optional + }, + install_requires=[""], +) \ No newline at end of file diff --git a/components/k2test/k2test/__pycache__/views.cpython-310.pyc b/components/k2test/k2test/__pycache__/views.cpython-310.pyc index 45ff8bfbed5930dbce994c320faa34fe07ac31bd..c04cd14ea8cf20ecab0c8f0963461d1dcd967a6f 100644 GIT binary patch delta 842 zcmZvaJ#W)M7{`6*^IKv!FHO=Uv=k&ja)36J_7fmr>jDg%ghG^aQ-jZG&xxv5K!-9Q z1ViPm>Hrh!!op{OwM+>46Mz_*791nvzhap&{9x(QD(W9h~=64SldB#GPo&`2WWy76soACB9Ia*D^gWt z5=ezr6{#sw12VgG}AA73;Ah{Tq}<0?@&Z$Q7e5$PF&TY z;0ionWw#;RD8nJzK`@rSoDtR?cDJ0hZa+8`2OF0UkTCupFmBpRKauHME*5hT+%o1N zb+HHLKkLsy;yhqzE-t`6?!723f`2sn@y>URx;ZZ+?evjxddUP+j+>kVk;5`QM2s+l znfn-aOYVKl?0vnD9%>IXco8T4VECzP-oB%Y1=;EnNM`p|!-$C>R%iN1&2#MhrcBE5 zARcwXVZf8K;3q{8OiW~B8{r@1JNZfSVhP}~Ur!Is+P1nMnqP^!$^A|==!db8BMVE4 zEya-{e`YZ)B`-yN$>LE_vL1D#-fF-%g$J?B?sVcV4>}z&AzecZM#Dh(vaBUV-nnQ? SfjP?mxxsa-hU)1PYxWm+IkA2K delta 887 zcmZ{iO=#3W6vs1@$;WOsyW4i#?pjM%RA^dTMGIa;5W!;+JQ)wm(igXjnWRp3DMh7z z9YpX@0)nLn^&;K`@uH|8cs6?t;@z_sMf`X(RTMu0`Oo|RX5QnyNj57FDsJq$MGc>q zuW!Pe4R><=6&lchgc>J4;nb&G_jMu}4H-9lgPXp|E#Km{Z!50j*@9nGF~ivL9bWQF z${V4}%YK++uz;sNNld;ynTml&)*nh(D~zNf%KWDhiD#R7Elb!-~`t z89`EmQAI`-8ACD-bw$RYaZ2-cyq9Bn`o@<%k7vjxsgIx)HOXjB=MUt%h*uwKqMp8` zS;aw~8_?$~iD!z*^qGFpsmlZ_qh!{js&iriho`VH3v)CLG821499V zP0+>uFvf!`gR9w#!R5j2?0NPyd(=F%UH7kApV&^usF+O~#>APQ<-`n@_;0C&f0x3P zyc`9qt)-Z+#8D9S7MjS!J}GnQ4P)0~3q#p%GK~TRDCoet1Pn02+M>AHa_vwkY_Sfx zq+Qf-q+k>_?Q_OYL6JiN%_j-?q!$5JV8EEhJF|vl^-%`qSVq0*3@@We9yxG diff --git a/components/k2test/k2test/views.py b/components/k2test/k2test/views.py index ad0318f..9ce7b9c 100644 --- a/components/k2test/k2test/views.py +++ b/components/k2test/k2test/views.py @@ -1,4 +1,4 @@ -from flask import render_template, redirect, request +from flask import render_template, redirect, request, jsonify from flask_login import login_user, current_user, logout_user, login_required from flask import current_app as k2 from flask import Blueprint, json @@ -27,20 +27,18 @@ def new_component2(): @k2test.route('/new3') def new_component3(): - return 'сторінка 3' + return jsonify({'data': 'page new3'}) @k2test.route('/new4') def new_component4(): - return 'сторінка 4' + return jsonify({'data': 'page new4'}) @k2test.route('/menu-items') def menu_items(): data = [ { - 'title': 'Тестова компонента', - 'category': 'Тест', 'icon': {'icon': 'mdi-chart-timeline-variant'}, 'children': [ {'title': 'Тест 3', 'to': 'k2test-new3'}, diff --git a/components/menu.yml b/components/menu.yml index 5405c29..0b82138 100644 --- a/components/menu.yml +++ b/components/menu.yml @@ -1,5 +1,5 @@ -- category: "\u0422\u0435\u0441\u0442" - children: +- heading: APPS & PAGES +- children: - title: "\u0422\u0435\u0441\u0442 3" to: k2test-new3 - title: "\u0422\u0435\u0441\u0442 3" @@ -10,3 +10,24 @@ id: 2 title: "\u0422\u0435\u0441\u0442\u043E\u0432\u0430 \u043A\u043E\u043C\u043F\u043E\ \u043D\u0435\u043D\u0442\u0430" +- children: + - title: "\u0417\u043C\u0456\u043D\u0430 \u043F\u0430\u0440\u043E\u043B\u044E" + to: adm-changePassword + - title: "\u041D\u043E\u0432\u0438\u0439 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\ + \u0432\u0430\u0447" + to: adm-newUser + - title: "\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456" + to: adm-users + - title: "\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456 \u043A\ + \u043B\u0456\u0454\u043D\u0442\u0438" + to: adm-usersclients + - title: "\u041F\u0440\u0430\u0432\u0430" + to: adm-roles + - title: "\u0414\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0435\u043D\u044E" + to: adm-menuaaccess + component_name: adm + icon: + icon: mdi mdi-database + id: 3 + title: "\u0410\u0434\u043C\u0456\u043D\u0456\u0441\u0442\u0440\u0443\u0432\u0430\ + \u043D\u043D\u044F \u0441\u0430\u0439\u0442\u0443" diff --git a/db/database.db b/db/database.db index 98d429997ba506f28760c6e89b3402f6c9f15c5f..c1c3a34592635335817ebc271ee846fa0606066c 100644 GIT binary patch delta 182 zcmZozz|^pSX@WGP!$cWpMu&|FOXPW&_?9s6d-5&e_vA_0EGQ7dvpGe_fyu8?iHXZs zm{*k7k+ad-%+es)B+(!()gmdy#2_)%!qhU^+{851FxAp5CDk%5F(ubf&%n^gz{ptF zz)aWBRKdW~%Fx`(#8l71)X31>bn_=YAwv!({_PC>+xhQo=1Ex1ucE^2%Sg!J&A0Pa F6#xX(Fy8m)NvBQr}2bCcvG1Cx}b#3T!IBZEZCR5Jt9L=y{(l*E)=Lp=jSBLgF2T>~>+ zLn8$PODhv2D^p`VOA|v26SK{q^n?sK82Rro@ZaIzzL_UsHNOf21A`|agE!yKS5*K2 D6}K*t diff --git a/k2/__pycache__/k2inst.cpython-310.pyc b/k2/__pycache__/k2inst.cpython-310.pyc index c03ff6d5765d5419b6d33954a1546660f7ab569e..0a374a5125c0034074ed1656091c670e36f03ba7 100644 GIT binary patch delta 407 zcmW+wJ4gdT5Z&3mJL4r;@kC4Awmj`#|(%tS4bkfSPI)aTX>eoLww*NJ)UJ|cZwP^fR2uK?19-vtbhQtGko^udjc6JuFashqLc4zrUEKxe z-Jc!(2Drenj0K;#mdQtN0}E9agF1D5%*?1!29h(tG8^EYQ+lXm9m{F#`rYjI*f$yOwdQ1co zgyn9dwF)z08s!94S_~+{eIr3CPc+Sbo=phE%!I_+d2I}$$kSMl zoMu7j%u-=*5kSm&fU1T2-MrrpIvZXi3fk-Zrg}S{RW#57&O_eKdEWV@N(W?vw;t2R za@ZMYQ6p*v17mq93RXh?EPd-10WQdo6&JelsPef~RvtxSf&nJz1gos@*T~7;>LeVd z`_(r92QsL+FqB)h1!&1p?FNieGV>7Nn_TpI@G>2G4#0Q$b9Nef((r5M59Qi*{Uyd^ zVP;OY{pWBb$Ns^!SAfuZQB5sMK?Tvl!WO>zPuEOU^ON*=?iav2`E}lfQ~76p)&7!6 zu#)JQpGjW717rEVKD=_MT6~mIwvC@;behqbyjw5Hy<6erv