Commit ab41238d1189d608a3d5c42ca16f4c069a116d4c

Authored by Василь Свідрик
1 parent f7116fe57a
Exists in master

del sqlite, add yml

Showing 6 changed files with 80 additions and 73 deletions Inline Diff

__pycache__/routes.cpython-310.pyc
No preview for this file type
k2/__pycache__/k2cfg.cpython-310.pyc
No preview for this file type
k2/__pycache__/k2comp.cpython-310.pyc
No preview for this file type
k2/__pycache__/k2rout.cpython-310.pyc
No preview for this file type
1 import zipfile 1 import zipfile
2 from flask import Flask, Blueprint, jsonify, render_template, redirect, url_for, session, jsonify 2 from flask import Flask, Blueprint, jsonify, render_template, redirect, url_for, session, jsonify
3 import os 3 import os
4 import shutil 4 import shutil
5 from flask import request 5 from flask import request
6 from .k2cfg import k2 6 from .k2cfg import k2
7 from .k2comp import Component 7 #from .k2comp import Component
8 from flask_migrate import Migrate 8 from flask_migrate import Migrate
9 import requests 9 import requests
10 import subprocess 10 import subprocess
11 from flask import current_app 11 from flask import current_app
12 import yaml 12 import yaml
13 from functools import wraps 13 from functools import wraps
14 import os 14 import os
15 import sys 15 import sys
16 from .k2admmenu import K2admin_menus, K2admin_Menus_Prava 16 from .k2admmenu import K2admin_menus, K2admin_Menus_Prava
17 from sqlalchemy import text 17 from sqlalchemy import text
18 from flask_jwt_extended import get_jwt_identity, jwt_required 18 from flask_jwt_extended import get_jwt_identity, jwt_required
19 from flask_login import login_user, current_user, logout_user, login_required 19 from flask_login import login_user, current_user, logout_user, login_required
20 import platform 20 import platform
21 import uuid 21 import uuid
22 22
23 23
24 24
25 # initialize db 25 # initialize db
26 # migrate = Migrate(app, db) 26 # migrate = Migrate(app, db)
27 27
28 components_bp = Blueprint('components', __name__, template_folder='templates') 28 components_bp = Blueprint('components', __name__, template_folder='templates')
29 config = yaml.safe_load(open("db/first-login.yml")) 29 config = yaml.safe_load(open("db/first-login.yml"))
30 30
31 db = k2.db 31 db = k2.db
32 32
33 def generate_id(): 33 def generate_id():
34 generated_id = uuid.uuid4().hex[:32] 34 generated_id = uuid.uuid4().hex[:32]
35 return ''.join([generated_id[i:i + 4] for i in range(0, len(generated_id), 4)]) 35 return ''.join([generated_id[i:i + 4] for i in range(0, len(generated_id), 4)])
36 36
37 def first_login_required(view_func): 37 def first_login_required(view_func):
38 @wraps(view_func) 38 @wraps(view_func)
39 def decorated_view(*args, **kwargs): 39 def decorated_view(*args, **kwargs):
40 if 'username' not in session: 40 if 'username' not in session:
41 return redirect(url_for('components.first_login')) 41 return redirect(url_for('components.first_login'))
42 return view_func(*args, **kwargs) 42 return view_func(*args, **kwargs)
43 43
44 return decorated_view 44 return decorated_view
45 45
46 # def append_to_yaml_file(file_path, data): 46 # def append_to_yaml_file(file_path, data):
47 # with open(file_path, 'r') as f: 47 # with open(file_path, 'r') as f:
48 # existing_data = yaml.safe_load(f) or [] 48 # existing_data = yaml.safe_load(f) or []
49 # 49 #
50 # if not existing_data: 50 # if not existing_data:
51 # start_id = 1 51 # start_id = 1
52 # else: 52 # else:
53 # start_id = max(item.get('id', 0) for item in existing_data) + 1 53 # start_id = max(item.get('id', 0) for item in existing_data) + 1
54 # 54 #
55 # for i, item in enumerate(data, start=start_id): 55 # for i, item in enumerate(data, start=start_id):
56 # item['id'] = i 56 # item['id'] = i
57 # existing_data.append(item) 57 # existing_data.append(item)
58 # 58 #
59 # with open(file_path, 'w') as f: 59 # with open(file_path, 'w') as f:
60 # yaml.dump(existing_data, f, default_flow_style=False) 60 # yaml.dump(existing_data, f, default_flow_style=False)
61 61
62 def remove_from_yaml_file(file_path, component_name): 62 def remove_from_yaml_file(file_path, component_name):
63 with open(file_path, 'r') as f: 63 with open(file_path, 'r') as f:
64 existing_data = yaml.safe_load(f) or [] 64 existing_data = yaml.safe_load(f) or []
65 65
66 updated_data = [item for item in existing_data if item.get('component_name') != component_name] 66 updated_data = [item for item in existing_data if item.get('component_name') != component_name]
67 67
68 with open(file_path, 'w') as f: 68 with open(file_path, 'w') as f:
69 yaml.dump(updated_data, f, default_flow_style=False) 69 yaml.dump(updated_data, f, default_flow_style=False)
70 70
71 71
72 @components_bp.route('/api/languages', methods=['GET']) 72 @components_bp.route('/api/languages', methods=['GET'])
73 def find_language(): 73 def find_language():
74 components = Component.query.all() 74 project_folder = 'components'
75 # Зчитати вміст файлу YAML
76 with open(f"{project_folder}/components.yml", 'r') as file:
77 components_data = yaml.safe_load(file)
78
75 languages_paths = [] 79 languages_paths = []
80
76 # Додаємо головну директорію languages 81 # Додаємо головну директорію languages
77 languages_paths.append('languages') 82 languages_paths.append('languages')
78 # Знаходимо шляхи до директорій languages всередині папки components 83
79 for component in components: 84 # Знаходимо шляхи до директорій languages для кожного компонента з даних YAML
80 component_languages_directory = 'components/' + component.name + '/' + component.name + '/languages' 85 if components_data is not None:
81 languages_paths.append(component_languages_directory) 86 for component in components_data['components']:
87 component_languages_directory = f"components/{component['name']}/{component['name']}/languages"
88 languages_paths.append(component_languages_directory)
89
82 result = ';'.join(languages_paths) 90 result = ';'.join(languages_paths)
83 print(result)
84 return result 91 return result
85 92
86 93
87 @components_bp.route('/', methods=['GET', 'POST']) 94 @components_bp.route('/', methods=['GET', 'POST'])
88 def home(): 95 def home():
89 96
90 components_folder = 'components' 97 components_folder = 'components'
91 98
92 with open(f"{components_folder}/components.yml", 'r') as file: 99 with open(f"{components_folder}/components.yml", 'r') as file:
93 components_data = yaml.safe_load(file) 100 components_data = yaml.safe_load(file)
94 101
95 if components_data is None: 102 if components_data is None:
96 return redirect('/dashboard') 103 return redirect('/dashboard')
97 104
98 k2site_component = next( 105 k2site_component = next(
99 (comp for comp in components_data['components'] if comp['name'] == 'k2site' and comp.get('installed', False)), 106 (comp for comp in components_data['components'] if comp['name'] == 'k2site' and comp.get('installed', False)),
100 None) 107 None)
101 if k2site_component: 108 if k2site_component:
102 return redirect(url_for('k2site.main_page')) # 109 return redirect(url_for('k2site.main_page')) #
103 else: 110 else:
104 return redirect('/dashboard') 111 return redirect('/dashboard')
105 112
106 113
107 114
108 @components_bp.route('/first-login', methods=['GET', 'POST']) 115 @components_bp.route('/first-login', methods=['GET', 'POST'])
109 def first_login(): 116 def first_login():
110 if request.method == "POST": 117 if request.method == "POST":
111 username = request.form.get("username") 118 username = request.form.get("username")
112 password = request.form.get("password") 119 password = request.form.get("password")
113 for user in config["users"]: 120 for user in config["users"]:
114 if user["username"] == username and user["password"] == password: 121 if user["username"] == username and user["password"] == password:
115 session['username'] = username # Збереження ім'я користувача в сесії 122 session['username'] = username # Збереження ім'я користувача в сесії
116 return redirect(url_for('components.dashboard')) 123 return redirect(url_for('components.dashboard'))
117 return "Невірне ім'я користувача або пароль." 124 return "Невірне ім'я користувача або пароль."
118 return render_template('first-login.html') 125 return render_template('first-login.html')
119 126
120 127
121 @components_bp.route('/change_language/<lang>') 128 @components_bp.route('/change_language/<lang>')
122 def change_language(lang): 129 def change_language(lang):
123 session['lang'] = lang 130 session['lang'] = lang
124 k2.current_language = lang 131 k2.current_language = lang
125 return redirect(request.referrer) 132 return redirect(request.referrer)
126 133
127 134
128 @components_bp.route('/dashboard') 135 @components_bp.route('/dashboard')
129 def dashboard(): 136 def dashboard():
130 #components = Component.query.all() 137 #components = Component.query.all()
131 with open(f"components/components.yml", 'r') as file: 138 with open(f"components/components.yml", 'r') as file:
132 components_data = yaml.safe_load(file) 139 components_data = yaml.safe_load(file)
133 if components_data is None or 'components' not in components_data: 140 if components_data is None or 'components' not in components_data:
134 components = [] 141 components = []
135 else: 142 else:
136 components = components_data['components'] 143 components = components_data['components']
137 components_names = [] 144 components_names = []
138 components_names = [component['name'] for component in components] 145 components_names = [component['name'] for component in components]
139 k2site_component = next( 146 k2site_component = next(
140 (comp for comp in components_data['components'] if comp['name'] == 'k2site' and comp.get('installed', False)), 147 (comp for comp in components_data['components'] if comp['name'] == 'k2site' and comp.get('installed', False)),
141 None) 148 None)
142 if k2site_component: 149 if k2site_component:
143 return redirect(url_for('components.component_list_dasb')) 150 return redirect(url_for('components.component_list_dasb'))
144 else: 151 else:
145 # Компоненти доступні для встановлення 152 # Компоненти доступні для встановлення
146 # GET-запит до API 153 # GET-запит до API
147 try: 154 try:
148 response = requests.get(f'{k2.update_domain}api/components') 155 response = requests.get(f'{k2.update_domain}api/components')
149 json_data = response.json() 156 json_data = response.json()
150 # Перетворення JSON-об'єкту на масив 157 # Перетворення JSON-об'єкту на масив
151 component_server = [item for item in json_data] 158 component_server = [item for item in json_data]
152 except: 159 except:
153 component_server = None 160 component_server = None
154 161
155 # Встановлені компоненти 162 # Встановлені компоненти
156 #components = Component.query.all() 163 #components = Component.query.all()
157 #components_names = [component.name for component in components] 164 #components_names = [component.name for component in components]
158 # Отримання значення пошукового запиту з параметрів URL 165 # Отримання значення пошукового запиту з параметрів URL
159 search_query = request.args.get('search_query') 166 search_query = request.args.get('search_query')
160 # print(search_query) 167 # print(search_query)
161 filtered_components = [] 168 filtered_components = []
162 if search_query: 169 if search_query:
163 filtered_components = [component for component in component_server if 170 filtered_components = [component for component in component_server if
164 (search_query.lower() in component['name'].lower() if component['name'] else False) or 171 (search_query.lower() in component['name'].lower() if component['name'] else False) or
165 (search_query.lower() in component['description'].lower() if component[ 172 (search_query.lower() in component['description'].lower() if component[
166 'description'] else False)] 173 'description'] else False)]
167 else: 174 else:
168 filtered_components = component_server 175 filtered_components = component_server
169 current_language = k2.current_language 176 current_language = k2.current_language
170 177
171 return render_template('dashboard.html', components=components, 178 return render_template('dashboard.html', components=components,
172 components_names=components_names, component_server=filtered_components, 179 components_names=components_names, component_server=filtered_components,
173 search_query=search_query, language=current_language) 180 search_query=search_query, language=current_language)
174 181
175 182
176 @components_bp.route('/show_components/<string:component_id>') 183 @components_bp.route('/show_components/<string:component_id>')
177 def show_components(component_id): 184 def show_components(component_id):
178 response = requests.get(f'{k2.update_domain}api/components') 185 response = requests.get(f'{k2.update_domain}api/components')
179 json_data = response.json() 186 json_data = response.json()
180 selected_component = next((component for component in json_data if component['id'] == component_id), None) 187 selected_component = next((component for component in json_data if component['id'] == component_id), None)
181 return render_template('component-info.html', selected_component=selected_component) 188 return render_template('component-info.html', selected_component=selected_component)
182 189
183 190
184 @components_bp.route('/show_components-site/<string:component_id>') 191 @components_bp.route('/show_components-site/<string:component_id>')
185 def show_components_site(component_id): 192 def show_components_site(component_id):
186 response = requests.get(f'{k2.update_domain}api/components') 193 response = requests.get(f'{k2.update_domain}api/components')
187 json_data = response.json() 194 json_data = response.json()
188 selected_component = next((component for component in json_data if component['id'] == component_id), None) 195 selected_component = next((component for component in json_data if component['id'] == component_id), None)
189 return render_template('component-info-site.html', selected_component=selected_component) 196 return render_template('component-info-site.html', selected_component=selected_component)
190 197
191 198
192 @components_bp.route('/install_components_git/<string:component_id>') 199 # @components_bp.route('/install_components_git/<string:component_id>')
193 def install_components_git(component_id): 200 # def install_components_git(component_id):
194 # Шлях до головної папки проекту 201 # # Шлях до головної папки проекту
195 project_folder = 'components' 202 # project_folder = 'components'
196 # component = Component.get_repository_by_id(component_id) 203 # # component = Component.get_repository_by_id(component_id)
197 response = requests.get(f'{k2.update_domain}api/components') 204 # response = requests.get(f'{k2.update_domain}api/components')
198 json_data = response.json() 205 # json_data = response.json()
199 selected_component = next((component for component in json_data if component['id'] == component_id), None) 206 # selected_component = next((component for component in json_data if component['id'] == component_id), None)
200 # Назва репозиторія 207 # # Назва репозиторія
201 repository_name = selected_component['name'] 208 # repository_name = selected_component['name']
202 # Шлях до папки репозиторія в межах проекту 209 # # Шлях до папки репозиторія в межах проекту
203 repository_folder = os.path.join(project_folder, repository_name) 210 # repository_folder = os.path.join(project_folder, repository_name)
204 # URL репозиторія 211 # # URL репозиторія
205 212 #
206 git_repo_url = selected_component['git_link'] 213 # git_repo_url = selected_component['git_link']
207 try: 214 # try:
208 # Перевірка наявності папки репозиторія 215 # # Перевірка наявності папки репозиторія
209 if not os.path.exists(repository_folder): 216 # if not os.path.exists(repository_folder):
210 # Створення папки репозиторія 217 # # Створення папки репозиторія
211 os.makedirs(repository_folder) 218 # os.makedirs(repository_folder)
212 # Шлях до файлу __init__.py 219 # # Шлях до файлу __init__.py
213 init_file = os.path.join(repository_folder, '__init__.py') 220 # init_file = os.path.join(repository_folder, '__init__.py')
214 # Перевірка наявності файлу __init__.py 221 # # Перевірка наявності файлу __init__.py
215 if not os.path.exists(init_file): 222 # if not os.path.exists(init_file):
216 # Створення пустого файлу __init__.py 223 # # Створення пустого файлу __init__.py
217 open(init_file, 'a').close() 224 # open(init_file, 'a').close()
218 # підключення до приватного репозиторію 225 # # підключення до приватного репозиторію
219 # os.environ['GITLAB_PRIVATE_TOKEN'] = '8xxTpxrKVDGoXD5ynjiW' 226 # # os.environ['GITLAB_PRIVATE_TOKEN'] = '8xxTpxrKVDGoXD5ynjiW'
220 # git_repo_url_with_token = git_repo_url.replace('https://', 227 # # git_repo_url_with_token = git_repo_url.replace('https://',
221 # f'https://oauth2:{os.environ["GITLAB_PRIVATE_TOKEN"]}@') 228 # # f'https://oauth2:{os.environ["GITLAB_PRIVATE_TOKEN"]}@')
222 229 #
223 # Команда для встановлення з використанням git_repo_url і повного шляху до папки репозиторія 230 # # Команда для встановлення з використанням git_repo_url і повного шляху до папки репозиторія
224 command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url, 231 # command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url,
225 '--target=' + repository_folder] 232 # '--target=' + repository_folder]
226 # Виконуємо команду встановлення 233 # # Виконуємо команду встановлення
227 subprocess.check_call(command) 234 # subprocess.check_call(command)
228 235 #
229 # Шлях до файлу, до якого потрібно додати код 236 # # Шлях до файлу, до якого потрібно додати код
230 file_path = 'routes.py' 237 # file_path = 'routes.py'
231 # Код, який потрібно додати 238 # # Код, який потрібно додати
232 code = selected_component['dependencies'] 239 # code = selected_component['dependencies']
233 # Відкриття файлу у режимі дозапису 240 # # Відкриття файлу у режимі дозапису
234 with open(file_path, 'a') as file: 241 # with open(file_path, 'a') as file:
235 # Запис нового коду у файл 242 # # Запис нового коду у файл
236 file.write('\n') 243 # file.write('\n')
237 file.write(code) 244 # file.write(code)
238 file.write('\n') 245 # file.write('\n')
239 component = Component.query.filter_by(name=selected_component['name']).first() 246 # component = Component.query.filter_by(name=selected_component['name']).first()
240 if not component: 247 # if not component:
241 new_component = Component( 248 # new_component = Component(
242 name=selected_component['name'], 249 # name=selected_component['name'],
243 description=selected_component['description'], 250 # description=selected_component['description'],
244 version=selected_component['version'], 251 # version=selected_component['version'],
245 git_link=selected_component['git_link'], 252 # git_link=selected_component['git_link'],
246 dependencies=selected_component['dependencies'], 253 # dependencies=selected_component['dependencies'],
247 installed=True 254 # installed=True
248 ) 255 # )
249 # Add the new component to the database 256 # # Add the new component to the database
250 db.session.add(new_component) 257 # db.session.add(new_component)
251 db.session.commit() 258 # db.session.commit()
252 259 #
253 # Повертаємо повідомлення про успішне встановлення 260 # # Повертаємо повідомлення про успішне встановлення
254 return f'Installed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 261 # return f'Installed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
255 except subprocess.CalledProcessError as e: 262 # except subprocess.CalledProcessError as e:
256 return 'Error installing : ' + str(e) 263 # return 'Error installing : ' + str(e)
257 264
258 265
259 @components_bp.route('/install_components/<string:component_id>') 266 @components_bp.route('/install_components/<string:component_id>')
260 def install_component_from_archive(component_id): 267 def install_component_from_archive(component_id):
261 # Шлях до головної папки проекту 268 # Шлях до головної папки проекту
262 project_folder = 'components' 269 project_folder = 'components'
263 # Отримати відповідну компоненту зі списку компонент 270 # Отримати відповідну компоненту зі списку компонент
264 response = requests.get(f'{k2.update_domain}api/components') 271 response = requests.get(f'{k2.update_domain}api/components')
265 json_data = response.json() 272 json_data = response.json()
266 selected_component = next((component for component in json_data if component['id'] == component_id), None) 273 selected_component = next((component for component in json_data if component['id'] == component_id), None)
267 if selected_component is None: 274 if selected_component is None:
268 return 'Component not found' 275 return 'Component not found'
269 # Отримати посилання на архів компоненти та версію 276 # Отримати посилання на архів компоненти та версію
270 archive_url = selected_component['latest_component_data'] 277 archive_url = selected_component['latest_component_data']
271 version = selected_component['latest_version'] 278 version = selected_component['latest_version']
272 try: 279 try:
273 # Створити шлях до папки компоненти згідно назви та версії 280 # Створити шлях до папки компоненти згідно назви та версії
274 component_folder = os.path.join(project_folder) 281 component_folder = os.path.join(project_folder)
275 os.makedirs(component_folder, exist_ok=True) 282 os.makedirs(component_folder, exist_ok=True)
276 # Завантажити архів компоненти 283 # Завантажити архів компоненти
277 response = requests.get(archive_url, stream=True) 284 response = requests.get(archive_url, stream=True)
278 response.raise_for_status() 285 response.raise_for_status()
279 # Шлях до завантаженого архіву 286 # Шлях до завантаженого архіву
280 archive_path = os.path.join(component_folder, f"{selected_component['name']}.zip") 287 archive_path = os.path.join(component_folder, f"{selected_component['name']}.zip")
281 # Зберегти архів на диск 288 # Зберегти архів на диск
282 with open(archive_path, "wb") as file: 289 with open(archive_path, "wb") as file:
283 for chunk in response.iter_content(chunk_size=8192): 290 for chunk in response.iter_content(chunk_size=8192):
284 file.write(chunk) 291 file.write(chunk)
285 # Розпакувати архів 292 # Розпакувати архів
286 with zipfile.ZipFile(archive_path, "r") as zip_ref: 293 with zipfile.ZipFile(archive_path, "r") as zip_ref:
287 zip_ref.extractall(component_folder) 294 zip_ref.extractall(component_folder)
288 # Видалити архів 295 # Видалити архів
289 os.remove(archive_path) 296 os.remove(archive_path)
290 #перейменувати якщо git 297 #перейменувати якщо git
291 component_name = selected_component['name'] 298 component_name = selected_component['name']
292 old_folder_path = os.path.join(component_folder, component_name + ".git") 299 old_folder_path = os.path.join(component_folder, component_name + ".git")
293 new_folder_path = os.path.join(component_folder, component_name) 300 new_folder_path = os.path.join(component_folder, component_name)
294 # Перевірка наявності папки зі старою назвою 301 # Перевірка наявності папки зі старою назвою
295 if os.path.exists(old_folder_path) and os.path.isdir(old_folder_path): 302 if os.path.exists(old_folder_path) and os.path.isdir(old_folder_path):
296 # Перейменування папки зі старою назвою на нову назву 303 # Перейменування папки зі старою назвою на нову назву
297 os.rename(old_folder_path, new_folder_path) 304 os.rename(old_folder_path, new_folder_path)
298 305
299 # Шлях до файлу, до якого потрібно додати роути 306 # Шлях до файлу, до якого потрібно додати роути
300 file_path = 'routes.py' 307 file_path = 'routes.py'
301 # Код, який потрібно додати 308 # Код, який потрібно додати
302 if component_name == 'k2grid_base': 309 if component_name == 'k2grid_base':
303 code = f'''from components.{selected_component['name']}.{selected_component['name']}.views import {selected_component['name']}\napp.register_blueprint({selected_component['name']}, url_prefix='/')''' 310 code = f'''from components.{selected_component['name']}.{selected_component['name']}.views import {selected_component['name']}\napp.register_blueprint({selected_component['name']}, url_prefix='/')'''
304 elif component_name == 'k2site': 311 elif component_name == 'k2site':
305 code = f'''login_manager = k2().init_lm(app)\nfrom components.{selected_component['name']}.{selected_component['name']}.views import {selected_component['name']}\napp.register_blueprint({selected_component['name']}, url_prefix='/{selected_component['name']}')''' 312 code = f'''login_manager = k2().init_lm(app)\nfrom components.{selected_component['name']}.{selected_component['name']}.views import {selected_component['name']}\napp.register_blueprint({selected_component['name']}, url_prefix='/{selected_component['name']}')'''
306 else: 313 else:
307 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']}')''' 314 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']}')'''
308 315
309 316
310 317
311 # Відкриття файлу у режимі дозапису 318 # Відкриття файлу у режимі дозапису
312 with open(file_path, 'a') as file: 319 with open(file_path, 'a') as file:
313 # Запис нового коду у файл 320 # Запис нового коду у файл
314 file.write('\n') 321 file.write('\n')
315 file.write(code) 322 file.write(code)
316 file.write('\n') 323 file.write('\n')
317 324
318 # Зчитати вміст файлу YAML 325 # Зчитати вміст файлу YAML
319 with open(f"{project_folder}/components.yml", 'r') as file: 326 with open(f"{project_folder}/components.yml", 'r') as file:
320 components_data = yaml.safe_load(file) 327 components_data = yaml.safe_load(file)
321 if components_data == None: 328 if components_data == None:
322 components_data = {'components': []} 329 components_data = {'components': []}
323 330
324 331
325 332
326 # Перевірити унікальність імен компонентів 333 # Перевірити унікальність імен компонентів
327 existing_component = next((c for c in components_data['components'] if c['name'] == selected_component['name']), 334 existing_component = next((c for c in components_data['components'] if c['name'] == selected_component['name']),
328 None) 335 None)
329 if existing_component: 336 if existing_component:
330 # Оновити існуючий компонент 337 # Оновити існуючий компонент
331 existing_component['id'] = generate_id() 338 existing_component['id'] = generate_id()
332 existing_component['version'] = version 339 existing_component['version'] = version
333 existing_component['git_link'] = selected_component['git_link'] 340 existing_component['git_link'] = selected_component['git_link']
334 existing_component['dependencies'] = code 341 existing_component['dependencies'] = code
335 existing_component['installed'] = True 342 existing_component['installed'] = True
336 else: 343 else:
337 # Додати новий компонент до списку 344 # Додати новий компонент до списку
338 components_data['components'].append({ 345 components_data['components'].append({
339 'id': generate_id(), 346 'id': generate_id(),
340 'name': selected_component['name'], 347 'name': selected_component['name'],
341 'description': selected_component['description'], 348 'description': selected_component['description'],
342 'version': version, 349 'version': version,
343 'git_link': selected_component['git_link'], 350 'git_link': selected_component['git_link'],
344 'dependencies': code, 351 'dependencies': code,
345 'installed': True 352 'installed': True
346 }) 353 })
347 354
348 # Записати оновлений вміст у файл YAML 355 # Записати оновлений вміст у файл YAML
349 with open(f"{project_folder}/components.yml", 'a') as file: 356 with open(f"{project_folder}/components.yml", 'a') as file:
350 yaml.dump(components_data, file) 357 yaml.dump(components_data, file)
351 358
352 # Update database with the installed component 359 # Update database with the installed component
353 # component = Component.query.filter_by(name=selected_component['name']).first() 360 # component = Component.query.filter_by(name=selected_component['name']).first()
354 # if not component: 361 # if not component:
355 # component = Component( 362 # component = Component(
356 # name=selected_component['name'], 363 # name=selected_component['name'],
357 # description=selected_component['description'], 364 # description=selected_component['description'],
358 # version=version, 365 # version=version,
359 # git_link=selected_component['git_link'], 366 # git_link=selected_component['git_link'],
360 # dependencies=code, 367 # dependencies=code,
361 # installed=True 368 # installed=True
362 # ) 369 # )
363 # db.session.add(component) 370 # db.session.add(component)
364 # else: 371 # else:
365 # component.version = version 372 # component.version = version
366 # component.git_link = selected_component['git_link'] 373 # component.git_link = selected_component['git_link']
367 # component.dependencies = code 374 # component.dependencies = code
368 # component.installed = True 375 # component.installed = True
369 # 376 #
370 # db.session.commit() 377 # db.session.commit()
371 378
372 # add language folders 379 # add language folders
373 k2.search_babel_translation_directories() 380 k2.search_babel_translation_directories()
374 return f'''Component installed successfully: {selected_component["name"]} v{version} {k2.babel_translation_directories}, 381 return f'''Component installed successfully: {selected_component["name"]} v{version} {k2.babel_translation_directories},
375 \n \n please wait installing requirments... 382 \n \n please wait installing requirments...
376 <meta http-equiv="refresh" content="0;url=/install-requirments/{selected_component["name"]}" />''' 383 <meta http-equiv="refresh" content="0;url=/install-requirments/{selected_component["name"]}" />'''
377 384
378 except Exception as e: 385 except Exception as e:
379 return f'Error installing component: {str(e)}' 386 return f'Error installing component: {str(e)}'
380 387
381 388
382 @components_bp.route('/install-requirments/<string:selected_component_name>', methods=['GET']) 389 @components_bp.route('/install-requirments/<string:selected_component_name>', methods=['GET'])
383 def install_requirments(selected_component_name): 390 def install_requirments(selected_component_name):
384 391
385 try: 392 try:
386 if k2.platform == 'Windows': 393 if k2.platform == 'Windows':
387 # install requirements for windows 394 # install requirements for windows
388 venv_bin_path = os.path.join(os.path.dirname(sys.prefix), 'venv/Scripts') 395 venv_bin_path = os.path.join(os.path.dirname(sys.prefix), 'venv/Scripts')
389 requirements_file = os.path.join('components', selected_component_name, "requirements.txt") 396 requirements_file = os.path.join('components', selected_component_name, "requirements.txt")
390 if os.path.isfile(requirements_file): 397 if os.path.isfile(requirements_file):
391 pip_command = f"{venv_bin_path}/python -m pip install -r {requirements_file}" 398 pip_command = f"{venv_bin_path}/python -m pip install -r {requirements_file}"
392 subprocess.run(pip_command, shell=True, check=True) 399 subprocess.run(pip_command, shell=True, check=True)
393 elif k2.platform == 'Linux': 400 elif k2.platform == 'Linux':
394 #install requirements for linux 401 #install requirements for linux
395 venv_bin_path = os.path.join(os.path.dirname(sys.prefix), 'venv/bin') 402 venv_bin_path = os.path.join(os.path.dirname(sys.prefix), 'venv/bin')
396 requirements_file = os.path.join('components', selected_component_name, "requirements.txt") 403 requirements_file = os.path.join('components', selected_component_name, "requirements.txt")
397 if os.path.isfile(requirements_file): 404 if os.path.isfile(requirements_file):
398 pip_command = f"{venv_bin_path}/python3 -m pip install -r {requirements_file}" 405 pip_command = f"{venv_bin_path}/python3 -m pip install -r {requirements_file}"
399 subprocess.run(pip_command, shell=True, check=True) 406 subprocess.run(pip_command, shell=True, check=True)
400 407
401 return f'''Requirements installed successfully 408 return f'''Requirements installed successfully
402 \n \n please wait installing requirments components... 409 \n \n please wait installing requirments components...
403 <meta http-equiv="refresh" content="1;url=/install-requirments-components" />''' 410 <meta http-equiv="refresh" content="1;url=/install-requirments-components" />'''
404 except Exception as e: 411 except Exception as e:
405 return f'Error installing requirmets: {str(e)}' 412 return f'Error installing requirmets: {str(e)}'
406 413
407 @components_bp.route('/install-requirments-components') 414 @components_bp.route('/install-requirments-components')
408 def install_requirements_components(): 415 def install_requirements_components():
409 # Откриття файлу requirements_components.txt 416 # Откриття файлу requirements_components.txt
410 requirements_file = 'requirements_components.txt' 417 requirements_file = 'requirements_components.txt'
411 component_ids = None 418 component_ids = None
412 if os.path.isfile(requirements_file): 419 if os.path.isfile(requirements_file):
413 with open('requirements_components.txt', 'r') as file: 420 with open('requirements_components.txt', 'r') as file:
414 component_ids = file.read().splitlines() 421 component_ids = file.read().splitlines()
415 if component_ids: 422 if component_ids:
416 for component_id in component_ids: 423 for component_id in component_ids:
417 # Виклик роуту '/install_components/<string:component_name>' для кожної назви компоненти 424 # Виклик роуту '/install_components/<string:component_name>' для кожної назви компоненти
418 response = requests.get( 425 response = requests.get(
419 f'/install_components/{component_id}') 426 f'/install_components/{component_id}')
420 return f'Requirements components installed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 427 return f'Requirements components installed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
421 else: 428 else:
422 return f'<meta http-equiv="refresh" content="1;url=/dashboard" />' 429 return f'<meta http-equiv="refresh" content="1;url=/dashboard" />'
423 # Опрацювання відповіді (за потреби) 430 # Опрацювання відповіді (за потреби)
424 431
425 432
426 @components_bp.route('/remove_dependencies/<string:component_id>', methods=['GET']) 433 @components_bp.route('/remove_dependencies/<string:component_id>', methods=['GET'])
427 def remove_dependencies(component_id): 434 def remove_dependencies(component_id):
428 # Знаходимо компоненту за її ID 435 # Знаходимо компоненту за її ID
429 #component = Component.query.get(component_id) 436 #component = Component.query.get(component_id)
430 #if not component: 437 #if not component:
431 # return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 438 # return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
432 with open(f"components/components.yml", 'r') as file: 439 with open(f"components/components.yml", 'r') as file:
433 components_data = yaml.safe_load(file) 440 components_data = yaml.safe_load(file)
434 if components_data is None: 441 if components_data is None:
435 return None 442 return None
436 # Шукати компонент за id 443 # Шукати компонент за id
437 for component in components_data['components']: 444 for component in components_data['components']:
438 if component['id'] == component_id: 445 if component['id'] == component_id:
439 component 446 component
440 447
441 # remove menu items 448 # remove menu items
442 component_name = component['name'] 449 component_name = component['name']
443 # file_path = "components/menu.yml" 450 # file_path = "components/menu.yml"
444 # remove_from_yaml_file(file_path, component_name) 451 # remove_from_yaml_file(file_path, component_name)
445 #requests.get(f"{k2.domain}api/add-to-menu") 452 #requests.get(f"{k2.domain}api/add-to-menu")
446 # remove routes 453 # remove routes
447 file_path = 'routes.py' 454 file_path = 'routes.py'
448 with open(file_path, 'r') as file: 455 with open(file_path, 'r') as file:
449 lines = file.readlines() 456 lines = file.readlines()
450 457
451 updated_lines = [line for line in lines if line.strip() not in component['dependencies']] 458 updated_lines = [line for line in lines if line.strip() not in component['dependencies']]
452 with open(file_path, 'w') as file: 459 with open(file_path, 'w') as file:
453 file.writelines(updated_lines) 460 file.writelines(updated_lines)
454 component['installed'] = False 461 component['installed'] = False
455 with open(f"components/components.yml", 'w') as file: 462 with open(f"components/components.yml", 'w') as file:
456 yaml.dump(components_data, file) 463 yaml.dump(components_data, file)
457 464
458 465
459 return 'Component successfully turn off <meta http-equiv="refresh" content="1;url=/dashboard" />' 466 return 'Component successfully turn off <meta http-equiv="refresh" content="1;url=/dashboard" />'
460 467
461 468
462 @components_bp.route('/add_dependencies/<string:component_id>', methods=['GET']) 469 @components_bp.route('/add_dependencies/<string:component_id>', methods=['GET'])
463 def add_dependencies(component_id): 470 def add_dependencies(component_id):
464 # Зчитати вміст файлу YAML 471 # Зчитати вміст файлу YAML
465 with open(f"components/components.yml", 'r') as file: 472 with open(f"components/components.yml", 'r') as file:
466 components_data = yaml.safe_load(file) 473 components_data = yaml.safe_load(file)
467 474
468 if components_data is None: 475 if components_data is None:
469 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 476 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
470 477
471 # Знайти компоненту за ID 478 # Знайти компоненту за ID
472 component = None 479 component = None
473 for comp in components_data['components']: 480 for comp in components_data['components']:
474 if comp['id'] == component_id: 481 if comp['id'] == component_id:
475 component = comp 482 component = comp
476 break 483 break
477 484
478 if component is None: 485 if component is None:
479 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 486 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
480 487
481 file_path = 'routes.py' 488 file_path = 'routes.py'
482 code = component['dependencies'] 489 code = component['dependencies']
483 # Відкриття файлу у режимі дозапису 490 # Відкриття файлу у режимі дозапису
484 with open(file_path, 'a') as file: 491 with open(file_path, 'a') as file:
485 # Запис нового коду у файл 492 # Запис нового коду у файл
486 file.write(code) 493 file.write(code)
487 494
488 # Оновлюємо статус компоненти 495 # Оновлюємо статус компоненти
489 component['installed'] = True 496 component['installed'] = True
490 497
491 # Оновлення вмісту файлу YAML 498 # Оновлення вмісту файлу YAML
492 with open(f"components/components.yml", 'w') as file: 499 with open(f"components/components.yml", 'w') as file:
493 yaml.dump(components_data, file) 500 yaml.dump(components_data, file)
494 501
495 return 'Dependencies added successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 502 return 'Dependencies added successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
496 503
497 504
498 @components_bp.route('/remove-component/<string:component_id>') 505 @components_bp.route('/remove-component/<string:component_id>')
499 def remove_component(component_id): 506 def remove_component(component_id):
500 # Шлях до папки з компонентами 507 # Шлях до папки з компонентами
501 components_folder = 'components' 508 components_folder = 'components'
502 509
503 # Зчитати вміст файлу YAML 510 # Зчитати вміст файлу YAML
504 with open(f"{components_folder}/components.yml", 'r') as file: 511 with open(f"{components_folder}/components.yml", 'r') as file:
505 components_data = yaml.safe_load(file) 512 components_data = yaml.safe_load(file)
506 513
507 if components_data is None: 514 if components_data is None:
508 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 515 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
509 516
510 # Знайти компоненту за ID 517 # Знайти компоненту за ID
511 component = None 518 component = None
512 for comp in components_data['components']: 519 for comp in components_data['components']:
513 if comp['id'] == component_id: 520 if comp['id'] == component_id:
514 component = comp 521 component = comp
515 break 522 break
516 523
517 if component is None: 524 if component is None:
518 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 525 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
519 526
520 # Видалити папку репозиторія компоненти 527 # Видалити папку репозиторія компоненти
521 repository_folder = os.path.join(components_folder, component['name']) 528 repository_folder = os.path.join(components_folder, component['name'])
522 if os.path.exists(repository_folder): 529 if os.path.exists(repository_folder):
523 shutil.rmtree(repository_folder) 530 shutil.rmtree(repository_folder)
524 531
525 # Видалити компоненту зі списку 532 # Видалити компоненту зі списку
526 components_data['components'] = [comp for comp in components_data['components'] if comp['id'] != component_id] 533 components_data['components'] = [comp for comp in components_data['components'] if comp['id'] != component_id]
527 534
528 # Записати оновлений вміст у файл YAML 535 # Записати оновлений вміст у файл YAML
529 with open(f"{components_folder}/components.yml", 'w') as file: 536 with open(f"{components_folder}/components.yml", 'w') as file:
530 yaml.dump(components_data, file) 537 yaml.dump(components_data, file)
531 538
532 return 'Component removed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 539 return 'Component removed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
533 540
534 541
535 # menu 542 # menu
536 @components_bp.route('/api/add-to-menu', methods=['GET']) 543 @components_bp.route('/api/add-to-menu', methods=['GET'])
537 def add_to_menu(): 544 def add_to_menu():
538 components_folder = 'components' 545 components_folder = 'components'
539 data = [] 546 data = []
540 response = requests.get(f"{k2.domain}/menu-admin-items") 547 response = requests.get(f"{k2.domain}/menu-admin-items")
541 data.append(response.json()[0]) 548 data.append(response.json()[0])
542 prev_menu = response.json()[0]['title'] 549 prev_menu = response.json()[0]['title']
543 for item in response.json()[0]['children']: 550 for item in response.json()[0]['children']:
544 name_menu = 'k2itm' + item['to'].replace('/', '-') 551 name_menu = 'k2itm' + item['to'].replace('/', '-')
545 caption_menu = item['title'] 552 caption_menu = item['title']
546 add_menu_with_permissions_db(name_menu, prev_menu, caption_menu) 553 add_menu_with_permissions_db(name_menu, prev_menu, caption_menu)
547 # Отримати дані з файлу YAML кожного компонента 554 # Отримати дані з файлу YAML кожного компонента
548 with open(f"{components_folder}/components.yml", 'r') as file: 555 with open(f"{components_folder}/components.yml", 'r') as file:
549 components_data = yaml.safe_load(file) 556 components_data = yaml.safe_load(file)
550 557
551 if components_data is not None: 558 if components_data is not None:
552 # Отримати імена всіх компонентів 559 # Отримати імена всіх компонентів
553 components_names = [comp['name'] for comp in components_data['components']] 560 components_names = [comp['name'] for comp in components_data['components']]
554 561
555 for component_name in components_names: 562 for component_name in components_names:
556 # Виконати запит до відповідного роуту компонента 563 # Виконати запит до відповідного роуту компонента
557 response = requests.get(f"{k2.domain}{component_name}/menu-admin-items") 564 response = requests.get(f"{k2.domain}{component_name}/menu-admin-items")
558 565
559 if response.status_code == 200: 566 if response.status_code == 200:
560 data.append(response.json()[0]) 567 data.append(response.json()[0])
561 prev_menu = response.json()[0]['title'] 568 prev_menu = response.json()[0]['title']
562 569
563 for item in response.json()[0]['children']: 570 for item in response.json()[0]['children']:
564 name_menu = 'k2itm' + item['to'].replace('/', '-') 571 name_menu = 'k2itm' + item['to'].replace('/', '-')
565 caption_menu = item['title'] 572 caption_menu = item['title']
566 add_menu_with_permissions_db(name_menu, prev_menu, caption_menu) 573 add_menu_with_permissions_db(name_menu, prev_menu, caption_menu)
567 574
568 return jsonify(data) 575 return jsonify(data)
569 576
570 577
571 @components_bp.route('/api/main-menu/') 578 @components_bp.route('/api/main-menu/')
572 @login_required 579 @login_required
573 def get_admin_menu(): 580 def get_admin_menu():
574 581
575 components_folder = 'components' 582 components_folder = 'components'
576 # 583 #
577 with open(f"{components_folder}/components.yml", 'r') as file: 584 with open(f"{components_folder}/components.yml", 'r') as file:
578 components_data = yaml.safe_load(file) 585 components_data = yaml.safe_load(file)
579 586
580 if components_data is None: 587 if components_data is None:
581 return jsonify([]) 588 return jsonify([])
582 # Отримати список імен компонентів 589 # Отримати список імен компонентів
583 components_names = [comp['name'] for comp in components_data['components']] 590 components_names = [comp['name'] for comp in components_data['components']]
584 if 'k2site' in components_names: 591 if 'k2site' in components_names:
585 role_id = current_user.get_role_id() 592 role_id = current_user.get_role_id()
586 593
587 # Виконати запит до роуту '/api/add-to-menu' 594 # Виконати запит до роуту '/api/add-to-menu'
588 response = requests.get(f"{k2.domain}api/add-to-menu") 595 response = requests.get(f"{k2.domain}api/add-to-menu")
589 menu_items_list = K2admin_menus.get_menu_items_by_roles(role_id) 596 menu_items_list = K2admin_menus.get_menu_items_by_roles(role_id)
590 597
591 filter_menu = [] 598 filter_menu = []
592 599
593 for item in response.json(): 600 for item in response.json():
594 filtered_children = [] 601 filtered_children = []
595 602
596 for im in item['children']: 603 for im in item['children']:
597 if 'k2itm' + im['to'].replace('/', '-') in menu_items_list: 604 if 'k2itm' + im['to'].replace('/', '-') in menu_items_list:
598 filtered_children.append(im) 605 filtered_children.append(im)
599 606
600 if filtered_children: 607 if filtered_children:
601 item['children'] = filtered_children 608 item['children'] = filtered_children
602 filter_menu.append(item) 609 filter_menu.append(item)
603 610
604 return jsonify(filter_menu) 611 return jsonify(filter_menu)
605 612
606 return jsonify([]) 613 return jsonify([])
607 614
608 615
609 def add_menu_with_permissions_db(name_menu, prev_menu, caption_menu): 616 def add_menu_with_permissions_db(name_menu, prev_menu, caption_menu):
610 617
611 # Створення об'єкта k2admin_menus 618 # Створення об'єкта k2admin_menus
612 menu = text('SELECT COUNT(*) FROM k2admin_menus WHERE namemenu = :name_menu') 619 menu = text('SELECT COUNT(*) FROM k2admin_menus WHERE namemenu = :name_menu')
613 result = db.session.execute(menu, {'name_menu': name_menu}).fetchone() 620 result = db.session.execute(menu, {'name_menu': name_menu}).fetchone()
614 count = result[0] 621 count = result[0]
615 if count == 0: 622 if count == 0:
616 new_menu_element = K2admin_menus( 623 new_menu_element = K2admin_menus(
617 namemenu=name_menu, 624 namemenu=name_menu,
618 prevmenu=prev_menu, 625 prevmenu=prev_menu,
619 caption=caption_menu, 626 caption=caption_menu,
620 module_name=name_menu 627 module_name=name_menu
621 ) 628 )
622 db.session.add(new_menu_element) 629 db.session.add(new_menu_element)
623 db.session.commit() 630 db.session.commit()
624 # Створення об'єкта k2admin_menus_prava 631 # Створення об'єкта k2admin_menus_prava
625 new_prava = K2admin_Menus_Prava( 632 new_prava = K2admin_Menus_Prava(
626 menuid=new_menu_element.menuid, # Зв'язуємо зовнішній ключ з menuid нового меню 633 menuid=new_menu_element.menuid, # Зв'язуємо зовнішній ключ з menuid нового меню
627 username=None, 634 username=None,
628 r=0, 635 r=0,
629 w=0, 636 w=0,
630 i=0, 637 i=0,
631 d=0, 638 d=0,
632 c=0, 639 c=0,
633 exp=0, 640 exp=0,
634 imp=0, 641 imp=0,
635 settable=0, 642 settable=0,
636 cutpast=0, 643 cutpast=0,
637 enable=0, 644 enable=0,
638 roleid=-1 645 roleid=-1
639 ) 646 )
640 # Додавання об'єкта k2admin_menus_prava до сесії 647 # Додавання об'єкта k2admin_menus_prava до сесії
641 db.session.add(new_prava) 648 db.session.add(new_prava)
642 db.session.commit() 649 db.session.commit()
643 650
644 @components_bp.route('/component-add') 651 @components_bp.route('/component-add')
645 @login_required 652 @login_required
646 def component_add_dasb(): 653 def component_add_dasb():
647 try: 654 try:
648 response = requests.get(f'{k2.update_domain}api/components') 655 response = requests.get(f'{k2.update_domain}api/components')
649 json_data = response.json() 656 json_data = response.json()
650 component_server = [item for item in json_data] 657 component_server = [item for item in json_data]
651 except: 658 except:
652 component_server = None 659 component_server = None
653 # Отримання значення пошукового запиту з параметрів URL 660 # Отримання значення пошукового запиту з параметрів URL
654 search_query = request.args.get('search_query') 661 search_query = request.args.get('search_query')
655 # print(search_query) 662 # print(search_query)
656 filtered_components = [] 663 filtered_components = []
657 if search_query: 664 if search_query:
658 filtered_components = [component for component in component_server if 665 filtered_components = [component for component in component_server if
659 (search_query.lower() in component['name'].lower() if component[ 666 (search_query.lower() in component['name'].lower() if component[
660 'name'] else False) or 667 'name'] else False) or
661 (search_query.lower() in component['description'].lower() if component[ 668 (search_query.lower() in component['description'].lower() if component[
662 'description'] else False)] 669 'description'] else False)]
663 else: 670 else:
664 filtered_components = component_server 671 filtered_components = component_server
665 project_folder = 'components' 672 project_folder = 'components'
666 with open(f"{project_folder}/components.yml", 'r') as file: 673 with open(f"{project_folder}/components.yml", 'r') as file:
667 components_data = yaml.safe_load(file) 674 components_data = yaml.safe_load(file)
668 675
669 components_names = [] 676 components_names = []
670 components_version = [] 677 components_version = []
671 # Отримати імена та версії компонентів з даних YAML 678 # Отримати імена та версії компонентів з даних YAML
672 if components_data is not None: 679 if components_data is not None:
673 for component in components_data['components']: 680 for component in components_data['components']:
674 name = component['name'] 681 name = component['name']
675 version = component['version'] 682 version = component['version']
676 components_names.append(name) 683 components_names.append(name)
677 components_version.append({name: version}) 684 components_version.append({name: version})
678 685
679 return render_template('dashboard-add.html', 686 return render_template('dashboard-add.html',
680 component_server=filtered_components, search_query=search_query, components_names=components_names, components_version=components_version ) 687 component_server=filtered_components, search_query=search_query, components_names=components_names, components_version=components_version )
681 688
682 689
683 690
684 @components_bp.route('/component-list') 691 @components_bp.route('/component-list')
685 @login_required 692 @login_required
686 def component_list_dasb(): 693 def component_list_dasb():
687 with open(f"components/components.yml", 'r') as file: 694 with open(f"components/components.yml", 'r') as file:
688 components_data = yaml.safe_load(file) 695 components_data = yaml.safe_load(file)
689 if components_data is None or 'components' not in components_data: 696 if components_data is None or 'components' not in components_data:
690 components = [] 697 components = []
691 else: 698 else:
692 components = components_data['components'] 699 components = components_data['components']
693 700
694 return render_template('dashboard-list.html', components=components) 701 return render_template('dashboard-list.html', components=components)
695 702
696 703
697 704
698 705
699 @components_bp.route('/menu-admin-items') 706 @components_bp.route('/menu-admin-items')
700 def menu_items(): 707 def menu_items():
701 menu = [ 708 menu = [
702 { 709 {
703 "title": 'Add components', 710 "title": 'Add components',
704 "icon": {"icon": 'mdi-account-circle-outline'}, 711 "icon": {"icon": 'mdi-account-circle-outline'},
705 "children": [ 712 "children": [
706 {'title': 'Install new components', 'to': '/component-add'}, 713 {'title': 'Install new components', 'to': '/component-add'},
707 {'title': 'Installed components', 'to': '/component-list'}, 714 {'title': 'Installed components', 'to': '/component-list'},
708 715
709 ], 716 ],
710 }] 717 }]
711 return menu 718 return menu
712 719
713 720
714 721
715 722
716 723
717 724
718 725
languages/babel_translation_directories.yml
1 babel_translation_directories: languages 1 babel_translation_directories: languages;components/k2site/k2site/languages;components/k2adm/k2adm/languages
2 2