diff --git a/__pycache__/routes.cpython-310.pyc b/__pycache__/routes.cpython-310.pyc index 3f1667f21d3d1d9666a0a92eaad94798b7d1d458..30f4064e70a28815ab36043698f1955b5cf5b4bf 100644 GIT binary patch delta 80 zcmX@f@}HSEpO=@50SK14^ry_8$SccOGEuvPl`EJ*lY8R62xdP`?#XJ5Q#e;L6mbJp a6>(2~#ONy~1Z46s@-T7%F&`8QF#-S#GY@P4 delta 153 zcmey*e3FGXpO=@50SNTe`%}J8nTn)*45@Sw=y-hGB(gNFfuhWG~Aq{>+hsMNb}~~`Kk&4q0A%# delta 121 zcmZozz|^pSX@WFk_Cy(H#_Wv={W{8=jn;-H$%aOWDP}1qi9lqUXpxv`Zj_pmY@TLe uW?__^IC;CC;$&l8Z9Y>g6LTw53q5mFGYdnb%{jXMP6~uHZ@!(cssI3{>Lf@2 diff --git a/k2/__pycache__/k2rout.cpython-310.pyc b/k2/__pycache__/k2rout.cpython-310.pyc index 90398a8c1ebbf74d96f87d6e416c4e07d3a25b4e..70c1c4abb2bf6a02930c16ea412340bf6b594c92 100644 GIT binary patch delta 5156 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') def show_components(component_id): @@ -154,11 +142,12 @@ def show_components(component_id): selected_component = next((component for component in json_data if component['id'] == component_id), None) return render_template('component-info.html', selected_component=selected_component) + @components_bp.route('/install_components_git/') def install_components_git(component_id): # Шлях до головної папки проекту project_folder = 'components' - #component = Component.get_repository_by_id(component_id) + # 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) @@ -180,13 +169,14 @@ def install_components_git(component_id): 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://', + # підключення до приватного репозиторію + # 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] + command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url, + '--target=' + repository_folder] # Виконуємо команду встановлення subprocess.check_call(command) @@ -200,16 +190,16 @@ def install_components_git(component_id): file.write('\n') file.write(code) file.write('\n') - component = Component.query.filter_by(name=selected_component['name']).first() + 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 - ) + 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() @@ -219,6 +209,7 @@ def install_components_git(component_id): except subprocess.CalledProcessError as e: return 'Error installing : ' + str(e) + @components_bp.route('/install_components/') def install_component_from_archive(component_id): # Шлях до головної папки проекту @@ -258,7 +249,7 @@ def install_component_from_archive(component_id): file_path = 'routes.py' # Код, який потрібно додати code = f'''from components.{selected_component['name']}.{selected_component['name']}.views import {selected_component['name']}\napp.register_blueprint({selected_component['name']}, url_prefix='/{selected_component['name']}')''' - #selected_component['dependencies'] + # selected_component['dependencies'] # Відкриття файлу у режимі дозапису with open(file_path, 'a') as file: @@ -267,7 +258,7 @@ def install_component_from_archive(component_id): file.write(code) file.write('\n') - #Update database with the installed component + # Update database with the installed component component = Component.query.filter_by(name=selected_component['name']).first() if not component: component = Component( @@ -287,7 +278,7 @@ def install_component_from_archive(component_id): db.session.commit() - #add language folders + # add language folders k2.search_babel_translation_directories() return f'''Component installed successfully: {selected_component["name"]} v{version} {k2.babel_translation_directories}, \n \n please wait installing requirments... @@ -296,12 +287,13 @@ def install_component_from_archive(component_id): except Exception as e: return f'Error installing component: {str(e)}' + @components_bp.route('/install-requirments/', methods=['GET']) def install_requirments(selected_component_name): - #menu items + # menu items get_admin_menu() - #install requirements + # install requirements requirements_file = os.path.join('components', selected_component_name, "requirements.txt") if os.path.isfile(requirements_file): pip_command = f"{k2.venv_bin_path}/python -m pip install -r {requirements_file}" @@ -310,6 +302,7 @@ def install_requirments(selected_component_name): \n \n please wait installing requirments components... ''' + @components_bp.route('/install-requirments-components') def install_requirements_components(): # Откриття файлу requirements_components.txt @@ -326,7 +319,8 @@ def install_requirements_components(): return f'Requirements components installed successfully ' else: return f'' - # Опрацювання відповіді (за потреби) + # Опрацювання відповіді (за потреби) + @components_bp.route('/remove_dependencies/', methods=['GET']) def remove_dependencies(component_id): @@ -334,10 +328,10 @@ def remove_dependencies(component_id): component = Component.query.get(component_id) if not component: return 'Component not found ' - #remove menu items - component_name = component.name - #file_path = "components/menu.yml" - #remove_from_yaml_file(file_path, component_name) + # remove menu items + component_name = component.name + # file_path = "components/menu.yml" + # remove_from_yaml_file(file_path, component_name) requests.get(f"{k2.domain}api/add-to-menu") # remove routes file_path = 'routes.py' @@ -353,9 +347,9 @@ def remove_dependencies(component_id): return 'Component successfully turn off ' + @components_bp.route('/add_dependencies/', methods=['GET']) def add_dependencies(component_id): - # Знаходимо компоненту за її ID component = Component.query.get(component_id) if not component: @@ -373,6 +367,7 @@ def add_dependencies(component_id): db.session.commit() return 'Dependencies added successfully ' + @components_bp.route('/remove-component/') def remove_component(component_id): # Шлях до головної папки проекту @@ -398,7 +393,80 @@ def remove_component(component_id): # Повертаємо повідомлення про помилку видалення return 'Error removing component: ' + str(e) + + + +@components_bp.route('/component/add') +def component_add(): + # components for install + try: + # GET-requests to API + response = requests.get(f'{k2.update_domain}api/components') + json_data = response.json() + for item in json_data: + item['button'] = f"{k2.domain}/install_components/{item['id']}" + + except: + json_data = None + return jsonify(json_data) + + +@components_bp.route('/component/list') +def component_list(): + # Встановлені компоненти + component_list = [] + components = Component.query.all() + for component in components: + component_dict = {} + component_dict['name'] = component.name + component_dict['id'] = component.id + component_dict['description'] = component.description + component_dict['version'] = component.version + component_dict['button_off'] =f"{k2.domain}/remove_dependencies/{component.id}" + component_dict['button_on'] = f"{k2.domain}/add_dependencies/{component.id}" + component_dict['button_del'] = f"{k2.domain}/remove-component/{component.id}" + component_list.append(component_dict) + return jsonify(component_list) + +# menu +@components_bp.route('/api/add-to-menu', methods=['GET']) +def add_to_menu(): + data = [] + response = requests.get(f"{k2.domain}/menu-admin-items") + data.append(response.json()[0]) + components = Component.query.all() + components_names = [component.name for component in components] + for components_names in components_names: + response = requests.get(f"{k2.domain}{components_names}/menu-admin-items") + print(response) + if response.status_code == 200: + data.append(response.json()[0]) + else: + data + # add component_name key for menu items + for item in data: + item['component_name'] = components_names + k2.menu = data + return k2.menu + + @components_bp.route('/api/main-menu/') def get_admin_menu(): requests.get(f"{k2.domain}api/add-to-menu") return k2.menu + + +@components_bp.route('/menu-admin-items') +def menu_items(): + menu = [ + { + "title": 'Add components', + "icon": {"icon": 'mdi-account-circle-outline'}, + "children": [ + {'title': 'Install components', 'to': 'component-add'}, + {'title': 'Installed components', 'to': 'component-list'}, + + ], + }] + return menu + diff --git a/routes.py b/routes.py index bbe2d92..1251a2e 100644 --- a/routes.py +++ b/routes.py @@ -8,6 +8,3 @@ from components.grid.grid.views import grid app.register_blueprint(grid, url_prefix='/grid') from components.vue.vue.views import vue2 app.register_blueprint(vue2, url_prefix='/') - -from components.adm.adm.views import adm -app.register_blueprint(adm, url_prefix='/adm')