From ab41238d1189d608a3d5c42ca16f4c069a116d4c 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: Wed, 5 Jul 2023 13:02:45 +0300 Subject: [PATCH] del sqlite, add yml --- __pycache__/routes.cpython-310.pyc | Bin 289 -> 289 bytes k2/__pycache__/k2cfg.cpython-310.pyc | Bin 3267 -> 3176 bytes k2/__pycache__/k2comp.cpython-310.pyc | Bin 1974 -> 152 bytes k2/__pycache__/k2rout.cpython-310.pyc | Bin 18179 -> 16884 bytes k2/k2rout.py | 151 +++++++++++++++------------- languages/babel_translation_directories.yml | 2 +- 6 files changed, 80 insertions(+), 73 deletions(-) diff --git a/__pycache__/routes.cpython-310.pyc b/__pycache__/routes.cpython-310.pyc index 530d5272314db656f9df11e4d2a61d75c8980fd6..d1a759624de352d25e5c62d4b001f13ce18f9824 100644 GIT binary patch delta 19 ZcmZ3;w2+A_pO=@50SK1ZZ{!kZ1OO*`1DXH; delta 19 ZcmZ3;w2+A_pO=@50SMx4HgbtG0stk=15yA0 diff --git a/k2/__pycache__/k2cfg.cpython-310.pyc b/k2/__pycache__/k2cfg.cpython-310.pyc index e757aa16d592e1951f0e9969bd861f30316399b2..0f219bfaa2385a14362a80e523b5a066278f4e5c 100644 GIT binary patch delta 148 zcmX>s`9gv>pO=@50SHoTm!`bi$a{jFj|Ir%24ZI*E{>S|nB7~bh9Qe-0do!GLPkc0 z6oz01O`gdS9ARdfEJgZ2MYq_J^YhX&({C}QB;Df3%*!l^Pb??^N(zD`nStygJs>NJ lEhQ`Elqi|k@o~UA1jc@4aCksTwE~uF}t@`3QsLd3U3Nu4a;nX zxlEaiHH=w|Df~7JH4Iry3z%yd7cw$3q%Z_CXbMbr;0QCT64cYvPf5~GNi0cBN-R#* zOG%1iPDwJV;wmo8$t+2=(%09I5(p0TarANaaP^Ihck=Xe37$NSLr#&kNDyf4E#}06 yf+9U2D~c^8DZaEQGm0HZ7bKQsOg_UQE5HMk;b1glB?HWi(3w diff --git a/k2/__pycache__/k2comp.cpython-310.pyc b/k2/__pycache__/k2comp.cpython-310.pyc index 12e3b65321e4b4dd19aeb96401a835a87fae9d1e..e586edbbf28fa5e776201629fd4b9521a2eb47c9 100644 GIT binary patch delta 97 zcmdnSKZDUZpO=@50SHoTm!>$gF)%y^agYHckmCTv#VkM~g&~+hlhJP_LlHA>v6rY*>ybn8x<2VEYF%WPLf)$yF0-^}v2r8^d3C+rAwZ0i&_Pn?2%*-XR zb*W-RC{j=(B)g#Se?q}uFfG;9DUhi6y*;1fgk(6uo%g+0&CE0z*7NWW`A@*u z-^83;KA5lZm|FnJBrjM(yD0d8C!90sNxu*SFY!22Uf)lA8OU&tCBb)0Ml#-GGFE;+ zeBvdM`vIAZ*2ar?+p#Vgnl1q%#B&ypxd`a75&NZ`6b>su?js_csmRJR&zFK_R-=8YmZmbjaAnIR7^vfWElGqAFJ zqo}%BVQzw$>S~HgQ=&Sd^M}J+x`6Py^X{of&hJ-w=>naVJ>|SYm9?i6XwjQ(fNPyF zLRm2s?i|0&^*o6Gl?A;r>5IQWD3%~yiI6<;q(BFt7&%V@74{<)?#D7X;L=wO89wup z=J9ES(^xj1iKGRsiDvTvB}>}Je5>YXj`@jvcEa~#=$@L~*FUY!^yg$7x1BvYnaAzK zpOZ6k79F`DPs!8R&#SlO89BFy_DC*(K0Br5JPLizHC9o9s#K+Qp4?b*4XVh5Kcya7 zRmxO7Lh|#ncXxal@uMeN+d3a)dMDjdJ1&xHGaD9mEFt`sI=vhgMYd6>@t-&uQ${;n zzk{tyWt%RdsphMA%oPCokfm%SfPCZu#mEPGqX6iSLSP`-9d^jqsPttvP_8AF>FRvj z=2hvU2WUki;$CjkA}_aGTdHk@pvrEpjBDhju~|_l*@>KQRI#bwhhhBz!G{DCp#F&9 zV*+Z-3Dj*9r)gf|>U06;hK@o${WbaS+;J+Gr;0DlAayRaQXMf}ArWz({f4>5&ar#H z2Plfaw%adMltzjSqRX;&T5anzeHX%drWRgtY$EPb>Zi*C zK@&iZJzoS^xU(;;cfj|3>-B>X-x8q11NK;q@PW{zbQn1yH(X?tsk0v3A1b}0&q3tE z&AhNmJ3-^QnQLPYz1rU-gnjyeoQK-0&d>LhO(CyLZY#9c#tt+uLGd|xcTxC!_r2r9 zEWb|qjbZ6e$lfBsrvxhmFPB$;jx$QFz7AOHyzNkL>asL-%`_cUa##@EPSg9ttT>W@ z+sH8_7zM~?($rGx9|>oV*fi5UlcxGAE_UH+RSXBE3-4Hssj5FY`Wo4NQ!~2w7QVZ8 z@#mqbY%UzyZdpA{X6Zi#EqT<`F8Zdb3YC?U=B1g^9nx=gi_DmTviB-kM|mRhItSFs zb>SKy3=KideD3p@FYtMOy8gBK9QIhmkq}KTyjfnq(TVjeyj$A8Ht diff --git a/k2/__pycache__/k2rout.cpython-310.pyc b/k2/__pycache__/k2rout.cpython-310.pyc index 1bd89a54cd9299103c57b467f415b42038efb402..cad9456fce5fff5338b2c358ac89f9432b45a4d5 100644 GIT binary patch delta 5115 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') -def install_components_git(component_id): - # Шлях до головної папки проекту - project_folder = 'components' - # component = Component.get_repository_by_id(component_id) - response = requests.get(f'{k2.update_domain}api/components') - json_data = response.json() - selected_component = next((component for component in json_data if component['id'] == component_id), None) - # Назва репозиторія - repository_name = selected_component['name'] - # Шлях до папки репозиторія в межах проекту - repository_folder = os.path.join(project_folder, repository_name) - # URL репозиторія - - git_repo_url = selected_component['git_link'] - try: - # Перевірка наявності папки репозиторія - if not os.path.exists(repository_folder): - # Створення папки репозиторія - os.makedirs(repository_folder) - # Шлях до файлу __init__.py - init_file = os.path.join(repository_folder, '__init__.py') - # Перевірка наявності файлу __init__.py - if not os.path.exists(init_file): - # Створення пустого файлу __init__.py - open(init_file, 'a').close() - # підключення до приватного репозиторію - # os.environ['GITLAB_PRIVATE_TOKEN'] = '8xxTpxrKVDGoXD5ynjiW' - # git_repo_url_with_token = git_repo_url.replace('https://', - # f'https://oauth2:{os.environ["GITLAB_PRIVATE_TOKEN"]}@') - - # Команда для встановлення з використанням git_repo_url і повного шляху до папки репозиторія - command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url, - '--target=' + repository_folder] - # Виконуємо команду встановлення - subprocess.check_call(command) - - # Шлях до файлу, до якого потрібно додати код - file_path = 'routes.py' - # Код, який потрібно додати - code = selected_component['dependencies'] - # Відкриття файлу у режимі дозапису - with open(file_path, 'a') as file: - # Запис нового коду у файл - file.write('\n') - file.write(code) - file.write('\n') - component = Component.query.filter_by(name=selected_component['name']).first() - if not component: - new_component = Component( - name=selected_component['name'], - description=selected_component['description'], - version=selected_component['version'], - git_link=selected_component['git_link'], - dependencies=selected_component['dependencies'], - installed=True - ) - # Add the new component to the database - db.session.add(new_component) - db.session.commit() - - # Повертаємо повідомлення про успішне встановлення - return f'Installed successfully ' - except subprocess.CalledProcessError as e: - return 'Error installing : ' + str(e) +# @components_bp.route('/install_components_git/') +# def install_components_git(component_id): +# # Шлях до головної папки проекту +# project_folder = 'components' +# # component = Component.get_repository_by_id(component_id) +# response = requests.get(f'{k2.update_domain}api/components') +# json_data = response.json() +# selected_component = next((component for component in json_data if component['id'] == component_id), None) +# # Назва репозиторія +# repository_name = selected_component['name'] +# # Шлях до папки репозиторія в межах проекту +# repository_folder = os.path.join(project_folder, repository_name) +# # URL репозиторія +# +# git_repo_url = selected_component['git_link'] +# try: +# # Перевірка наявності папки репозиторія +# if not os.path.exists(repository_folder): +# # Створення папки репозиторія +# os.makedirs(repository_folder) +# # Шлях до файлу __init__.py +# init_file = os.path.join(repository_folder, '__init__.py') +# # Перевірка наявності файлу __init__.py +# if not os.path.exists(init_file): +# # Створення пустого файлу __init__.py +# open(init_file, 'a').close() +# # підключення до приватного репозиторію +# # os.environ['GITLAB_PRIVATE_TOKEN'] = '8xxTpxrKVDGoXD5ynjiW' +# # git_repo_url_with_token = git_repo_url.replace('https://', +# # f'https://oauth2:{os.environ["GITLAB_PRIVATE_TOKEN"]}@') +# +# # Команда для встановлення з використанням git_repo_url і повного шляху до папки репозиторія +# command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url, +# '--target=' + repository_folder] +# # Виконуємо команду встановлення +# subprocess.check_call(command) +# +# # Шлях до файлу, до якого потрібно додати код +# file_path = 'routes.py' +# # Код, який потрібно додати +# code = selected_component['dependencies'] +# # Відкриття файлу у режимі дозапису +# with open(file_path, 'a') as file: +# # Запис нового коду у файл +# file.write('\n') +# file.write(code) +# file.write('\n') +# component = Component.query.filter_by(name=selected_component['name']).first() +# if not component: +# new_component = Component( +# name=selected_component['name'], +# description=selected_component['description'], +# version=selected_component['version'], +# git_link=selected_component['git_link'], +# dependencies=selected_component['dependencies'], +# installed=True +# ) +# # Add the new component to the database +# db.session.add(new_component) +# db.session.commit() +# +# # Повертаємо повідомлення про успішне встановлення +# return f'Installed successfully ' +# except subprocess.CalledProcessError as e: +# return 'Error installing : ' + str(e) @components_bp.route('/install_components/') diff --git a/languages/babel_translation_directories.yml b/languages/babel_translation_directories.yml index ec0c8d4..33b21b3 100644 --- a/languages/babel_translation_directories.yml +++ b/languages/babel_translation_directories.yml @@ -1 +1 @@ -babel_translation_directories: languages +babel_translation_directories: languages;components/k2site/k2site/languages;components/k2adm/k2adm/languages -- 1.9.1