Commit 4cd28255f43bce2244dbcba7a0322c139dcbf4ef

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

edit remove/add depencies

Showing 18 changed files with 2 additions and 94 deletions Inline Diff

__pycache__/main.cpython-310.pyc
No preview for this file type
__pycache__/routes.cpython-310.pyc
No preview for this file type
components/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/k2test/.idea/.gitignore
1 # Default ignored files File was deleted
2 /shelf/
3 /workspace.xml
4 1 # Default ignored files
components/k2test/.idea/gittest.iml
1 <?xml version="1.0" encoding="UTF-8"?> File was deleted
2 <module type="PYTHON_MODULE" version="4">
3 <component name="NewModuleRootManager">
4 <content url="file://$MODULE_DIR$">
5 <excludeFolder url="file://$MODULE_DIR$/venv" />
6 </content>
7 <orderEntry type="inheritedJdk" />
8 <orderEntry type="sourceFolder" forTests="false" />
9 </component>
10 </module>
components/k2test/.idea/inspectionProfiles/profiles_settings.xml
1 <component name="InspectionProjectProfileManager"> File was deleted
2 <settings>
3 <option name="USE_PROJECT_PROFILE" value="false" />
4 <version value="1.0" />
5 </settings>
6 </component>
components/k2test/.idea/misc.xml
1 <?xml version="1.0" encoding="UTF-8"?> File was deleted
2 <project version="4">
3 <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (gittest)" project-jdk-type="Python SDK" />
4 <component name="PyCharmProfessionalAdvertiser">
5 <option name="shown" value="true" />
6 </component>
7 </project>
components/k2test/.idea/modules.xml
1 <?xml version="1.0" encoding="UTF-8"?> File was deleted
2 <project version="4">
3 <component name="ProjectModuleManager">
4 <modules>
5 <module fileurl="file://$PROJECT_DIR$/.idea/gittest.iml" filepath="$PROJECT_DIR$/.idea/gittest.iml" />
6 </modules>
7 </component>
8 </project>
components/k2test/.idea/vcs.xml
1 <?xml version="1.0" encoding="UTF-8"?> File was deleted
2 <project version="4">
3 <component name="VcsDirectoryMappings">
4 <mapping directory="$PROJECT_DIR$" vcs="Git" />
5 </component>
6 </project>
components/k2test/k2test/templates/login.html
1 login File was deleted
2 1 login
components/k2test/k2test/views.py
1 from flask import render_template, redirect, request File was deleted
2 from flask_login import login_user, current_user, logout_user, login_required
3 from flask import current_app as k2
4 from flask import Blueprint, json
5 from flask_sqlalchemy import SQLAlchemy
6 k2test = Blueprint('k2test', __name__)
7
8 @k2test.route('/new')
9 def new_component():
10 db = k2.extensions['sqlalchemy'].db
11 connection = db.engine.connect()
12 query = db.text("SELECT email, login FROM k2users")
13 result = connection.execute(query).fetchall()
14 rows = [dict(email=row.email, login=row.login) for row in result]
15 # Перетворення результату на JSON
16 json_result = json.dumps(rows)
17 return json_result
18
19 @k2test.route('/new2')
20 def new_component2():
21 return 'сторінка 2'
22
23 @k2test.route('/new3')
24 def new_component3():
25 return 'сторінка 3'
26
27 @k2test.route('/new4')
28 def new_component4():
29 return 'сторінка 4'
30 1 from flask import render_template, redirect, request
components/k2test/requirements.txt
1 Flask-Login==0.6.2 File was deleted
2 1 Flask-Login==0.6.2
components/k2test/setup.py
1 from setuptools import setup, find_packages File was deleted
2
3 setup(
4 name='k2test',
5 version='1.0.0',
6 description='Description of my project',
7 author='Your Name',
8 author_email='yourname@example.com',
9 keywords="k2test, k2",
10 python_requires=">=3.7, <=3.11.2",
11 packages=['k2test'],
12 package_data={ # Optional
13 "k2test": ["static/style.css", "static/default.css", "templates/index.html", "templates/login.html"] },
14 install_requires=[""],
15 )
16 1 from setuptools import setup, find_packages
db/__pycache__/database.cpython-310.pyc
No preview for this file type
No preview for this file type
k2/__pycache__/root.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 2 from flask import Flask, Blueprint, jsonify, render_template, redirect, url_for
3 import os 3 import os
4 import shutil 4 import shutil
5 from flask_login import current_user 5 from flask_login import current_user
6 from flask_bcrypt import bcrypt 6 from flask_bcrypt import bcrypt
7 from flask_login import login_user, current_user, logout_user, login_required 7 from flask_login import login_user, current_user, logout_user, login_required
8 import requests 8 import requests
9 from datetime import datetime 9 from datetime import datetime
10 from flask_login import UserMixin 10 from flask_login import UserMixin
11 import uuid 11 import uuid
12 from flask_wtf import FlaskForm 12 from flask_wtf import FlaskForm
13 from wtforms import StringField, PasswordField, SubmitField 13 from wtforms import StringField, PasswordField, SubmitField
14 from wtforms.validators import DataRequired, Length 14 from wtforms.validators import DataRequired, Length
15 import subprocess 15 import subprocess
16 from flask import request 16 from flask import request
17 from db.database import db 17 from db.database import db
18 from flask_bcrypt import Bcrypt 18 from flask_bcrypt import Bcrypt
19 from flask_login import LoginManager 19 from flask_login import LoginManager
20 from flask_migrate import Migrate 20 from flask_migrate import Migrate
21 from flask import current_app as k2 21 from flask import current_app as k2
22 from main import app 22 from main import app
23 import string 23 import string
24 24
25 with app.app_context(): 25 with app.app_context():
26 bcrypt = Bcrypt(app) 26 bcrypt = Bcrypt(app)
27 login_manager = LoginManager(app) 27 login_manager = LoginManager(app)
28 login_manager.login_view = 'login' 28 login_manager.login_view = 'login'
29 29
30 #migrate = Migrate(app, db) 30 #migrate = Migrate(app, db)
31 def generate_id(): 31 def generate_id():
32 generated_id = uuid.uuid4().hex[:32] 32 generated_id = uuid.uuid4().hex[:32]
33 return ''.join([generated_id[i:i + 4] for i in range(0, len(generated_id), 4)]) 33 return ''.join([generated_id[i:i + 4] for i in range(0, len(generated_id), 4)])
34 34
35 class LoginForm(FlaskForm): 35 class LoginForm(FlaskForm):
36 username = StringField('Username', validators=[DataRequired(), Length(min=3, max=20)]) 36 username = StringField('Username', validators=[DataRequired(), Length(min=3, max=20)])
37 password = PasswordField('Password', validators=[DataRequired()]) 37 password = PasswordField('Password', validators=[DataRequired()])
38 submit = SubmitField('Login') 38 submit = SubmitField('Login')
39 39
40 class User(UserMixin, db.Model): 40 class User(UserMixin, db.Model):
41 __bind_key__ = 'db2' 41 __bind_key__ = 'db2'
42 __tablename__ = 'user' 42 __tablename__ = 'user'
43 __table_args__ = {'extend_existing': True} 43 __table_args__ = {'extend_existing': True}
44 id = db.Column(db.String(36), primary_key=True, default=generate_id) 44 id = db.Column(db.String(36), primary_key=True, default=generate_id)
45 username = db.Column(db.String(50)) 45 username = db.Column(db.String(50))
46 active = db.Column(db.Boolean) 46 active = db.Column(db.Boolean)
47 last_name = db.Column(db.String(50)) 47 last_name = db.Column(db.String(50))
48 first_name = db.Column(db.String(50)) 48 first_name = db.Column(db.String(50))
49 middle_name = db.Column(db.String(50)) 49 middle_name = db.Column(db.String(50))
50 email = db.Column(db.String(100)) 50 email = db.Column(db.String(100))
51 phone = db.Column(db.String(20)) 51 phone = db.Column(db.String(20))
52 rights = db.Column(db.String(50)) 52 rights = db.Column(db.String(50))
53 manufacturer = db.Column(db.String(50)) 53 manufacturer = db.Column(db.String(50))
54 manufacturer_id = db.Column(db.Integer) 54 manufacturer_id = db.Column(db.Integer)
55 created_date = db.Column(db.DateTime) 55 created_date = db.Column(db.DateTime)
56 created_by = db.Column(db.String(50)) 56 created_by = db.Column(db.String(50))
57 oblast_id = db.Column(db.Integer) 57 oblast_id = db.Column(db.Integer)
58 password = db.Column(db.String(50)) 58 password = db.Column(db.String(50))
59 #role_id = db.Column(db.Integer, db.ForeignKey('role.id', name='fk_user_role_id')) 59 #role_id = db.Column(db.Integer, db.ForeignKey('role.id', name='fk_user_role_id'))
60 #role = db.relationship('main.Role', backref='users') 60 #role = db.relationship('main.Role', backref='users')
61 def __repr__(self): 61 def __repr__(self):
62 return f'<User {self.username}>' 62 return f'<User {self.username}>'
63 63
64 class Role(db.Model): 64 class Role(db.Model):
65 __bind_key__ = 'db2' 65 __bind_key__ = 'db2'
66 __tablename__ = 'role' 66 __tablename__ = 'role'
67 __table_args__ = {'extend_existing': True} 67 __table_args__ = {'extend_existing': True}
68 id = db.Column(db.String(36), primary_key=True, default=generate_id) 68 id = db.Column(db.String(36), primary_key=True, default=generate_id)
69 name = db.Column(db.String(50)) 69 name = db.Column(db.String(50))
70 sorting = db.Column(db.Integer) 70 sorting = db.Column(db.Integer)
71 note = db.Column(db.String(100)) 71 note = db.Column(db.String(100))
72 enabled = db.Column(db.Boolean) 72 enabled = db.Column(db.Boolean)
73 public = db.Column(db.Boolean) 73 public = db.Column(db.Boolean)
74 is_admin = db.Column(db.Boolean) 74 is_admin = db.Column(db.Boolean)
75 actions = db.Column(db.String(100)) 75 actions = db.Column(db.String(100))
76 def __repr__(self): 76 def __repr__(self):
77 return f'<Role {self.name}>' 77 return f'<Role {self.name}>'
78 def __repr__(self): 78 def __repr__(self):
79 return f'<User {self.username}>' 79 return f'<User {self.username}>'
80 80
81 class Component(db.Model): 81 class Component(db.Model):
82 __bind_key__ = 'db2' 82 __bind_key__ = 'db2'
83 __tablename__ = 'component' 83 __tablename__ = 'component'
84 __table_args__ = {'extend_existing': True} 84 __table_args__ = {'extend_existing': True}
85 id = db.Column(db.String(36), primary_key=True, default=generate_id) 85 id = db.Column(db.String(36), primary_key=True, default=generate_id)
86 name = db.Column(db.String(100), nullable=False) 86 name = db.Column(db.String(100), nullable=False)
87 description = db.Column(db.String(200)) 87 description = db.Column(db.String(200))
88 version = db.Column(db.String(20)) 88 version = db.Column(db.String(20))
89 git_link = db.Column(db.String(200)) 89 git_link = db.Column(db.String(200))
90 dependencies = db.Column(db.String) 90 dependencies = db.Column(db.String)
91 date_installed = db.Column(db.DateTime, default=datetime.utcnow) 91 date_installed = db.Column(db.DateTime, default=datetime.utcnow)
92 installed = db.Column(db.Boolean, default=False) 92 installed = db.Column(db.Boolean, default=False)
93 93
94 def __init__(self, name, description, version, git_link, dependencies, installed): 94 def __init__(self, name, description, version, git_link, dependencies, installed):
95 self.name = name 95 self.name = name
96 self.description = description 96 self.description = description
97 self.version = version 97 self.version = version
98 self.git_link = git_link 98 self.git_link = git_link
99 self.dependencies = dependencies 99 self.dependencies = dependencies
100 self.installed = installed 100 self.installed = installed
101 def __repr__(self): 101 def __repr__(self):
102 return f"Component('{self.name}', '{self.version}')" 102 return f"Component('{self.name}', '{self.version}')"
103 @classmethod 103 @classmethod
104 def get_repository_by_id(self,rep_id): 104 def get_repository_by_id(self,rep_id):
105 component = db.session.query(Component).filter(Component.id == rep_id).first() 105 component = db.session.query(Component).filter(Component.id == rep_id).first()
106 return component 106 return component
107 107
108 components_bp = Blueprint('components', __name__, template_folder='templates') 108 components_bp = Blueprint('components', __name__, template_folder='templates')
109 login_manager = LoginManager(k2) 109 login_manager = LoginManager(k2)
110 @login_manager.user_loader 110 @login_manager.user_loader
111 def load_user(user_id): 111 def load_user(user_id):
112 # Код для завантаження користувача з бази даних за його ідентифікатором 112 # Код для завантаження користувача з бази даних за його ідентифікатором
113 return User.query.get(user_id) 113 return User.query.get(user_id)
114 @components_bp.route('/', methods=['GET', 'POST']) 114 @components_bp.route('/', methods=['GET', 'POST'])
115 def home(): 115 def home():
116 116
117 if current_user.is_authenticated: 117 if current_user.is_authenticated:
118 # Логіка для авторизованого користувача 118 # Логіка для авторизованого користувача
119 return redirect('/dashboard') 119 return redirect('/dashboard')
120 else: 120 else:
121 # Логіка для неавторизованого користувача 121 # Логіка для неавторизованого користувача
122 return redirect('/login') 122 return redirect('/login')
123 @components_bp.route('/login', methods=['GET', 'POST']) 123 @components_bp.route('/login', methods=['GET', 'POST'])
124 def login(): 124 def login():
125 125
126 form = LoginForm() 126 form = LoginForm()
127 if form.validate_on_submit(): 127 if form.validate_on_submit():
128 # Отримання даних з форми 128 # Отримання даних з форми
129 username = form.username.data 129 username = form.username.data
130 password = form.password.data 130 password = form.password.data
131 # Перевірка введених даних 131 # Перевірка введених даних
132 user = User.query.filter_by(username=username).first() 132 user = User.query.filter_by(username=username).first()
133 if user and bcrypt.check_password_hash(user.password, password): # 133 if user and bcrypt.check_password_hash(user.password, password): #
134 login_user(user) 134 login_user(user)
135 return redirect('/dashboard') 135 return redirect('/dashboard')
136 else: 136 else:
137 # Невірні дані для авторизації 137 # Невірні дані для авторизації
138 error_message = f'Неправильне ім`я користувача чи пароль {username} {password} {user.password}' 138 error_message = f'Неправильне ім`я користувача чи пароль {username} {password} {user.password}'
139 139
140 return render_template('/login.html', form=form, error_message=error_message) 140 return render_template('/login.html', form=form, error_message=error_message)
141 141
142 return render_template('/login.html', form=form) 142 return render_template('/login.html', form=form)
143 @components_bp.route('/logout') 143 @components_bp.route('/logout')
144 @login_required 144 @login_required
145 def logout(): 145 def logout():
146 logout_user() 146 logout_user()
147 return redirect('/login') 147 return redirect('/login')
148 @components_bp.route('/dashboard') 148 @components_bp.route('/dashboard')
149 def dashboard(): 149 def dashboard():
150 if not current_user.is_authenticated: 150 if not current_user.is_authenticated:
151 return redirect('/login') 151 return redirect('/login')
152 # Компоненти доступні для встановлення 152 # Компоненти доступні для встановлення
153 try: 153 try:
154 # GET-запит до API 154 # GET-запит до API
155 response = requests.get('http://127.0.0.1:8001/api/components') 155 response = requests.get('http://127.0.0.1:8001/api/components')
156 json_data = response.json() 156 json_data = response.json()
157 # Перетворення JSON-об'єкту на масив 157 # Перетворення JSON-об'єкту на масив
158 component_server = [item for item in json_data] 158 component_server = [item for item in json_data]
159 except: 159 except:
160 component_server = None 160 component_server = None
161 161
162 # Встановлені компоненти 162 # Встановлені компоненти
163 components = Component.query.all() 163 components = Component.query.all()
164 components_names = [component.name for component in components] 164 components_names = [component.name for component in components]
165 165
166 if current_user.is_authenticated: 166 if current_user.is_authenticated:
167 username = current_user.username 167 username = current_user.username
168 users_data = User.query.all() 168 users_data = User.query.all()
169 else: 169 else:
170 username = '' 170 username = ''
171 171
172 172
173 # Отримання значення пошукового запиту з параметрів URL 173 # Отримання значення пошукового запиту з параметрів URL
174 search_query = request.args.get('search_query') 174 search_query = request.args.get('search_query')
175 #print(search_query) 175 #print(search_query)
176 filtered_components = [] 176 filtered_components = []
177 if search_query: 177 if search_query:
178 filtered_components = [component for component in component_server if 178 filtered_components = [component for component in component_server if
179 (search_query.lower() in component['name'].lower() if component['name'] else False) or 179 (search_query.lower() in component['name'].lower() if component['name'] else False) or
180 (search_query.lower() in component['description'].lower() if component[ 180 (search_query.lower() in component['description'].lower() if component[
181 'description'] else False)] 181 'description'] else False)]
182 else: 182 else:
183 filtered_components = component_server 183 filtered_components = component_server
184 184
185 return render_template('dashboard.html', username=username, users=users_data, components=components, 185 return render_template('dashboard.html', username=username, users=users_data, components=components,
186 components_names=components_names, component_server=filtered_components, 186 components_names=components_names, component_server=filtered_components,
187 search_query=search_query) 187 search_query=search_query)
188 188
189 @components_bp.route('/show_components/<string:component_id>') 189 @components_bp.route('/show_components/<string:component_id>')
190 @login_required 190 @login_required
191 def show_components(component_id): 191 def show_components(component_id):
192 response = requests.get('http://127.0.0.1:8001/api/components') 192 response = requests.get('http://127.0.0.1:8001/api/components')
193 json_data = response.json() 193 json_data = response.json()
194 selected_component = next((component for component in json_data if component['id'] == component_id), None) 194 selected_component = next((component for component in json_data if component['id'] == component_id), None)
195 return render_template('component-info.html', selected_component=selected_component) 195 return render_template('component-info.html', selected_component=selected_component)
196 196
197 @components_bp.route('/install_components_bl/<string:component_id>') 197 @components_bp.route('/install_components_bl/<string:component_id>')
198 @login_required 198 @login_required
199 def install_components_bl(component_id): 199 def install_components_bl(component_id):
200 # Шлях до головної папки проекту 200 # Шлях до головної папки проекту
201 project_folder = 'components' 201 project_folder = 'components'
202 #component = Component.get_repository_by_id(component_id) 202 #component = Component.get_repository_by_id(component_id)
203 response = requests.get('http://127.0.0.1:8001/api/components') 203 response = requests.get('http://127.0.0.1:8001/api/components')
204 json_data = response.json() 204 json_data = response.json()
205 selected_component = next((component for component in json_data if component['id'] == component_id), None) 205 selected_component = next((component for component in json_data if component['id'] == component_id), None)
206 # Назва репозиторія 206 # Назва репозиторія
207 repository_name = selected_component['name'] 207 repository_name = selected_component['name']
208 # Шлях до папки репозиторія в межах проекту 208 # Шлях до папки репозиторія в межах проекту
209 repository_folder = os.path.join(project_folder, repository_name) 209 repository_folder = os.path.join(project_folder, repository_name)
210 # URL репозиторія 210 # URL репозиторія
211 211
212 212
213 git_repo_url = selected_component['git_link'] 213 git_repo_url = selected_component['git_link']
214 try: 214 try:
215 # Перевірка наявності папки репозиторія 215 # Перевірка наявності папки репозиторія
216 if not os.path.exists(repository_folder): 216 if not os.path.exists(repository_folder):
217 # Створення папки репозиторія 217 # Створення папки репозиторія
218 os.makedirs(repository_folder) 218 os.makedirs(repository_folder)
219 # Шлях до файлу __init__.py 219 # Шлях до файлу __init__.py
220 init_file = os.path.join(repository_folder, '__init__.py') 220 init_file = os.path.join(repository_folder, '__init__.py')
221 # Перевірка наявності файлу __init__.py 221 # Перевірка наявності файлу __init__.py
222 if not os.path.exists(init_file): 222 if not os.path.exists(init_file):
223 # Створення пустого файлу __init__.py 223 # Створення пустого файлу __init__.py
224 open(init_file, 'a').close() 224 open(init_file, 'a').close()
225 #підключення до приватного репозиторію 225 #підключення до приватного репозиторію
226 #os.environ['GITLAB_PRIVATE_TOKEN'] = '8xxTpxrKVDGoXD5ynjiW' 226 #os.environ['GITLAB_PRIVATE_TOKEN'] = '8xxTpxrKVDGoXD5ynjiW'
227 #git_repo_url_with_token = git_repo_url.replace('https://', 227 #git_repo_url_with_token = git_repo_url.replace('https://',
228 # f'https://oauth2:{os.environ["GITLAB_PRIVATE_TOKEN"]}@') 228 # f'https://oauth2:{os.environ["GITLAB_PRIVATE_TOKEN"]}@')
229 229
230 # Команда для встановлення з використанням git_repo_url і повного шляху до папки репозиторія 230 # Команда для встановлення з використанням git_repo_url і повного шляху до папки репозиторія
231 command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url, '--target=' + repository_folder] 231 command = ['venv/Scripts/python.exe', '-m', 'pip', 'install', '--use-pep517', 'git+' + git_repo_url, '--target=' + repository_folder]
232 # Виконуємо команду встановлення 232 # Виконуємо команду встановлення
233 subprocess.check_call(command) 233 subprocess.check_call(command)
234 234
235 # Шлях до файлу, до якого потрібно додати код 235 # Шлях до файлу, до якого потрібно додати код
236 file_path = 'routes.py' 236 file_path = 'routes.py'
237 # Код, який потрібно додати 237 # Код, який потрібно додати
238 code = selected_component['dependencies'] 238 code = selected_component['dependencies']
239 # Відкриття файлу у режимі дозапису 239 # Відкриття файлу у режимі дозапису
240 with open(file_path, 'a') as file: 240 with open(file_path, 'a') as file:
241 # Запис нового коду у файл 241 # Запис нового коду у файл
242 file.write('\n') 242 file.write('\n')
243 file.write(code) 243 file.write(code)
244 file.write('\n') 244 file.write('\n')
245 component = Component.query.filter_by(name=selected_component['name']).first() 245 component = Component.query.filter_by(name=selected_component['name']).first()
246 if not component: 246 if not component:
247 new_component = Component( 247 new_component = Component(
248 name=selected_component['name'], 248 name=selected_component['name'],
249 description=selected_component['description'], 249 description=selected_component['description'],
250 version=selected_component['version'], 250 version=selected_component['version'],
251 git_link=selected_component['git_link'], 251 git_link=selected_component['git_link'],
252 dependencies=selected_component['dependencies'], 252 dependencies=selected_component['dependencies'],
253 installed=True 253 installed=True
254 ) 254 )
255 # Add the new component to the database 255 # Add the new component to the database
256 db.session.add(new_component) 256 db.session.add(new_component)
257 db.session.commit() 257 db.session.commit()
258 258
259 # Повертаємо повідомлення про успішне встановлення 259 # Повертаємо повідомлення про успішне встановлення
260 return f'Installed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 260 return f'Installed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
261 except subprocess.CalledProcessError as e: 261 except subprocess.CalledProcessError as e:
262 return 'Error installing : ' + str(e) 262 return 'Error installing : ' + str(e)
263 263
264 264
265 import os 265 import os
266 import requests 266 import requests
267 import shutil 267 import shutil
268 import subprocess 268 import subprocess
269 from flask import current_app 269 from flask import current_app
270 270
271 271
272 @components_bp.route('/install_components/<string:component_id>') 272 @components_bp.route('/install_components/<string:component_id>')
273 @login_required 273 @login_required
274 def install_component_from_archive(component_id): 274 def install_component_from_archive(component_id):
275 # Шлях до головної папки проекту 275 # Шлях до головної папки проекту
276 project_folder = 'components' 276 project_folder = 'components'
277 # Отримати відповідну компоненту зі списку компонент 277 # Отримати відповідну компоненту зі списку компонент
278 response = requests.get('http://127.0.0.1:8001/api/components') 278 response = requests.get('http://127.0.0.1:8001/api/components')
279 json_data = response.json() 279 json_data = response.json()
280 selected_component = next((component for component in json_data if component['id'] == component_id), None) 280 selected_component = next((component for component in json_data if component['id'] == component_id), None)
281 if selected_component is None: 281 if selected_component is None:
282 return 'Component not found' 282 return 'Component not found'
283 # Отримати посилання на архів компоненти та версію 283 # Отримати посилання на архів компоненти та версію
284 archive_url = selected_component['latest_component_data'] 284 archive_url = selected_component['latest_component_data']
285 version = selected_component['latest_version'] 285 version = selected_component['latest_version']
286 try: 286 try:
287 # Створити шлях до папки компоненти згідно назви та версії 287 # Створити шлях до папки компоненти згідно назви та версії
288 component_folder = os.path.join(project_folder) 288 component_folder = os.path.join(project_folder)
289 os.makedirs(component_folder, exist_ok=True) 289 os.makedirs(component_folder, exist_ok=True)
290 # Завантажити архів компоненти 290 # Завантажити архів компоненти
291 response = requests.get(archive_url, stream=True) 291 response = requests.get(archive_url, stream=True)
292 response.raise_for_status() 292 response.raise_for_status()
293 # Шлях до завантаженого архіву 293 # Шлях до завантаженого архіву
294 archive_path = os.path.join(component_folder, f"{selected_component['name']}.zip") 294 archive_path = os.path.join(component_folder, f"{selected_component['name']}.zip")
295 # Зберегти архів на диск 295 # Зберегти архів на диск
296 with open(archive_path, "wb") as file: 296 with open(archive_path, "wb") as file:
297 for chunk in response.iter_content(chunk_size=8192): 297 for chunk in response.iter_content(chunk_size=8192):
298 file.write(chunk) 298 file.write(chunk)
299 # Розпакувати архів 299 # Розпакувати архів
300 with zipfile.ZipFile(archive_path, "r") as zip_ref: 300 with zipfile.ZipFile(archive_path, "r") as zip_ref:
301 zip_ref.extractall(component_folder) 301 zip_ref.extractall(component_folder)
302 # Видалити архів 302 # Видалити архів
303 os.remove(archive_path) 303 os.remove(archive_path)
304 # Встановити залежності з файлу requirements.txt 304 # Встановити залежності з файлу requirements.txt
305 requirements_file = os.path.join(component_folder, "requirements.txt") 305 requirements_file = os.path.join(component_folder, "requirements.txt")
306 if os.path.isfile(requirements_file): 306 if os.path.isfile(requirements_file):
307 pip_command = f"{current_app.config['VENV_BIN_PATH']}/python -m pip install -r {requirements_file}" 307 pip_command = f"{current_app.config['VENV_BIN_PATH']}/python -m pip install -r {requirements_file}"
308 subprocess.run(pip_command, shell=True, check=True) 308 subprocess.run(pip_command, shell=True, check=True)
309 # Шлях до файлу, до якого потрібно додати код 309 # Шлях до файлу, до якого потрібно додати код
310 file_path = 'routes.py' 310 file_path = 'routes.py'
311 # Код, який потрібно додати 311 # Код, який потрібно додати
312 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']}')''' 312 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']}')'''
313 #selected_component['dependencies'] 313 #selected_component['dependencies']
314 314
315 # Відкриття файлу у режимі дозапису 315 # Відкриття файлу у режимі дозапису
316 with open(file_path, 'a') as file: 316 with open(file_path, 'a') as file:
317 # Запис нового коду у файл 317 # Запис нового коду у файл
318 file.write('\n') 318 file.write('\n')
319 file.write(code) 319 file.write(code)
320 file.write('\n') 320 file.write('\n')
321 321
322 # Оновити базу даних з встановленою компонентою 322 # Оновити базу даних з встановленою компонентою
323 component = Component.query.filter_by(name=selected_component['name']).first() 323 component = Component.query.filter_by(name=selected_component['name']).first()
324 if not component: 324 if not component:
325 component = Component( 325 component = Component(
326 name=selected_component['name'], 326 name=selected_component['name'],
327 description=selected_component['description'], 327 description=selected_component['description'],
328 version=version, 328 version=version,
329 git_link=selected_component['git_link'], 329 git_link=selected_component['git_link'],
330 dependencies=selected_component['dependencies'], 330 dependencies=code,
331 installed=True 331 installed=True
332 ) 332 )
333 db.session.add(component) 333 db.session.add(component)
334 else: 334 else:
335 component.version = version 335 component.version = version
336 component.git_link = selected_component['git_link'] 336 component.git_link = selected_component['git_link']
337 component.dependencies = selected_component['dependencies'] 337 component.dependencies = code
338 component.installed = True 338 component.installed = True
339 339
340 db.session.commit() 340 db.session.commit()
341 341
342 return f'Component installed successfully: {selected_component["name"]} v{version} <meta http-equiv="refresh" content="1;url=/dashboard" />' 342 return f'Component installed successfully: {selected_component["name"]} v{version} <meta http-equiv="refresh" content="1;url=/dashboard" />'
343 343
344 except Exception as e: 344 except Exception as e:
345 return f'Error installing component: {str(e)}' 345 return f'Error installing component: {str(e)}'
346 346
347 347
348 @components_bp.route('/remove_dependencies/<string:component_id>', methods=['GET']) 348 @components_bp.route('/remove_dependencies/<string:component_id>', methods=['GET'])
349 @login_required 349 @login_required
350 def remove_dependencies(component_id): 350 def remove_dependencies(component_id):
351 351
352 # Знаходимо компоненту за її ID 352 # Знаходимо компоненту за її ID
353 component = Component.query.get(component_id) 353 component = Component.query.get(component_id)
354 if not component: 354 if not component:
355 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 355 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
356 356
357 # Шлях до файлу, з якого потрібно видалити залежності 357 # Шлях до файлу, з якого потрібно видалити залежності
358 file_path = 'routes.py' 358 file_path = 'routes.py'
359 359
360 # Зчитуємо вміст файлу 360 # Зчитуємо вміст файлу
361 with open(file_path, 'r') as file: 361 with open(file_path, 'r') as file:
362 lines = file.readlines() 362 lines = file.readlines()
363 363
364 # Видаляємо рядки, що містять залежності компоненти 364 # Видаляємо рядки, що містять залежності компоненти
365 updated_lines = [line for line in lines if line.strip() not in component.dependencies] 365 updated_lines = [line for line in lines if line.strip() not in component.dependencies]
366 366
367 # Записуємо оновлений вміст у файл 367 # Записуємо оновлений вміст у файл
368 with open(file_path, 'w') as file: 368 with open(file_path, 'w') as file:
369 file.writelines(updated_lines) 369 file.writelines(updated_lines)
370 370
371 # Оновлюємо статус компоненти 371 # Оновлюємо статус компоненти
372 component.installed = False 372 component.installed = False
373 db.session.commit() 373 db.session.commit()
374 374
375 return 'Dependencies removed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 375 return 'Dependencies removed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
376 376
377 @components_bp.route('/add_dependencies/<string:component_id>', methods=['GET']) 377 @components_bp.route('/add_dependencies/<string:component_id>', methods=['GET'])
378 @login_required 378 @login_required
379 def add_dependencies(component_id): 379 def add_dependencies(component_id):
380 380
381 # Знаходимо компоненту за її ID 381 # Знаходимо компоненту за її ID
382 component = Component.query.get(component_id) 382 component = Component.query.get(component_id)
383 if not component: 383 if not component:
384 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />' 384 return 'Component not found <meta http-equiv="refresh" content="1;url=/dashboard" />'
385 385
386 # Шлях до файлу, з якого потрібно видалити залежності 386 # Шлях до файлу, з якого потрібно видалити залежності
387 file_path = 'routes.py' 387 file_path = 'routes.py'
388 code = component.dependencies 388 code = component.dependencies
389 # Відкриття файлу у режимі дозапису 389 # Відкриття файлу у режимі дозапису
390 with open(file_path, 'a') as file: 390 with open(file_path, 'a') as file:
391 # Запис нового коду у файл 391 # Запис нового коду у файл
392 file.write(code) 392 file.write(code)
393 393
394 # Оновлюємо статус компоненти 394 # Оновлюємо статус компоненти
395 component.installed = True 395 component.installed = True
396 db.session.commit() 396 db.session.commit()
397 return 'Dependencies added successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 397 return 'Dependencies added successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
398 398
399 @components_bp.route('/remove-component/<string:component_id>') 399 @components_bp.route('/remove-component/<string:component_id>')
400 @login_required 400 @login_required
401 def remove_component(component_id): 401 def remove_component(component_id):
402 # Шлях до головної папки проекту 402 # Шлях до головної папки проекту
403 project_folder = 'components' 403 project_folder = 'components'
404 component = Component.query.get(component_id) 404 component = Component.query.get(component_id)
405 # Назва репозиторія 405 # Назва репозиторія
406 repository_name = component.name 406 repository_name = component.name
407 # Шлях до папки репозиторія в межах проекту 407 # Шлях до папки репозиторія в межах проекту
408 repository_folder = os.path.join(project_folder, repository_name) 408 repository_folder = os.path.join(project_folder, repository_name)
409 try: 409 try:
410 # Перевірка наявності папки репозиторія 410 # Перевірка наявності папки репозиторія
411 if os.path.exists(repository_folder): 411 if os.path.exists(repository_folder):
412 # Видалення папки репозиторія 412 # Видалення папки репозиторія
413 shutil.rmtree(repository_folder) 413 shutil.rmtree(repository_folder)
414 # Видаляємо компоненту з бази 414 # Видаляємо компоненту з бази
415 if component: 415 if component:
416 db.session.delete(component) 416 db.session.delete(component)
417 db.session.commit() 417 db.session.commit()
418 418
419 # Повертаємо повідомлення про успішне видалення 419 # Повертаємо повідомлення про успішне видалення
420 return 'Component removed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />' 420 return 'Component removed successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
421 except Exception as e: 421 except Exception as e:
422 # Повертаємо повідомлення про помилку видалення 422 # Повертаємо повідомлення про помилку видалення
423 return 'Error removing component: ' + str(e) 423 return 'Error removing component: ' + str(e)
424 app.register_blueprint(components_bp) 424 app.register_blueprint(components_bp)
1 from flask import Flask 1 from flask import Flask
2 #app = Flask(__name__) 2 #app = Flask(__name__)
3 from main import app 3 from main import app
4 from components.k2test.k2test.views import k2test
5 app.register_blueprint(k2test, url_prefix='/k2test')
6 4