From 821570955a9bcc49053ed16df3d4b7d1da58c785 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: Tue, 13 Jun 2023 21:36:29 +0300 Subject: [PATCH] add get menu-items --- __pycache__/main.cpython-310.pyc | Bin 717 -> 722 bytes __pycache__/routes.cpython-310.pyc | Bin 411 -> 411 bytes .../k2test/__pycache__/__init__.cpython-310.pyc | Bin 169 -> 169 bytes .../k2test/__pycache__/__init__.cpython-310.pyc | Bin 176 -> 176 bytes .../k2test/__pycache__/views.cpython-310.pyc | Bin 1601 -> 1985 bytes components/k2test/k2test/views.py | 25 +++++++++++ components/k2test/menu_items.yml | 15 +++++++ components/k2test/reguirments-components.txt | 0 components/menu.yml | 33 +++++++++++++++ db/database.db | Bin 36864 -> 36864 bytes k2/__pycache__/k2cfg.cpython-310.pyc | Bin 2735 -> 3018 bytes k2/__pycache__/k2inst.cpython-310.pyc | Bin 11943 -> 12849 bytes k2/k2cfg.py | 13 ++++-- k2/k2inst.py | 47 +++++++++++++++------ main.py | 5 ++- 15 files changed, 120 insertions(+), 18 deletions(-) create mode 100644 components/k2test/menu_items.yml create mode 100644 components/k2test/reguirments-components.txt create mode 100644 components/menu.yml diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc index f2625dc9426206487a83d5ecbff2d5b808847f68..05564e1ceb7eebecdd3a2aca909a7c2e7b3581d2 100644 GIT binary patch delta 170 zcmX@hdWn@cpO=@50SLY{bfol6zvVY6XKWd_Mb@u%`<38ZoYWdu{$dzrv$g+OXk7*aTLghLooIZ`;YnToRHQgHu_!qsJ~uV5G(I&aH7_-g()S(AO43Pc%sm^m0Zn0XjE7zKbd2a^yZ%YOjc CswKSu diff --git a/__pycache__/routes.cpython-310.pyc b/__pycache__/routes.cpython-310.pyc index 0c2d39d25ea0cc90918dc3dfa497f37497d7f10b..e79394f3ef9e6d06a63df87e01850b3f96cd3a8c 100644 GIT binary patch delta 19 ZcmbQuJe!#-pO=@50SFwoY~-5A2mmLq1RMYW delta 19 ZcmbQuJe!#-pO=@50SH_xH*!s61OO(W1LXh! diff --git a/components/k2test/__pycache__/__init__.cpython-310.pyc b/components/k2test/__pycache__/__init__.cpython-310.pyc index c3828ca304502e47847dbfc8265e04e41fb91dfc..b766a7483ee6841282857d0b3eaa4280d86a4e78 100644 GIT binary patch delta 18 YcmZ3Hq)$ diff --git a/components/k2test/k2test/__pycache__/__init__.cpython-310.pyc b/components/k2test/k2test/__pycache__/__init__.cpython-310.pyc index be027c37ffed2d64b1fef489644d2f2d0689cbdf..8582dd90638ee57e47c4448a90384301aac7ebdf 100644 GIT binary patch delta 18 YcmdnMxPg%?pO=@50SFwoOypVy0434{HUIzs delta 18 YcmdnMxPg%?pO=@50SH_xCvq(V03`YY{{R30 diff --git a/components/k2test/k2test/__pycache__/views.cpython-310.pyc b/components/k2test/k2test/__pycache__/views.cpython-310.pyc index 67f4b8a7ee476b581d8a82a59210e85514f04dc1..bdab5069adc5c566618ce4c12bcaa43749e1ecf1 100644 GIT binary patch delta 487 zcmZXQJxjwt7{_zXC9P?#6-wW5D850EAha1=#l4GL7YVtu2AdSp#FwHJtDu{dt`6!K zXcfDNRq7|Wu9^G}jym`xRk3)-|IhRLb9WE-3}eHYcx`%G;$W>mT#&BVj?baj_DVNH z6W6mOb%RKnWX`x#R8EoXCMW0a-Y#*o5nVN@~{s-7C>yJ)Gt$e{<_=D`3-LqbvJwoxsUcd*e&jzCw>&e*TUAyXGL$6t$;22Jo zdJ$c7Xr*Q!27QZ@PZxtwZBC}Doq>ij@-WdHEr79QA@(GHQd_~KmVoQ?U?L77f8$Rv z{J+BQIBBbJtR$yBVY{l;ckK|M&HIKqu5&INAhq)$EHCCEN^%(#LkV9vf+ZA@K>W9G G9DM;{k%?#k delta 63 zcmX@ee~^bSpO=@50SH_xJ5oL|Pvnzf+%QplJzI)cFoUM}#!vk$%zm0;lV7s+P7Yud SncUCL$0##-9=j|PA0q%Zd=XOs diff --git a/components/k2test/k2test/views.py b/components/k2test/k2test/views.py index 988afac..ea16a78 100644 --- a/components/k2test/k2test/views.py +++ b/components/k2test/k2test/views.py @@ -32,3 +32,28 @@ def new_component3(): @k2test.route('/new4') def new_component4(): return 'сторінка 4' + + +@k2test.route('/menu-items') +def menu_items(): + data = [ + { + 'url': {'name': 'new2'}, + 'icon': 'mdi-chart-timeline-variant', + 'title': 'Тест 2', + 'category': 'Тестова компонента', + }, + { + 'url': {'name': 'new3'}, + 'icon': 'mdi-chart-timeline-variant', + 'title': 'Тест 3', + 'category': 'Тестова компонента', + }, + { + 'url': {'name': 'new4'}, + 'icon': 'mdi-chart-timeline-variant', + 'title': 'Тест 4', + 'category': 'Тестова компонента', + }, + ] + return data \ No newline at end of file diff --git a/components/k2test/menu_items.yml b/components/k2test/menu_items.yml new file mode 100644 index 0000000..166a9e5 --- /dev/null +++ b/components/k2test/menu_items.yml @@ -0,0 +1,15 @@ +- url: + name: new2 + icon: mdi-chart-timeline-variant + title: Тест 2 + category: Тестова компонента +- url: + name: new3 + icon: mdi-chart-timeline-variant + title: Тест 3 + category: Тестова компонента +- url: + name: new4 + icon: mdi-chart-timeline-variant + title: Тест 4 + category: Тестова компонента diff --git a/components/k2test/reguirments-components.txt b/components/k2test/reguirments-components.txt new file mode 100644 index 0000000..e69de29 diff --git a/components/menu.yml b/components/menu.yml new file mode 100644 index 0000000..85ed13d --- /dev/null +++ b/components/menu.yml @@ -0,0 +1,33 @@ +- category: dashboards + icon: mdi-chart-timeline-variant + id: 1 + title: Analytics Dashboard + url: + name: dashboards-analytics +- category: dashboards + icon: mdi-cart-outline + id: 2 + title: CRM Dashboard + url: + name: dashboards-crm +- category: "\u0422\u0435\u0441\u0442\u043E\u0432\u0430 \u043A\u043E\u043C\u043F\u043E\ + \u043D\u0435\u043D\u0442\u0430" + icon: mdi-chart-timeline-variant + id: 3 + title: "\u0422\u0435\u0441\u0442 2" + url: + name: new2 +- category: "\u0422\u0435\u0441\u0442\u043E\u0432\u0430 \u043A\u043E\u043C\u043F\u043E\ + \u043D\u0435\u043D\u0442\u0430" + icon: mdi-chart-timeline-variant + id: 4 + title: "\u0422\u0435\u0441\u0442 3" + url: + name: new3 +- category: "\u0422\u0435\u0441\u0442\u043E\u0432\u0430 \u043A\u043E\u043C\u043F\u043E\ + \u043D\u0435\u043D\u0442\u0430" + icon: mdi-chart-timeline-variant + id: 5 + title: "\u0422\u0435\u0441\u0442 4" + url: + name: new4 diff --git a/db/database.db b/db/database.db index 807e7d8fbfb157ca7702d474d29d0fd3d7afb917..744a41d0775301e3904a8ce2f98244ec9c216221 100644 GIT binary patch delta 133 zcmZozz|^pSX@WH4t%)+ujJGx>eA9DDGqFsxFtso)B~z9wVYh5E53PyzJY@RA;T6G GC;$K&0wpK_ diff --git a/k2/__pycache__/k2cfg.cpython-310.pyc b/k2/__pycache__/k2cfg.cpython-310.pyc index edf744522a395d1bcfc1ee3d6e8b6969f6f22de5..2beef872c54975d3822fbb01ac2cda727a3909ed 100644 GIT binary patch delta 529 zcmZvYO=}ZD7{}+?Y}VN|t4o?>qfP4z8rhh}H-sQ4_(JudMe*buT-MHD#LcG6rmZan zkp%Q6VZcw&izg2OzkuMukC2-PdY9ho^VEYEXPDnS^M78MPt|XsKk$8z;hMa8C-)}) zPuQL8jhZTyWjQxyBM|elBCBI28nPxsycgawn~BB8EUHf@@Ebswap4ElragNZsx>S% z<67lwgDh9Nj!zw$FU1c>?w~nj5~MY<-UsHnv-mpWmsnok1YoqE;MuWuSZqs%)$Nt- zxz#}*>!@s)U+AlBy|dL%bs6h?gqd@HkVvJYqOMSnDq?1*sLj0P^)&tK6*i?s1x;h= z5Fy;Hq@Ttz87BI{QBn^OPK_B zj6R2vk^OHb9igCGq!x6E?9hC7T5xMxIVe|e)b}Z*OFmRn7eMfIFEi|Ub)fnV-(pSGzsSkON6fZ>|TV9`Q=93 aI_v>=1IJXnYr%E$o+R8R+%!+UM}GiDSAom` delta 296 zcmX>lzFw3!pO=@50SM$uJ5o$0@;+mnG4V^YREkiFa0^3}bc#rdD3F$EXJBE7k_~3i z6x%$P@e?ECt;rLZA2W(?E@5$F6cq<*zr|6MT3nEySDacT3FH<@Og_&#ZE^*BxS=NF zEjFM0#FW$`O_m}Nkenz;JxdNyEQ-smG$#it%Ur|*(fOHOi_vPc9EU8(9ve<5Xmnn|y=Qn9T&FUU{-0mxaJB-m=uZviPLTy!e8|l8jrEBe`@~ zWk429?&8uEl>(`h1rh2XLK{SwPd>|K05tUqneQqlO8<315h;RWB4wEan F0|6NlOn(3X diff --git a/k2/__pycache__/k2inst.cpython-310.pyc b/k2/__pycache__/k2inst.cpython-310.pyc index 9d7fa229bbac1c7376604949c3c3c9722904ca5e..4e91ad0e474ec87f955228943a3f688e17a5bb8d 100644 GIT binary patch delta 3339 zcmb7GYiwLc6~1%#?)AQRZLb}B{m9y0+q-_O<2VUvY|@q_l_+frB*C>6d%N}AeK`AY z=HA8eW;dJEZs{w;>9jN^HLYv=A1KU{QA@l>dCv^4hjAa{orX@dFZ02m4q(#e^R0K)W0N6c4_Ui zA=*G2lZ0+NFViO4yd*7>$!@_1Xd`V&$|%t~X)A3*8AyACw0%=bx6`1Q*Q>R!g=oh* zp`El#Fk!)jfa#_^f{6fA3DMql0!G6$a>r<&Q0xQ6emWo&`vo%yOq31@WGxR9$cU4|`wwBeBwWLyY3{=-( zv<~J@?i3ExfCIJYz^q!blw@k7_VcjpRu`yrL;@!!wmN}a#Btap?5~8!d;O1Caa;Jb z0-S@bP1(z&MAl#{l&s5N1IJIwREAj=HVP_?0341G(~{JTYcgwqPg6-7T2{o7$NUYI z`+?IH0Qqb{D)z+Z=CmA*8Tr^kJe!Fn(itr}mdVe=Gy4AMSW?Srr{>sxFlp6|I5WgD zCYgT#m^!K@;)RS6OJwr%G2K|mXptII$%8>tL2IU6k0-QPCLgD!B^y6w+O=Gzkkwe+ z&`hHQb`Iv*ap~Ax+(-cxH{vEqOuDsGY28TYk}+f^ZNi0EnzBalpG_c$`Vi0r zpJx64*v~!?=qPm&A8Bm8tyomjDEnm_aS@kXM>=n_6qlXX$fx{G=a7}nfGYo^Q}28b zC)NQtWQ90no7@C59K=Qx!Whsj%TKvt?nhA#tI}p+1^y@33eou)_o|hR1IL4&(4nux zz*Gvl#_smlnMgC;fDk3qxhb@RTXD$X82p-GDIbx~D)43{e$KPtO`{HG&jmW{47Yoy z$vjVaqol%L_I5SqP_6>lWECv1b1-BE|CP6myuknAeNHiKvrc~6mkcm;`!07_GjM0P zQu`!X;?LGzX<35rYlJ%>b<;;sVA?YAT(S^PY7v)dW7^4rrW?B0ys6CU z`5f!ON%tV+5u6B*Ah;0DB4DMPN>7|Ff^vo*k+@s&J&sc z1}dUwrk%$1)Z_U$qXvJlKCG%ly~URKsrp6o1fD4F^N+&T9`d)TY!W7Xn-~1kk3Wa= zF_8M8_{-%=ev!1e-`C3!R%BDe$zt^M( z(OJ_o$MUn<3>?dRhC;<{ah^{#f6>Y`RKL+2A)J5Q9CWV2r+yefv2Zo;FuB2x21Y$t z_LwLOO8>=I0}m_9q&Uj|7Rc9+Z*63vm!^5HWj6%&YRh@@3%;|poBWeM+IqA?+o5MV zo2APV-M(rmdktmQy4G6qu9IcLb{Y1Pm-=XscAU3daF^{y+gf|czD~-%&n#dcmX?Vg z-P$R09_pl>X}B9V?02ooa8rg}QOZ8rU3MAUORiGIwhDrRr@$JVMQ{!mdV0tB9&{2RCLpRBUGwgB$uUCd0bNA#-JcMQ+wpjd!Eco zk%7b2ihTkiHiL~AqI{y)!T*nZ{~6{$z7uV4)UabXzRVljCn_sAd<9_YSb+Ge0PC-ZEfSie!w4qX^Wv;6t?KYY2H-Cc(029^=~4niBk8i46z@wBc%Au_lg z;zmIirE0psO$G-hXTXimuJRvm-_`J4oHT~87XgnCdySXWriRyXcm*Mb@EAgh2ZIx> z*I*c_s~*wsA-%QKUkdIybR9_3I+H5oPE6Jm({nMVB}DnNw@|$cVA8vB@5Iu%xq`tG zD0&;Add~T$!EoSr@U1@upjfJ>8ZQAGoNtAXb$n^SCwrh%yGZ+O`K+qQFp`P-Z>0t< z3rj#&WydX_5+Js-@@@9+&6SQ7qE^Gj_jYxYSNU{TvSAcTMt8spKIrT|_`xOfJ~z8Q zAjkMyp`ZFT3~wjD&QEt7ZS{)cZ^XAX{9wPy_yTOd`Glj gvDrL6J{4_khoV*Cxz9m7$KmaOcO5(d82dfsKWS+pLI3~& delta 2400 zcma)-TWk|o5Qg`x*Nd?o$K(b{Y$w4^h)Lo&1Sr=+)t6ETmjb0g!I+%Q9owAU5E24` zhHx!~Xec736!HQ>ycDGuK}#i62~g<+>g8osq^fy>0PpQ0!Pd}^-vMmv* z&)@~TxK$;KF_V|@QnI17Qd$EORvzRb=~rchE{A#9DC6b4LMpSQG82_Bk4U9jDwU%Q z_Z+C=v$C5;rCcrLD4(5GXG^t4stJX+0Ce?Z#&#JZZSPlQ&3~oP%H)d^h(qpdl zn8)X5)z}8<^1>vS1$<%FSTAjhCfOGAC0ScsZnso!_aa}GRU0^4uSA!RZBTDdQEd-| z+~@u4G3R0fp@8rj+;!JFoMIz%b@X#M*Yv4D3 zZ|+u{n;OEadYR~iJ=3-`4&P6Uu`bZ^!bLmCt|MHk&TvHvhaw3}^MdRQY|T5V_UrIV zUMq`2+*_)PVl-!?~;3e!LI1%t>;S5g?%_u`+4-6C*mr1J(-Ay7T z!Jf*KX4}qmQt%e|w6NN*G5x97kCwiwdb2Iv19t*32o|kmX*f|FfT5yBCg5gK5LS9U z>=gV^w0(XrZAM2FeYB&NGWJ^X5K&DWB6%O7pKzEUPjC=2(~I+u;oNi~+zuC;K}kI_ z_Wtx=nT!^!J3z|^p8HS+#lh!OS;V(+dY+^~_^$X0+YS3l`u+btkr;w0r4ilM(%453 zFEz{QRJJc8(j7*#m1s$KaqNysr-Uy{S9t8HE$v-KB9pY*U|Jx`4#MI6B%pECG-go*O$$PD=<22-H>LT|%57 z4={&Djf8V>EW9~DjT7~cH|Yq;lY8Jvcz*pQ6m4g7TX(8+%ap$MOhOnf;v%j5fDk5J zCS-ehZ=|~98=RY62u*XV)YUGgF&B*&y6S%F*Gib{p!!UVjWtw`Fn#>) z;bB!J8-~BCS_><%CMNwW`5j*7$FIi3EfBN5)vut~S0H0Oz03KN)U=cb@r%|5R1MzpcAj>4CqsA(ELm|o^% zfoB@t23!N`Yb zsZ8J{SXW!d?!fNapywru6+n|$gOS=&b{9Ub{mAnLt(AKp1*@)encPj5ka|D>K^AkO z-jk!q;!M=)5`&r3NVpe*_5Z? zQGHbng%LLhvV-(V9VDZ^N2Uve%Mgo4JSIgA;T&HY+u}jj0~|)@i0klHym7qn_u;en z`~vw@43nP^VQam~UHI42u!!4J&18#_=t?KKtgmRJMH^|6Q>44;VIW~AVGW^^kRt3S z93hMn#t63vw+VL%_XrPQw4sVwaKE8umCx;F{u~vH?svGE%Y&DOmy;A%xuh<+oak$k QW49dVNtQ^ZK*g^88?2u)O8@`> diff --git a/k2/k2cfg.py b/k2/k2cfg.py index 0c6a5bd..575e13b 100644 --- a/k2/k2cfg.py +++ b/k2/k2cfg.py @@ -53,6 +53,14 @@ class k2(k2obj): with open('languages/babel_translation_directories.yml', 'w') as f: yaml.dump(data, f) + @classmethod + def search_menu_elenents(cls): + with open('components/menu.yml', 'r') as f: + yaml_data = yaml.load(f, Loader=yaml.FullLoader) + cls.menu = yaml_data + + + # load database settings from yml file def init_db_uri(self): @@ -60,9 +68,7 @@ class k2(k2obj): db_config = yaml.load(f, Loader=yaml.FullLoader) return db_config - # creating a connection string - - + # creating a connection def init_db(self, app): db_config = self.init_db_uri() db_uri = f"mysql+{db_config['driver']}://{db_config['user']}:{db_config['password']}@{db_config['host']}/{db_config['dbname']}" @@ -74,4 +80,3 @@ class k2(k2obj): - diff --git a/k2/k2inst.py b/k2/k2inst.py index da81ec6..620363a 100644 --- a/k2/k2inst.py +++ b/k2/k2inst.py @@ -51,11 +51,25 @@ def first_login_required(view_func): @wraps(view_func) def decorated_view(*args, **kwargs): if 'username' not in session: - return redirect(url_for('first_login')) + return redirect(url_for('components.first_login')) return view_func(*args, **kwargs) - return decorated_view +def append_to_yaml_file(file_path, data): + with open(file_path, 'r') as f: + existing_data = yaml.safe_load(f) or [] + + if not existing_data: + start_id = 1 + else: + start_id = max(item.get('id', 0) for item in existing_data) + 1 + + for i, item in enumerate(data, start=start_id): + item['id'] = i + existing_data.append(item) + + with open(file_path, 'w') as f: + yaml.dump(existing_data, f, default_flow_style=False) @components_bp.route('/api/languages', methods=['GET']) def find_language(): @@ -91,7 +105,7 @@ def first_login(): @components_bp.route('/logout') def logout(): session.pop('username', None) # Видалення ім'я користувача з сесії - return redirect(url_for('first_login')) + return redirect(url_for('components.first_login')) @components_bp.route('/change_language/') def change_language(lang): @@ -131,10 +145,9 @@ def dashboard(): return render_template('dashboard.html', components=components, components_names=components_names, component_server=filtered_components, - search_query=search_query, language=current_language ) + search_query=search_query, language=k2.menu ) @components_bp.route('/show_components/') -@first_login_required def show_components(component_id): response = requests.get('http://127.0.0.1:8001/api/components') json_data = response.json() @@ -142,7 +155,6 @@ def show_components(component_id): return render_template('component-info.html', selected_component=selected_component) @components_bp.route('/install_components_git/') -@first_login_required def install_components_git(component_id): # Шлях до головної папки проекту project_folder = 'components' @@ -208,7 +220,6 @@ def install_components_git(component_id): return 'Error installing : ' + str(e) @components_bp.route('/install_components/') -@first_login_required def install_component_from_archive(component_id): # Шлях до головної папки проекту project_folder = 'components' @@ -256,7 +267,7 @@ def install_component_from_archive(component_id): file.write(code) file.write('\n') - # Оновити базу даних з встановленою компонентою + #Update database with the installed component component = Component.query.filter_by(name=selected_component['name']).first() if not component: component = Component( @@ -275,8 +286,23 @@ def install_component_from_archive(component_id): component.installed = True db.session.commit() + # add menu items + file_path_input = f"components/{selected_component['name']}/menu_items.yml" + if os.path.exists(file_path_input): + with open(file_path_input, 'r', encoding='utf-8') as file: + data = yaml.safe_load(file) + else: + data = { + 'url': {'name': 'error'}, + 'icon': 'error', + 'title': f"{selected_component['name']}--error", + 'category': 'error', + } + file_path = 'components/menu.yml' + append_to_yaml_file(file_path, data) + #add language folders k2.search_babel_translation_directories() return f'''Component installed successfully: {selected_component["name"]} v{version} {k2.babel_translation_directories}, @@ -287,7 +313,6 @@ def install_component_from_archive(component_id): return f'Error installing component: {str(e)}' @components_bp.route('/install-requirments/', methods=['GET']) -@first_login_required def install_requirments(selected_component_name): requirements_file = os.path.join('components', selected_component_name, "requirements.txt") if os.path.isfile(requirements_file): @@ -299,7 +324,6 @@ def install_requirments(selected_component_name): @components_bp.route('/install-requirments-components') -@first_login_required def install_requirements_components(): # Откриття файлу requirements_components.txt requirements_file = 'requirements_components.txt' @@ -319,7 +343,6 @@ def install_requirements_components(): @components_bp.route('/remove_dependencies/', methods=['GET']) -@first_login_required def remove_dependencies(component_id): # Знаходимо компоненту за її ID component = Component.query.get(component_id) @@ -347,7 +370,6 @@ def remove_dependencies(component_id): return 'Component successfully turn off ' @components_bp.route('/add_dependencies/', methods=['GET']) -@first_login_required def add_dependencies(component_id): # Знаходимо компоненту за її ID @@ -369,7 +391,6 @@ def add_dependencies(component_id): return 'Dependencies added successfully ' @components_bp.route('/remove-component/') -@first_login_required def remove_component(component_id): # Шлях до головної папки проекту project_folder = 'components' diff --git a/main.py b/main.py index 86dc048..d9b3d8c 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,7 @@ from k2.k2cfg import k2 # configure flask app app = Flask(__name__) app.config['SECRET_KEY'] = k2.secret_key -app.config.from_object(k2) +#app.config.from_object(k2) # init db k2().init_db(app) @@ -19,6 +19,9 @@ app.config['BABEL_TRANSLATION_DIRECTORIES'] = k2.babel_translation_directories babel = Babel(app) babel.init_app(app, locale_selector=k2.get_locale) +#menu +k2.search_menu_elenents() + # flask routing from routes import * -- 1.9.1