Commit ae2387fb061d7b34c3cf96e158793d4e88bc1e5b

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

del sqlite, add yml

Showing 17 changed files with 233 additions and 140 deletions Inline Diff

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