Commit a22c466d91e61d9104eae5088b9b557e7f00638b

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

add update server, fix upd bags

Showing 30 changed files with 162 additions and 36 deletions Side-by-side Diff

__pycache__/app.cpython-310.pyc
No preview for this file type
__pycache__/routes.cpython-310.pyc
No preview for this file type
... ... @@ -32,6 +32,8 @@
32 32 @app.context_processor
33 33 def inject_static_variable():
34 34 return {'menu': k2.menu}
  35 +#platform
  36 +k2.platform =k2.get_platform()
35 37  
36 38 # flask routing
37 39 from routes import *
components/k2test/README.md
  1 +Base k2 component
  2 +
  3 +language - .mo, .po files with translates
  4 +
  5 +static - css, js, mediafiles
  6 +
  7 +templates - components templates
  8 +
  9 +views.py - routes
  10 +
  11 +history.txt -
  12 +
  13 +reguirments-components.txt -
  14 +
  15 +requirements.txt -
  16 +
  17 +setup.py -
components/k2test/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/k2test/history.txt
  1 +1.0.0.0 base component
  2 +1.0.0.1 add some routes
components/k2test/k2test/__pycache__/__init__.cpython-310.pyc
No preview for this file type
components/k2test/k2test/__pycache__/views.cpython-310.pyc
No preview for this file type
components/k2test/k2test/languages/en/LC_MESSAGES/messages.mo
No preview for this file type
components/k2test/k2test/languages/en/LC_MESSAGES/messages.po
  1 +msgid "New 2 page"
  2 +msgstr "Нова сторінка 2"
  3 +msgid "title_menu_items"
  4 +msgstr "Test menu items"
components/k2test/k2test/languages/uk/LC_MESSAGES/messages.mo
No preview for this file type
components/k2test/k2test/languages/uk/LC_MESSAGES/messages.po
  1 +msgid "New 2 page"
  2 +msgstr "Нова сторінка 2"
  3 +msgid "title_menu_items"
  4 +msgstr "Тестова компонента"
components/k2test/k2test/templates/new2.html
  1 +
  2 +
  3 +<h2>{{ _('New 2 page') }}</h2>
components/k2test/k2test/views.py
  1 +from flask import render_template, redirect, request, jsonify
  2 +from flask_babel import gettext
  3 +from flask_login import login_user, current_user, logout_user, login_required
  4 +from flask import current_app as k2
  5 +from flask import Blueprint, json
  6 +from flask_sqlalchemy import SQLAlchemy
  7 +
  8 +
  9 +#bliueprint
  10 +k2test = Blueprint('k2test', __name__, template_folder='templates', static_folder='static')
  11 +
  12 +#component routes
  13 +@k2test.route('/new')
  14 +def new_component():
  15 + db = k2.extensions['sqlalchemy'].db
  16 + connection = db.engine.connect()
  17 + query = db.text("SELECT email, login FROM k2users")
  18 + result = connection.execute(query).fetchall()
  19 + rows = [dict(email=row.email, login=row.login) for row in result]
  20 + # Перетворення результату на JSON
  21 + json_result = json.dumps(rows)
  22 + return json_result
  23 +
  24 +@k2test.route('/new2')
  25 +def new_component2():
  26 + return render_template('new2.html')
  27 +
  28 +@k2test.route('/new3')
  29 +def new_component3():
  30 + return jsonify({'data': 'page new3'})
  31 +
  32 +@k2test.route('/new4')
  33 +def new_component4():
  34 + return jsonify({'data': 'page new4'})
  35 +
  36 +# menu items for admin
  37 +@k2test.route('/menu-admin-items')
  38 +def menu_items():
  39 + data = [
  40 + {
  41 + 'title': f"{gettext('title_menu_items')}",
  42 + 'icon': {'icon': 'mdi-chart-timeline-variant'},
  43 + 'children': [
  44 + {'title': 'Тест 3', 'to': 'k2test-new3'},
  45 + {'title': 'Тест 3', 'to': 'k2test-new4'},
  46 + ],
  47 + }
  48 +
  49 + ]
  50 + return data
components/k2test/reguirments-components.txt
  1 +grid==1.0.1
components/k2test/requirements.txt
  1 +Flask-Login==0.6.2
