q2rad 0.1.166__py3-none-any.whl → 0.1.168__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of q2rad might be problematic. Click here for more details.
- q2rad/q2appmanager.py +3 -2
- q2rad/q2appselector.py +31 -41
- q2rad/q2make.py +119 -0
- q2rad/q2rad.py +83 -78
- q2rad/q2utils.py +11 -1
- q2rad/version.py +1 -1
- {q2rad-0.1.166.dist-info → q2rad-0.1.168.dist-info}/METADATA +1 -1
- {q2rad-0.1.166.dist-info → q2rad-0.1.168.dist-info}/RECORD +11 -10
- {q2rad-0.1.166.dist-info → q2rad-0.1.168.dist-info}/LICENSE +0 -0
- {q2rad-0.1.166.dist-info → q2rad-0.1.168.dist-info}/WHEEL +0 -0
- {q2rad-0.1.166.dist-info → q2rad-0.1.168.dist-info}/entry_points.txt +0 -0
q2rad/q2appmanager.py
CHANGED
|
@@ -357,8 +357,9 @@ class AppManager(Q2Form):
|
|
|
357
357
|
self.q2_app.open_selected_app()
|
|
358
358
|
|
|
359
359
|
@staticmethod
|
|
360
|
-
def import_json_app(data):
|
|
361
|
-
db
|
|
360
|
+
def import_json_app(data, db = None):
|
|
361
|
+
if db is None:
|
|
362
|
+
db: Q2Db = q2app.q2_app.db_logic
|
|
362
363
|
db_tables = db.get_tables()
|
|
363
364
|
wait_table = Q2WaitShow(len(data))
|
|
364
365
|
errors = []
|
q2rad/q2appselector.py
CHANGED
|
@@ -39,23 +39,23 @@ _ = gettext.gettext
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class Q2AppSelect(Q2Form):
|
|
42
|
-
def __init__(self,
|
|
42
|
+
def __init__(self, db_file_path="q2apps.sqlite"):
|
|
43
|
+
self.db_file_path = db_file_path
|
|
43
44
|
super().__init__(_("Select application"))
|
|
44
45
|
self.selected_application = {}
|
|
45
46
|
self.no_view_action = True
|
|
46
47
|
self.autoload_enabled = True
|
|
47
48
|
|
|
48
49
|
def on_init(self):
|
|
49
|
-
q2_app: Q2App = q2app.q2_app
|
|
50
|
-
q2_app.clear_menu()
|
|
51
|
-
q2_app.build_menu()
|
|
52
|
-
q2_app.hide_menubar()
|
|
53
|
-
q2_app.hide_toolbar()
|
|
54
|
-
q2_app.hide_statusbar()
|
|
55
|
-
q2_app.hide_tabbar()
|
|
56
|
-
|
|
57
|
-
self.db = Q2Db(database_name=
|
|
58
|
-
|
|
50
|
+
# q2_app: Q2App = q2app.q2_app
|
|
51
|
+
# q2_app.clear_menu()
|
|
52
|
+
# q2_app.build_menu()
|
|
53
|
+
# q2_app.hide_menubar()
|
|
54
|
+
# q2_app.hide_toolbar()
|
|
55
|
+
# q2_app.hide_statusbar()
|
|
56
|
+
# q2_app.hide_tabbar()
|
|
57
|
+
|
|
58
|
+
self.db = Q2Db(database_name=self.db_file_path)
|
|
59
59
|
self.define_form()
|
|
60
60
|
|
|
61
61
|
data_schema = Q2DbSchema()
|
|
@@ -84,9 +84,7 @@ class Q2AppSelect(Q2Form):
|
|
|
84
84
|
def driverDataValid(self=self):
|
|
85
85
|
self.w.host_data.set_enabled(self.s.driver_data != "Sqlite")
|
|
86
86
|
self.w.port_data.set_enabled(self.s.driver_data != "Sqlite")
|
|
87
|
-
self.w.select_data_storage_file.set_enabled(
|
|
88
|
-
self.s.driver_data == "Sqlite"
|
|
89
|
-
)
|
|
87
|
+
self.w.select_data_storage_file.set_enabled(self.s.driver_data == "Sqlite")
|
|
90
88
|
|
|
91
89
|
self.add_control(
|
|
92
90
|
"driver_data",
|
|
@@ -116,12 +114,8 @@ class Q2AppSelect(Q2Form):
|
|
|
116
114
|
)
|
|
117
115
|
self.add_control("/")
|
|
118
116
|
if self.add_control("/h"):
|
|
119
|
-
self.add_control(
|
|
120
|
-
|
|
121
|
-
)
|
|
122
|
-
self.add_control(
|
|
123
|
-
"port_data", _("Port"), gridlabel=_("Data port"), datatype="int"
|
|
124
|
-
)
|
|
117
|
+
self.add_control("host_data", _("Host"), gridlabel=_("Data host"), datalen=100)
|
|
118
|
+
self.add_control("port_data", _("Port"), gridlabel=_("Data port"), datatype="int")
|
|
125
119
|
self.add_control(
|
|
126
120
|
"guest_mode",
|
|
127
121
|
_("Guest mode"),
|
|
@@ -139,9 +133,7 @@ class Q2AppSelect(Q2Form):
|
|
|
139
133
|
def driverLogicValid(form=self):
|
|
140
134
|
form.w.host_logic.set_enabled(form.s.driver_logic != "Sqlite")
|
|
141
135
|
form.w.port_logic.set_enabled(form.s.driver_logic != "Sqlite")
|
|
142
|
-
form.w.select_app_storage_file.set_enabled(
|
|
143
|
-
form.s.driver_logic == "Sqlite"
|
|
144
|
-
)
|
|
136
|
+
form.w.select_app_storage_file.set_enabled(form.s.driver_logic == "Sqlite")
|
|
145
137
|
|
|
146
138
|
self.add_control(
|
|
147
139
|
"driver_logic",
|
|
@@ -154,7 +146,6 @@ class Q2AppSelect(Q2Form):
|
|
|
154
146
|
valid=driverLogicValid,
|
|
155
147
|
)
|
|
156
148
|
if self.add_control("/h"):
|
|
157
|
-
|
|
158
149
|
self.add_control(
|
|
159
150
|
"database_logic",
|
|
160
151
|
"Database",
|
|
@@ -172,12 +163,8 @@ class Q2AppSelect(Q2Form):
|
|
|
172
163
|
)
|
|
173
164
|
self.add_control("/")
|
|
174
165
|
if self.add_control("/h"):
|
|
175
|
-
self.add_control(
|
|
176
|
-
|
|
177
|
-
)
|
|
178
|
-
self.add_control(
|
|
179
|
-
"port_logic", _("Port"), gridlabel=_("Logic port"), datatype="int"
|
|
180
|
-
)
|
|
166
|
+
self.add_control("host_logic", _("Host"), gridlabel=_("Logic host"), datalen=100)
|
|
167
|
+
self.add_control("port_logic", _("Port"), gridlabel=_("Logic port"), datatype="int")
|
|
181
168
|
self.add_control(
|
|
182
169
|
"dev_mode",
|
|
183
170
|
_("Dev mode"),
|
|
@@ -202,7 +189,7 @@ class Q2AppSelect(Q2Form):
|
|
|
202
189
|
icon="💚",
|
|
203
190
|
mess="Toggle autoload mark",
|
|
204
191
|
eof_disabled=1,
|
|
205
|
-
tag="#4dd0e1"
|
|
192
|
+
tag="#4dd0e1",
|
|
206
193
|
)
|
|
207
194
|
|
|
208
195
|
self.add_action(_("Demo"), self.run_demo)
|
|
@@ -240,24 +227,19 @@ class Q2AppSelect(Q2Form):
|
|
|
240
227
|
self.q2_app.sleep(0.2)
|
|
241
228
|
if self.q2_app.keyboard_modifiers() != "":
|
|
242
229
|
return
|
|
243
|
-
# if self.autoload_enabled:
|
|
244
|
-
# cu = q2cursor("select * from applications where autoselect<>''", self.db)
|
|
245
|
-
# if cu.row_count() > 0:
|
|
246
|
-
# self._select_application(cu.record(0))
|
|
247
|
-
# return False
|
|
248
230
|
if self.db.table("applications").row_count() <= 0:
|
|
249
|
-
if not os.path.isdir("
|
|
250
|
-
os.mkdir("
|
|
231
|
+
if not os.path.isdir("databases"):
|
|
232
|
+
os.mkdir("databases")
|
|
251
233
|
insert(
|
|
252
234
|
"applications",
|
|
253
235
|
{
|
|
254
236
|
"ordnum": 1,
|
|
255
237
|
"name": "My first app",
|
|
256
238
|
"driver_data": "Sqlite",
|
|
257
|
-
"database_data": "
|
|
239
|
+
"database_data": "databases/my_first_app_data_storage.sqlite",
|
|
258
240
|
"driver_logic": "Sqlite",
|
|
259
|
-
"database_logic": "
|
|
260
|
-
"dev_mode": "*"
|
|
241
|
+
"database_logic": "databases/my_first_app_logic_storage.sqlite",
|
|
242
|
+
"dev_mode": "*",
|
|
261
243
|
},
|
|
262
244
|
self.db,
|
|
263
245
|
)
|
|
@@ -339,6 +321,14 @@ class Q2AppSelect(Q2Form):
|
|
|
339
321
|
self._select_application(self.model.get_record(self.current_row))
|
|
340
322
|
|
|
341
323
|
def run(self, autoload_enabled=True):
|
|
324
|
+
q2_app: Q2App = q2app.q2_app
|
|
325
|
+
q2_app.clear_menu()
|
|
326
|
+
q2_app.build_menu()
|
|
327
|
+
q2_app.hide_menubar()
|
|
328
|
+
q2_app.hide_toolbar()
|
|
329
|
+
q2_app.hide_statusbar()
|
|
330
|
+
q2_app.hide_tabbar()
|
|
331
|
+
|
|
342
332
|
self.autoload_enabled = autoload_enabled
|
|
343
333
|
if autoload_enabled:
|
|
344
334
|
cu = q2cursor("select * from applications where autoselect<>''", self.db)
|
q2rad/q2make.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Copyright © 2021 Andrei Puchko
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import sys
|
|
17
|
+
import shutil
|
|
18
|
+
from q2terminal.q2terminal import Q2Terminal
|
|
19
|
+
from q2rad.q2utils import Q2Form, open_folder # noqa F401
|
|
20
|
+
from q2rad.q2raddb import q2cursor
|
|
21
|
+
from q2gui.q2dialogs import q2mess, q2wait, q2ask
|
|
22
|
+
from q2rad.q2appselector import Q2AppSelect
|
|
23
|
+
from q2db.db import Q2Db
|
|
24
|
+
from q2rad.q2appmanager import AppManager
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def create_q2apps_sqlite(dist_folder):
|
|
28
|
+
database_folder_name = "databases"
|
|
29
|
+
database_name_prefix = "app1"
|
|
30
|
+
appsel = Q2AppSelect(f"{dist_folder}/q2apps.sqlite")
|
|
31
|
+
appsel.db.insert(
|
|
32
|
+
"applications",
|
|
33
|
+
{
|
|
34
|
+
"ordnum": 1,
|
|
35
|
+
"name": appsel.q2_app.app_title,
|
|
36
|
+
"driver_data": "Sqlite",
|
|
37
|
+
"database_data": f"{database_folder_name}/{database_name_prefix}_data_storage.sqlite",
|
|
38
|
+
"driver_logic": "Sqlite",
|
|
39
|
+
"database_logic": f"{database_folder_name}/{database_name_prefix}_logic_storage.sqlite",
|
|
40
|
+
"autoselect": "*",
|
|
41
|
+
"dev_mode": "",
|
|
42
|
+
},
|
|
43
|
+
)
|
|
44
|
+
dababase_folder = f"{dist_folder}/{database_folder_name}"
|
|
45
|
+
if not os.path.isdir(dababase_folder):
|
|
46
|
+
os.mkdir(dababase_folder)
|
|
47
|
+
db_logic = Q2Db(
|
|
48
|
+
database_name=os.path.abspath(f"{dababase_folder}/{database_name_prefix}_logic_storage.sqlite")
|
|
49
|
+
)
|
|
50
|
+
appsel.q2_app.migrate_db_logic(db_logic)
|
|
51
|
+
AppManager().import_json_app(AppManager().get_app_json(), db_logic)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def make_binary(self):
|
|
55
|
+
form = Q2Form()
|
|
56
|
+
form.add_control("make_folder", "Working folder", datatype="char", data="make")
|
|
57
|
+
form.add_control("binary_name", "Application name", datatype="char", data="q2-app")
|
|
58
|
+
form.ok_button = 1
|
|
59
|
+
form.cancel_button = 1
|
|
60
|
+
form.show_form("Build binary")
|
|
61
|
+
if not form.ok_pressed:
|
|
62
|
+
return
|
|
63
|
+
|
|
64
|
+
if q2ask("Are you about to start buiding binary executable file of Q2RAD!<br>Are You Sure?") != 2:
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
make_folder = os.path.abspath(form.s.make_folder)
|
|
68
|
+
binary_name = form.s.binary_name
|
|
69
|
+
if not os.path.isdir(make_folder):
|
|
70
|
+
os.mkdir(make_folder)
|
|
71
|
+
if not os.path.isdir(make_folder):
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
main = "from q2rad.q2rad import Q2RadApp;app = Q2RadApp();app.run()"
|
|
75
|
+
open(f"{make_folder}/{binary_name}.py", "w").write(main)
|
|
76
|
+
|
|
77
|
+
dist_folder = os.path.abspath(f"{make_folder}\\dist\\{binary_name}")
|
|
78
|
+
|
|
79
|
+
terminal = Q2Terminal(callback=print)
|
|
80
|
+
pynstaller_executable = os.path.dirname(sys.executable) + "/pyinstaller"
|
|
81
|
+
|
|
82
|
+
if not os.path.isfile("poetry.lock"):
|
|
83
|
+
terminal.run(f"{pynstaller_executable} -v")
|
|
84
|
+
if terminal.exit_code != 0:
|
|
85
|
+
pip_executable = os.path.dirname(sys.executable) + "/pip"
|
|
86
|
+
terminal.run(f"{pip_executable} install pyinstaller")
|
|
87
|
+
if terminal.exit_code != 0:
|
|
88
|
+
q2mess("Pyinstaller not installed!")
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
packages = " ".join(
|
|
92
|
+
[
|
|
93
|
+
f" --collect-all {x['name']}"
|
|
94
|
+
for x in q2cursor(
|
|
95
|
+
"select package_name as name from packages where 'pyinstaller'<>package_name ",
|
|
96
|
+
self.db_logic,
|
|
97
|
+
).records()
|
|
98
|
+
]
|
|
99
|
+
)
|
|
100
|
+
packages += " --collect-all pip "
|
|
101
|
+
terminal.run(f"cd {make_folder}")
|
|
102
|
+
w = q2wait()
|
|
103
|
+
if not os.path.isfile(os.path.abspath(f"{make_folder}/q2rad.ico")):
|
|
104
|
+
shutil.copy("assets/q2rad.ico", os.path.abspath(f"{make_folder}/q2rad.ico"))
|
|
105
|
+
# run pyinstaller
|
|
106
|
+
terminal.run(f"{pynstaller_executable} -y --noconsole {packages} -i q2rad.ico {binary_name}.py")
|
|
107
|
+
|
|
108
|
+
if not os.path.isdir(os.path.abspath(f"{dist_folder}/assets")):
|
|
109
|
+
shutil.copytree("assets", os.path.abspath(f"{dist_folder}/assets"))
|
|
110
|
+
create_q2apps_sqlite(f"{dist_folder}")
|
|
111
|
+
|
|
112
|
+
w.close()
|
|
113
|
+
|
|
114
|
+
if terminal.exit_code != 0:
|
|
115
|
+
q2mess("Error occured while making binary! See output for details.")
|
|
116
|
+
else:
|
|
117
|
+
if q2ask(f"Success! You binary is located in <b>{dist_folder}</b> <br>Are You Sure?") == 2:
|
|
118
|
+
open_folder(dist_folder)
|
|
119
|
+
terminal.close()
|
q2rad/q2rad.py
CHANGED
|
@@ -59,7 +59,8 @@ from q2rad.q2packages import Q2Packages
|
|
|
59
59
|
from q2rad.q2constants import Q2Constants, q2const
|
|
60
60
|
from q2rad.q2queries import Q2Queries
|
|
61
61
|
from q2rad.q2reports import Q2Reports, Q2RadReport
|
|
62
|
-
from q2rad.q2utils import Q2Tasker, Q2Form, auto_filter, set_logging # noqa F401
|
|
62
|
+
from q2rad.q2utils import Q2Tasker, Q2Form, auto_filter, set_logging, open_folder # noqa F401
|
|
63
|
+
from q2rad.q2make import make_binary
|
|
63
64
|
|
|
64
65
|
import gettext
|
|
65
66
|
|
|
@@ -295,7 +296,7 @@ class Q2RadApp(Q2App):
|
|
|
295
296
|
wait.step("Prepare")
|
|
296
297
|
self.clear_app_info()
|
|
297
298
|
wait.step("Migrate logic DB")
|
|
298
|
-
self.migrate_db_logic()
|
|
299
|
+
self.migrate_db_logic(self.db_logic)
|
|
299
300
|
wait.step("Migrate data DB")
|
|
300
301
|
self.migrate_db_data()
|
|
301
302
|
wait.step("looking for updates")
|
|
@@ -362,7 +363,7 @@ class Q2RadApp(Q2App):
|
|
|
362
363
|
q2Mess(self.db_data.migrate_error_list)
|
|
363
364
|
self.create_menu()
|
|
364
365
|
|
|
365
|
-
def migrate_db_logic(self):
|
|
366
|
+
def migrate_db_logic(self, db_logic):
|
|
366
367
|
data_schema = Q2DbSchema()
|
|
367
368
|
for form in (
|
|
368
369
|
Q2Modules(),
|
|
@@ -375,7 +376,7 @@ class Q2RadApp(Q2App):
|
|
|
375
376
|
):
|
|
376
377
|
for x in form.get_table_schema():
|
|
377
378
|
data_schema.add(**x)
|
|
378
|
-
|
|
379
|
+
db_logic.set_schema(data_schema)
|
|
379
380
|
|
|
380
381
|
def get_autocompletition_list(self):
|
|
381
382
|
rez = []
|
|
@@ -499,7 +500,11 @@ class Q2RadApp(Q2App):
|
|
|
499
500
|
if self.frozen:
|
|
500
501
|
self.dev_mode = False
|
|
501
502
|
|
|
502
|
-
self.dev_mode =
|
|
503
|
+
self.dev_mode = (
|
|
504
|
+
self.selected_application.get("dev_mode")
|
|
505
|
+
or os.path.isdir(self.q2market_path)
|
|
506
|
+
or os.path.isfile(".dev")
|
|
507
|
+
)
|
|
503
508
|
# self.dev_mode = False
|
|
504
509
|
|
|
505
510
|
if self.dev_mode:
|
|
@@ -608,43 +613,76 @@ class Q2RadApp(Q2App):
|
|
|
608
613
|
|
|
609
614
|
if not self.frozen:
|
|
610
615
|
# create update_q2rad.sh
|
|
616
|
+
self.write_reinstall_files()
|
|
617
|
+
|
|
618
|
+
# create run_q2rad
|
|
619
|
+
self.write_run_files()
|
|
620
|
+
if sys.platform != "darwin":
|
|
621
|
+
if q2AskYN("Should I make a desktop shortcut?") == 2:
|
|
622
|
+
self.make_desktop_shortcut()
|
|
623
|
+
self.process_events()
|
|
624
|
+
|
|
625
|
+
def write_run_files(self):
|
|
626
|
+
if sys.prefix != sys.base_prefix: # in virtualenv
|
|
611
627
|
self.write_restore_file(
|
|
612
|
-
"
|
|
628
|
+
"run_q2rad",
|
|
613
629
|
("" if "win32" in sys.platform else "#!/bin/bash\n")
|
|
614
|
-
+ (
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
+ "&& pip install --upgrade --force-reinstall q2rad",
|
|
630
|
+
+ (
|
|
631
|
+
"start q2rad\\scripts\\pythonw.exe -m q2rad"
|
|
632
|
+
if "win32" in sys.platform
|
|
633
|
+
else "q2rad/bin/q2rad\n"
|
|
634
|
+
),
|
|
620
635
|
)
|
|
621
|
-
|
|
622
|
-
# create run_q2rad
|
|
636
|
+
elif os.path.isdir("python.loc"):
|
|
623
637
|
self.write_restore_file(
|
|
624
638
|
"run_q2rad",
|
|
625
639
|
("" if "win32" in sys.platform else "#!/bin/bash\n")
|
|
626
|
-
+ ("
|
|
640
|
+
+ ("python.loc\\scripts\\q2rad" if "win32" in sys.platform else "python.loc/bin/q2rad\n"),
|
|
641
|
+
)
|
|
642
|
+
else:
|
|
643
|
+
self.write_restore_file(
|
|
644
|
+
"run_q2rad",
|
|
645
|
+
("" if "win32" in sys.platform else "#!/bin/bash\n")
|
|
646
|
+
+ ("pythonw.exe -m q2rad" if "win32" in sys.platform else "python -m q2rad\n"),
|
|
627
647
|
)
|
|
628
|
-
if "win32" in sys.platform:
|
|
629
|
-
open("run_q2rad.vbs", "w").write(
|
|
630
|
-
'WScript.CreateObject("WScript.Shell").Run ' '"q2rad\\scripts\\pythonw.exe -m q2rad", 0, false'
|
|
631
|
-
)
|
|
632
648
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
)
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
649
|
+
if "win32" in sys.platform:
|
|
650
|
+
open("run_q2rad.vbs", "w").write(
|
|
651
|
+
'WScript.CreateObject("WScript.Shell").Run '
|
|
652
|
+
'"q2rad\\scripts\\pythonw.exe -m q2rad", 0, false'
|
|
653
|
+
)
|
|
654
|
+
|
|
655
|
+
open("make_shortcut.vbs", "w").write(
|
|
656
|
+
'Set oWS = WScript.CreateObject("WScript.Shell")\n'
|
|
657
|
+
'Set oLink = oWS.CreateShortcut(oWS.SpecialFolders("Desktop") & "\\q2RAD.lnk")\n'
|
|
658
|
+
'cu = WScript.CreateObject("Scripting.FileSystemObject").'
|
|
659
|
+
"GetParentFolderName(WScript.ScriptFullName)\n"
|
|
660
|
+
'oLink.TargetPath = cu & "\\run_q2rad.vbs"\n'
|
|
661
|
+
'oLink.WorkingDirectory = cu & ""\n'
|
|
662
|
+
'oLink.Description = "q2RAD"\n'
|
|
663
|
+
'oLink.IconLocation = cu & "\\assets\\q2rad.ico"\n'
|
|
664
|
+
"oLink.Save\n"
|
|
665
|
+
)
|
|
666
|
+
|
|
667
|
+
def write_reinstall_files(self):
|
|
668
|
+
if sys.prefix != sys.base_prefix: # in virtualenv
|
|
669
|
+
pip_command = (
|
|
670
|
+
"q2rad\\scripts\\python -m " if "win32" in sys.platform else "q2rad/script/python -m "
|
|
671
|
+
)
|
|
672
|
+
elif os.path.isdir("python.loc"):
|
|
673
|
+
pip_command = "python.loc\\python -m " if "win32" in sys.platform else "python.loc/python -m "
|
|
674
|
+
else:
|
|
675
|
+
pip_command = "python -m " if "win32" in sys.platform else "python -m "
|
|
676
|
+
|
|
677
|
+
self.write_restore_file(
|
|
678
|
+
"update_q2rad",
|
|
679
|
+
("" if "win32" in sys.platform else "#!/bin/bash\n")
|
|
680
|
+
+ f"{pip_command} pip install --upgrade --force-reinstall q2gui"
|
|
681
|
+
+ f"&&{pip_command} pip install --upgrade --force-reinstall q2db"
|
|
682
|
+
+ f"&&{pip_command} pip install --upgrade --force-reinstall q2report"
|
|
683
|
+
+ f"&&{pip_command} pip install --upgrade --force-reinstall q2terminal"
|
|
684
|
+
+ f"&&{pip_command} pip install --upgrade --force-reinstall q2rad",
|
|
685
|
+
)
|
|
648
686
|
|
|
649
687
|
def get_package_versions(self, package):
|
|
650
688
|
response = open_url(f"https://pypi.python.org/pypi/{package}/json") # noqa F405
|
|
@@ -681,7 +719,9 @@ class Q2RadApp(Q2App):
|
|
|
681
719
|
|
|
682
720
|
latest_version, new_current_version = self.get_package_versions(package)
|
|
683
721
|
if latest_version:
|
|
684
|
-
upgraded.append(
|
|
722
|
+
upgraded.append(
|
|
723
|
+
f"{package} - " f"<b>{current_version}</b> => " f"<b>{latest_version}</b>"
|
|
724
|
+
)
|
|
685
725
|
else:
|
|
686
726
|
upgraded.append(f"Error occured while updating package <b>{package}</b>!")
|
|
687
727
|
w.close()
|
|
@@ -718,7 +758,10 @@ class Q2RadApp(Q2App):
|
|
|
718
758
|
continue
|
|
719
759
|
if package and package != package:
|
|
720
760
|
continue
|
|
721
|
-
trm.run(
|
|
761
|
+
trm.run(
|
|
762
|
+
f"{executable} -m pip install --upgrade --force-reinstall --no-deps"
|
|
763
|
+
f" {_source_suffix}{package}{_source_postfix}"
|
|
764
|
+
)
|
|
722
765
|
if trm.exit_code != 0:
|
|
723
766
|
q2mess(f"Error occured while updateing <b>{package}</b>! See output for details.")
|
|
724
767
|
w.close()
|
|
@@ -801,7 +844,9 @@ class Q2RadApp(Q2App):
|
|
|
801
844
|
def update_app_packages(self):
|
|
802
845
|
if self.frozen:
|
|
803
846
|
return
|
|
804
|
-
extra_packages = [
|
|
847
|
+
extra_packages = [
|
|
848
|
+
x["package_name"] for x in q2cursor("select * from packages", self.db_logic).records()
|
|
849
|
+
]
|
|
805
850
|
self.check_packages_update(extra_packages)
|
|
806
851
|
|
|
807
852
|
def check_packages_update(self, packages_list=q2_modules):
|
|
@@ -903,47 +948,7 @@ class Q2RadApp(Q2App):
|
|
|
903
948
|
Q2Packages().run()
|
|
904
949
|
|
|
905
950
|
def make_binary(self):
|
|
906
|
-
|
|
907
|
-
if q2ask("Are you about to start buidlign binary executabele file of Q2RAD!<br>Are You Sure?") != 2:
|
|
908
|
-
return
|
|
909
|
-
|
|
910
|
-
if not os.path.isdir(folder):
|
|
911
|
-
os.mkdir(folder)
|
|
912
|
-
if not os.path.isdir(folder):
|
|
913
|
-
return
|
|
914
|
-
|
|
915
|
-
main = "from q2rad.q2rad import Q2RadApp;app = Q2RadApp();app.run()"
|
|
916
|
-
open(f"{folder}/main.py", "w").write(main)
|
|
917
|
-
|
|
918
|
-
trm = Q2Terminal(callback=print)
|
|
919
|
-
pynstaller_executable = os.path.dirname(sys.executable) + "/pyinstaller"
|
|
920
|
-
|
|
921
|
-
if not os.path.isfile("poetry.lock"):
|
|
922
|
-
trm.run(f"{pynstaller_executable} -v")
|
|
923
|
-
if trm.exit_code != 0:
|
|
924
|
-
pip_executable = os.path.dirname(sys.executable) + "/pip"
|
|
925
|
-
trm.run(f"{pip_executable} install pyinstaller")
|
|
926
|
-
if trm.exit_code != 0:
|
|
927
|
-
q2mess("Pyinstaller not installed!")
|
|
928
|
-
return
|
|
929
|
-
|
|
930
|
-
packages = " ".join(
|
|
931
|
-
[
|
|
932
|
-
f" --collect-all {x['name']}"
|
|
933
|
-
for x in q2cursor("select package_name as name from packages where 'pyinstaller'<>package_name ", self.db_logic).records()
|
|
934
|
-
]
|
|
935
|
-
)
|
|
936
|
-
trm.run(f"cd {folder}")
|
|
937
|
-
w = q2wait()
|
|
938
|
-
# trm.run(f"pyinstaller --onefile --noconsole {packages} main.py")
|
|
939
|
-
trm.run(f"{pynstaller_executable} -y --noconsole {packages} main.py")
|
|
940
|
-
w.close()
|
|
941
|
-
|
|
942
|
-
if trm.exit_code != 0:
|
|
943
|
-
q2mess("Error occured while making binary! See output for details.")
|
|
944
|
-
else:
|
|
945
|
-
q2mess(f"Success! You binary is located in <b>{os.path.abspath(folder)}</b>")
|
|
946
|
-
trm.close()
|
|
951
|
+
make_binary(self)
|
|
947
952
|
|
|
948
953
|
def run_form(self, name, order="", where=""):
|
|
949
954
|
form = q2working(lambda: self.get_form(name, where=where, order=order), "Loading form...")
|
q2rad/q2utils.py
CHANGED
|
@@ -13,10 +13,11 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
|
+
import sys
|
|
16
17
|
import random
|
|
17
18
|
import string
|
|
18
19
|
import threading
|
|
19
|
-
|
|
20
|
+
import subprocess
|
|
20
21
|
|
|
21
22
|
from q2rad import Q2Form as _Q2Form
|
|
22
23
|
from q2rad.q2raddb import q2cursor, num
|
|
@@ -263,6 +264,15 @@ def set_logging(log_folder="log"):
|
|
|
263
264
|
logging.basicConfig(handlers=[handler])
|
|
264
265
|
|
|
265
266
|
|
|
267
|
+
def open_folder(folder):
|
|
268
|
+
if "win32" in sys.platform:
|
|
269
|
+
os.startfile(folder)
|
|
270
|
+
elif "darwin" in sys.platform:
|
|
271
|
+
subprocess.Popen(["open", folder])
|
|
272
|
+
else:
|
|
273
|
+
subprocess.Popen(["xdg-open", folder])
|
|
274
|
+
|
|
275
|
+
|
|
266
276
|
class Q2Tasker:
|
|
267
277
|
def __init__(self, title="Working..."):
|
|
268
278
|
self.rez = {}
|
q2rad/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.1.
|
|
1
|
+
__version__ = "0.1.168"
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
q2rad/__init__.py,sha256=Y0Up-UTXOmCYC9llNmTF10CpDDgF2kv10pyHT3-YwmQ,183
|
|
2
2
|
q2rad/__main__.py,sha256=zP4JARM-FzFHM-vWLehx7c5N4v4m_F-TuMobCdFzr4Q,824
|
|
3
3
|
q2rad/q2actions.py,sha256=_vbahOkI2NrTeyra0sP0jqYDX1Ov3f32GoLfRqevEks,7175
|
|
4
|
-
q2rad/q2appmanager.py,sha256=
|
|
5
|
-
q2rad/q2appselector.py,sha256=
|
|
4
|
+
q2rad/q2appmanager.py,sha256=x37tKfvUu-w8Cbu_v-0kLJgnLPpJ2o4qKwWu90SqOaU,15464
|
|
5
|
+
q2rad/q2appselector.py,sha256=H6rF_zJ6qOsUwKrUwaYl_YmPPSnWTsPawu-5RyJs_Lc,12198
|
|
6
6
|
q2rad/q2constants.py,sha256=dQtN4OMvZw0FATDAFYjolI7eGMVUnNnbTl6qM-ggZ4I,3416
|
|
7
7
|
q2rad/q2forms.py,sha256=yhTjLYZ2-UIo2Cz1K4wPY_pgsy9YGtm1NoJpGF3oh7U,10165
|
|
8
8
|
q2rad/q2lines.py,sha256=jUx8_eDA0gZz3cx7_l3qKv-Gn4IRUtcqCyNIXeFWReA,12166
|
|
9
|
+
q2rad/q2make.py,sha256=JgRocf8cDVIFiC_cuZtYh86ZvwQAy9p7o6TF3LHF0B4,4621
|
|
9
10
|
q2rad/q2market.py,sha256=koWwKKc1MVn0ud2XDu_dal8lBFEMLX8KABpZO_OzTIM,2597
|
|
10
11
|
q2rad/q2modules.py,sha256=N3OkUKfiwVZtmDyAtnJcs2Rprd7uIHd0HhjHTyFoN_s,4294
|
|
11
12
|
q2rad/q2packages.py,sha256=IpWEcAT9nLCHUGViInEyM4T1cLEwK9GtNcdGF-pk0tw,3345
|
|
12
13
|
q2rad/q2queries.py,sha256=abr4Fi3ou1CJsTD6vNfcjcakzjE6xTvh6OYY4bNWQLA,12314
|
|
13
|
-
q2rad/q2rad.py,sha256=
|
|
14
|
+
q2rad/q2rad.py,sha256=vnxy3MlksBzNiFm0VduiHpz96tdo3xsRPEZRDKokijw,42629
|
|
14
15
|
q2rad/q2raddb.py,sha256=aG5SPEe4cnU_gO8zFmVkTDmIC0gcQFEIUv5NYGuqLlE,4372
|
|
15
16
|
q2rad/q2reports.py,sha256=YhrbwFXTMTgtwIh5XSWaabseaZjRco34WO5mU676PU8,81238
|
|
16
17
|
q2rad/q2stylesettings.py,sha256=esbfQoPgP7lJN2GRkqeQKjDpHCqCilJBzZf-c73ThCU,3593
|
|
17
|
-
q2rad/q2utils.py,sha256
|
|
18
|
-
q2rad/version.py,sha256=
|
|
19
|
-
q2rad-0.1.
|
|
20
|
-
q2rad-0.1.
|
|
21
|
-
q2rad-0.1.
|
|
22
|
-
q2rad-0.1.
|
|
23
|
-
q2rad-0.1.
|
|
18
|
+
q2rad/q2utils.py,sha256=-U4TGTzinY-CrpMTdUAQQrOiG0BVGbeTykH9b6T5-nk,14136
|
|
19
|
+
q2rad/version.py,sha256=DyRSMmft4IGMe-tnzgBjtW1T7qXZwYslbQrz7HufbVo,23
|
|
20
|
+
q2rad-0.1.168.dist-info/entry_points.txt,sha256=DmsJQE6f3wYuhdN2h6ARYxSe8_d03paeepfGpdVj5rs,42
|
|
21
|
+
q2rad-0.1.168.dist-info/LICENSE,sha256=JRR3LlR18ghhYXT4G2cWgXmnxRvcuVcKlqncWWK4MRY,10347
|
|
22
|
+
q2rad-0.1.168.dist-info/METADATA,sha256=n_DoAsj0efX_ygqG2Lc0qO1grWkemQqZGAFXjZqLuzA,3509
|
|
23
|
+
q2rad-0.1.168.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
|
|
24
|
+
q2rad-0.1.168.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|