components/k2test/setup.py
  1 +from setuptools import setup, find_packages
  2 +
  3 +setup(
  4 + name='k2test',
  5 + version='1.0.0.8',
  6 + description='Description of my project version 1.0.0.8',
  7 + author='k2 cloud',
  8 + author_email='rs@corp2.net',
  9 + keywords="k2test, k2",
  10 + python_requires=">=3.7, <=3.11.2",
  11 + packages=['k2test'],
  12 + package_data={ # Optional
  13 + },
  14 + install_requires=[""],
  15 +)
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__/k2obj.cpython-310.pyc
No preview for this file type
k2/__pycache__/k2rout.cpython-310.pyc
No preview for this file type
... ... @@ -42,8 +42,12 @@
42 42 WHERE prava.roleid = '{roleid}'
43 43 """
44 44 result = db.session.execute(db.text(menu_query)).fetchall()
45   - menu_items = [item[0].decode('utf-8') for item in result]
46   - return menu_items
  45 + if k2.platform == 'Linux':
  46 + menu_items = [item[0] for item in result]
  47 + return menu_items
  48 + elif k2.platform == 'Windows':
  49 + menu_items = [item[0].decode('utf-8')for item in result]
  50 + return menu_items
47 51  
48 52 class K2admin_Menus_Prava(db.Model):
49 53 __tablename__ = 'k2admin_menus_prava'
... ... @@ -9,13 +9,13 @@
9 9 import sys
10 10 from flask import session, request
11 11 from flask_login import LoginManager
  12 +import platform
12 13  
13   -
14 14 class k2(k2obj):
15 15 version = '2.5.1.27'
16 16 db = SQLAlchemy()
17 17 domain = 'http://127.0.0.1:5000/'
18   - update_domain = 'http://127.0.0.1:8000/' #'http://185.174.172.137/'
  18 + update_domain = 'http://192.168.20.229/' #'http://185.174.172.137/'
19 19 venv_bin_path = os.path.join(os.path.dirname(sys.prefix), 'venv/Scripts') #for windows
20 20 #venv_bin_path = os.path.join(os.path.dirname(sys.prefix), 'venv/bin') #for linux
21 21 json_sort_keys = False
... ... @@ -87,4 +87,9 @@
87 87 def init_lm(self, app):
88 88 # Initialize LoginManager
89 89 self.login_manager.init_app(app)
  90 + @classmethod
  91 + def get_platform(cls):
  92 + operating_system = platform.system()
  93 + cls.platform = operating_system
  94 + return cls.platform
... ... @@ -18,4 +18,5 @@
18 18 }
19 19 languages = ''
20 20 components = ''
  21 + platform = ''
... ... @@ -17,6 +17,7 @@
17 17 from sqlalchemy import text
18 18 from flask_jwt_extended import get_jwt_identity, jwt_required
19 19 from flask_login import login_user, current_user, logout_user, login_required
  20 +import platform
20 21  
21 22  
22 23 # initialize db
... ... @@ -83,7 +84,7 @@
83 84 components = Component.query.all()
84 85 components_names = [component.name for component in components]
85 86 if 'k2site' in components_names:
86   - return redirect(url_for('k2site.new_component2')) #змінити на ендпоінт головної k2site
  87 + return redirect(url_for('components.component_add_dasb')) #змінити на ендпоінт головної k2site
87 88 else:
88 89 return redirect('/dashboard')
89 90  
... ... @@ -115,7 +116,7 @@
115 116 components_names = []
116 117 components_names = [component.name for component in components]
117 118 if 'k2site' in components_names:
118   - return redirect(url_for('components.component_list_dasb')) # змінити на ендпоінт головної k2site
  119 + return redirect(url_for('components.home'))
119 120 else:
120 121 # Компоненти доступні для встановлення
121 122 # GET-запит до API
... ... @@ -277,7 +278,7 @@
277 278 if component_name == 'k2grid_base':
278 279 code = f'''from components.{selected_component['name']}.{selected_component['name']}.views import {selected_component['name']}\napp.register_blueprint({selected_component['name']}, url_prefix='/')'''
279 280 elif component_name == 'k2site':
280   - 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']}')\nlogin_manager = k2().init_lm(app)'''
  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']}')'''
281 282 else:
282 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']}')'''
283 284  
284 285  
285 286  
286 287  
... ... @@ -322,29 +323,29 @@
322 323  
323 324 @components_bp.route('/install-requirments/<string:selected_component_name>', methods=['GET'])
324 325 def install_requirments(selected_component_name):
325   - # menu items
326   - get_admin_menu()
327 326  
  327 + try:
  328 + if k2.platform == 'Windows':
  329 + # install requirements for windows
  330 + 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")
  332 + if os.path.isfile(requirements_file):
  333 + pip_command = f"{venv_bin_path}/python -m pip install -r {requirements_file}"
  334 + subprocess.run(pip_command, shell=True, check=True)
  335 + elif k2.platform == 'Linux':
  336 + #install requirements for linux
  337 + 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")
  339 + if os.path.isfile(requirements_file):
  340 + pip_command = f"{venv_bin_path}/python3 -m pip install -r {requirements_file}"
  341 + subprocess.run(pip_command, shell=True, check=True)
328 342  
329   - ## install requirements for windows
330   - #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")
332   - #if os.path.isfile(requirements_file):
333   - # pip_command = f"{venv_bin_path}/python -m pip install -r {requirements_file}"
334   - # subprocess.run(pip_command, shell=True, check=True)
  343 + return f'''Requirements installed successfully
  344 + \n \n please wait installing requirments components...
  345 + <meta http-equiv="refresh" content="1;url=/install-requirments-components" />'''
  346 + except Exception as e:
  347 + return f'Error installing requirmets: {str(e)}'
335 348  
336   - #install requirements for linux
337   - 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")
339   - if os.path.isfile(requirements_file):
340   - pip_command = f"{venv_bin_path}/python3 -m pip install -r {requirements_file}"
341   - subprocess.run(pip_command, shell=True, check=True)
342   -
343   - return f'''Requirements installed successfully
344   - \n \n please wait installing requirments components...
345   - <meta http-equiv="refresh" content="1;url=/install-requirments-components" />'''
346   -
347   -
348 349 @components_bp.route('/install-requirments-components')
349 350 def install_requirements_components():
350 351 # Откриття файлу requirements_components.txt
... ... @@ -386,7 +387,7 @@
386 387  
387 388 component.installed = False
388 389 db.session.commit()
389   - response = requests.get(f"{k2.domain}/k2site/new_component2")
  390 +
390 391 return 'Component successfully turn off <meta http-equiv="refresh" content="1;url=/dashboard" />'
391 392  
392 393  
... ... @@ -407,7 +408,7 @@
407 408 # Оновлюємо статус компоненти
408 409 component.installed = True
409 410 db.session.commit()
410   - response = requests.get(f"{k2.domain}/k2site/new_component2")
  411 +
411 412 return 'Dependencies added successfully <meta http-equiv="refresh" content="1;url=/dashboard" />'
412 413  
413 414  
... ... @@ -435,7 +436,7 @@
435 436 except Exception as e:
436 437 # Повертаємо повідомлення про помилку видалення
437 438 return 'Error removing component: ' + str(e)
438   - response = requests.get(f"{k2.domain}/k2site/new_component2")
  439 +
439 440  
440 441  
441 442 # @components_bp.route('/component/add')
... ... @@ -515,7 +516,6 @@
515 516 filter_menu = []
516 517 response = requests.get(f"{k2.domain}api/add-to-menu")
517 518 menu_items_list = K2admin_menus.get_menu_items_by_roles(role_id)
518   - #print(menu_items_list)
519 519 for item in response.json():
520 520 filtered_children = []
521 521 for im in item['children']:
522 522  
... ... @@ -587,9 +587,10 @@
587 587 filtered_components = component_server
588 588 components = Component.query.all()
589 589 components_names = [component.name for component in components]
  590 + components_version = [{component.name: component.version} for component in components]
590 591  
591 592 return render_template('dashboard-add.html',
592   - component_server=filtered_components, search_query=search_query, components_names=components_names )
  593 + component_server=filtered_components, search_query=search_query, components_names=components_names, components_version=components_version )
593 594  
594 595  
595 596  
languages/babel_translation_directories.yml
1   -babel_translation_directories: languages;components/k2site/k2site/languages;components/k2adm/k2adm/languages;components/k2test/k2test/languages;components/k2grid_base/k2grid_base/languages
  1 +babel_translation_directories: languages;components/k2site/k2site/languages;components/k2test/k2test/languages
... ... @@ -4,4 +4,6 @@
4 4 from k2.k2cfg import k2
5 5 app.register_blueprint(components_bp)
6 6 #k2grid_base
  7 +from components.k2test.k2test.views import k2test
  8 +app.register_blueprint(k2test, url_prefix='/k2test')
static/css/style.css
... ... @@ -61,4 +61,8 @@
61 61 opacity: 0;
62 62 }
63 63 }
  64 +
  65 +.update_avaible {
  66 +color: #eca80c;
  67 +}
templates/dashboard-add.html
... ... @@ -51,6 +51,14 @@
51 51 <h2>{{ component.name|title }}</h2>
52 52 <p>{{ component.description }}</p>
53 53 <p>version {{ component.latest_version }}</p>
  54 + {% for component_upd_ver in components_version %}
  55 + {% for key, value in component_upd_ver.items() %}
  56 + {% if key == component.name and value < component.latest_version %}
  57 + <p class="update_avaible"> Update avaible</p>
  58 + {% endif %}
  59 + {% endfor %}
  60 + {% endfor %}
  61 +
54 62 {% if component.name in components_names %}
55 63 <button type="button" class="btn btn-success">Installed</button>
56 64 {% else %}
... ... @@ -68,7 +76,6 @@
68 76 </div>
69 77  
70 78 {% endblock %}
71   -
72 79  
73 80 </div>