q2rad 0.1.207__tar.gz → 0.1.209__tar.gz
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-0.1.207 → q2rad-0.1.209}/PKG-INFO +1 -1
- {q2rad-0.1.207 → q2rad-0.1.209}/pyproject.toml +1 -1
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2appmanager.py +76 -8
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2forms.py +28 -2
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2lines.py +60 -17
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2packages.py +11 -5
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2rad.py +57 -30
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2utils.py +1 -1
- q2rad-0.1.209/q2rad/version.py +1 -0
- q2rad-0.1.207/q2rad/version.py +0 -1
- {q2rad-0.1.207 → q2rad-0.1.209}/LICENSE +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/README.md +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/__init__.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/__main__.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2actions.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2appselector.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2constants.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2make.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2market.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2modules.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2queries.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2raddb.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2reports.py +0 -0
- {q2rad-0.1.207 → q2rad-0.1.209}/q2rad/q2stylesettings.py +0 -0
|
@@ -40,6 +40,7 @@ app_tables = [
|
|
|
40
40
|
class AppManager(Q2Form):
|
|
41
41
|
def __init__(self, title=""):
|
|
42
42
|
super().__init__("Manage q2Application")
|
|
43
|
+
self.selected_tables = []
|
|
43
44
|
|
|
44
45
|
def on_init(self):
|
|
45
46
|
app_data = q2app.q2_app.selected_application
|
|
@@ -332,7 +333,68 @@ class AppManager(Q2Form):
|
|
|
332
333
|
rez[x].append(row)
|
|
333
334
|
return rez
|
|
334
335
|
|
|
336
|
+
def tables_selector(self, mode="export"):
|
|
337
|
+
st = Q2Form(f"Select tables for {mode}")
|
|
338
|
+
st.ok_button = 1
|
|
339
|
+
st.cancel_button = 1
|
|
340
|
+
|
|
341
|
+
def get_widgets(st=st):
|
|
342
|
+
return [x for x in st.widgets() if x.startswith("c_")]
|
|
343
|
+
|
|
344
|
+
tables = [
|
|
345
|
+
x
|
|
346
|
+
for x in q2app.q2_app.db_data.get_tables()
|
|
347
|
+
if not x.startswith("log_") and x != "sqlite_sequence"
|
|
348
|
+
]
|
|
349
|
+
if st.add_control("/v"):
|
|
350
|
+
if st.add_control("/vr"):
|
|
351
|
+
tables.sort()
|
|
352
|
+
for index, table in enumerate(tables):
|
|
353
|
+
if self.selected_tables == []:
|
|
354
|
+
check_data = 1
|
|
355
|
+
else:
|
|
356
|
+
check_data = table in self.selected_tables
|
|
357
|
+
|
|
358
|
+
label = get("forms", f"form_table='{table}'", "title", self.q2_app.db_logic)
|
|
359
|
+
st.add_control(
|
|
360
|
+
f"c_{index}", pic=f"{table} ({label})", control="check", data=check_data, stretch=99
|
|
361
|
+
)
|
|
362
|
+
st.add_control("/")
|
|
363
|
+
st.add_control("/")
|
|
364
|
+
st.add_control("/h")
|
|
365
|
+
st.add_control(
|
|
366
|
+
"all",
|
|
367
|
+
"Check all",
|
|
368
|
+
control="button",
|
|
369
|
+
datalen=10,
|
|
370
|
+
valid=lambda: [st.s.__setattr__(x, 1) for x in get_widgets()],
|
|
371
|
+
)
|
|
372
|
+
st.add_control(
|
|
373
|
+
"nothing",
|
|
374
|
+
"Uncheck all",
|
|
375
|
+
control="button",
|
|
376
|
+
datalen=10,
|
|
377
|
+
valid=lambda: [st.s.__setattr__(x, 0) for x in get_widgets()],
|
|
378
|
+
)
|
|
379
|
+
st.add_control(
|
|
380
|
+
"invert",
|
|
381
|
+
"Invert",
|
|
382
|
+
control="button",
|
|
383
|
+
datalen=10,
|
|
384
|
+
valid=lambda: [st.s.__setattr__(x, 0 if st.s.__getattr__(x) else 1) for x in get_widgets()],
|
|
385
|
+
)
|
|
386
|
+
st.add_control("/")
|
|
387
|
+
st.run()
|
|
388
|
+
|
|
389
|
+
if st.ok_pressed:
|
|
390
|
+
self.selected_tables = [
|
|
391
|
+
table for index, table in enumerate(tables) if st.s.__getattr__(f"c_{index}")
|
|
392
|
+
]
|
|
393
|
+
return True
|
|
394
|
+
|
|
335
395
|
def export_data(self, file=""):
|
|
396
|
+
if not self.tables_selector("export"):
|
|
397
|
+
return
|
|
336
398
|
filetype = "JSON(*.json)"
|
|
337
399
|
if not file:
|
|
338
400
|
file, filetype = q2app.q2_app.get_save_file_dialoq("Export Database", filter=filetype)
|
|
@@ -349,14 +411,16 @@ class AppManager(Q2Form):
|
|
|
349
411
|
def get_data_json(self):
|
|
350
412
|
db: Q2Db = q2app.q2_app.db_data
|
|
351
413
|
rez = {}
|
|
352
|
-
for
|
|
353
|
-
if
|
|
414
|
+
for table in db.get_tables():
|
|
415
|
+
if table in app_tables:
|
|
354
416
|
continue
|
|
355
|
-
if
|
|
417
|
+
if table.startswith("log_") or table == "sqlite_sequence":
|
|
356
418
|
continue
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
419
|
+
if table not in self.selected_tables:
|
|
420
|
+
continue
|
|
421
|
+
rez[table] = []
|
|
422
|
+
for row in db.table(table).records():
|
|
423
|
+
rez[table].append(row)
|
|
360
424
|
return rez
|
|
361
425
|
|
|
362
426
|
def import_q2market(self):
|
|
@@ -410,6 +474,8 @@ class AppManager(Q2Form):
|
|
|
410
474
|
q2Mess("<br>".join(errors))
|
|
411
475
|
|
|
412
476
|
def import_data(self, file=""):
|
|
477
|
+
if not self.tables_selector("import"):
|
|
478
|
+
return
|
|
413
479
|
filetype = "JSON(*.json)"
|
|
414
480
|
if not file:
|
|
415
481
|
file, filetype = q2app.q2_app.get_open_file_dialoq("Import Data", filter=filetype)
|
|
@@ -418,10 +484,10 @@ class AppManager(Q2Form):
|
|
|
418
484
|
return
|
|
419
485
|
|
|
420
486
|
data = json.load(open(file))
|
|
421
|
-
self.import_json_data(data)
|
|
487
|
+
self.import_json_data(data, self.selected_tables)
|
|
422
488
|
|
|
423
489
|
@staticmethod
|
|
424
|
-
def import_json_data(data):
|
|
490
|
+
def import_json_data(data, selected_tables=[]):
|
|
425
491
|
db: Q2Db = q2app.q2_app.db_data
|
|
426
492
|
db_tables = db.get_tables()
|
|
427
493
|
wait_table = Q2WaitShow(len(data))
|
|
@@ -430,6 +496,8 @@ class AppManager(Q2Form):
|
|
|
430
496
|
wait_table.step(table)
|
|
431
497
|
if table not in db_tables:
|
|
432
498
|
continue
|
|
499
|
+
if selected_tables and table not in selected_tables:
|
|
500
|
+
continue
|
|
433
501
|
wait_row = Q2WaitShow(len(data[table]))
|
|
434
502
|
db.cursor(f"delete from {table}")
|
|
435
503
|
for row in data[table]:
|
|
@@ -262,7 +262,7 @@ class Q2Forms(Q2Form, Q2_save_and_run):
|
|
|
262
262
|
def select_data_storage_table(self):
|
|
263
263
|
choice = choice_table()
|
|
264
264
|
if choice:
|
|
265
|
-
self.s.form_table = choice[
|
|
265
|
+
self.s.form_table = choice["table"]
|
|
266
266
|
if self.s.name == "":
|
|
267
267
|
self.s.name = self.s.form_table
|
|
268
268
|
if self.s.title == "":
|
|
@@ -272,7 +272,7 @@ class Q2Forms(Q2Form, Q2_save_and_run):
|
|
|
272
272
|
choice = choice_column(self.s.form_table)
|
|
273
273
|
if choice:
|
|
274
274
|
self.s.form_table_sort += ", " if self.s.form_table_sort else ""
|
|
275
|
-
self.s.form_table_sort += choice[
|
|
275
|
+
self.s.form_table_sort += choice["col"]
|
|
276
276
|
|
|
277
277
|
def form_runner(self):
|
|
278
278
|
name = self.r.name
|
|
@@ -283,3 +283,29 @@ class Q2Forms(Q2Form, Q2_save_and_run):
|
|
|
283
283
|
q2mess(_("Give me some NAME!!!"))
|
|
284
284
|
self.w.name.set_focus()
|
|
285
285
|
return False
|
|
286
|
+
|
|
287
|
+
def after_crud_save(self):
|
|
288
|
+
super().after_crud_save()
|
|
289
|
+
if self.crud_mode != "EDIT":
|
|
290
|
+
if self.s.form_table:
|
|
291
|
+
self.db.insert(
|
|
292
|
+
"lines",
|
|
293
|
+
{
|
|
294
|
+
"name": self.s.name,
|
|
295
|
+
"column": "id",
|
|
296
|
+
"noform": "*",
|
|
297
|
+
"nogrid": "*",
|
|
298
|
+
"datatype": "int",
|
|
299
|
+
"migrate": "*",
|
|
300
|
+
"pk": "*",
|
|
301
|
+
"ai": "*",
|
|
302
|
+
},
|
|
303
|
+
)
|
|
304
|
+
self.db.insert(
|
|
305
|
+
"actions",
|
|
306
|
+
{
|
|
307
|
+
"name": self.s.name,
|
|
308
|
+
"action_mode": "1",
|
|
309
|
+
},
|
|
310
|
+
)
|
|
311
|
+
self.refresh()
|
|
@@ -22,7 +22,7 @@ from q2rad.q2raddb import last_error
|
|
|
22
22
|
from q2rad.q2utils import Q2Form, int_
|
|
23
23
|
|
|
24
24
|
from q2gui import q2app
|
|
25
|
-
|
|
25
|
+
import csv
|
|
26
26
|
|
|
27
27
|
import gettext
|
|
28
28
|
|
|
@@ -91,7 +91,8 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
91
91
|
# self.add_seq_actions()
|
|
92
92
|
|
|
93
93
|
self.add_action("Run", self.form_runner, hotkey="F4")
|
|
94
|
-
self.add_action("Fill", self.filler)
|
|
94
|
+
self.add_action("Fill from DB", self.filler)
|
|
95
|
+
self.add_action("Fill from CSV", self.csv_filler)
|
|
95
96
|
self.add_action("-")
|
|
96
97
|
self.add_action("Select panel", icon="⭥", worker=self.select_panel, hotkey="F3")
|
|
97
98
|
self.add_action("Copy to", icon="❖", worker=self.copy_to)
|
|
@@ -103,6 +104,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
103
104
|
|
|
104
105
|
def create_form(self):
|
|
105
106
|
from q2rad.q2forms import Q2Forms
|
|
107
|
+
|
|
106
108
|
self.add_control("id", "", datatype="int", pk="*", ai="*", noform=1, nogrid=1)
|
|
107
109
|
self.add_control("column", _("Column name"), datalen=50)
|
|
108
110
|
self.add_control("/")
|
|
@@ -188,7 +190,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
188
190
|
_("?"),
|
|
189
191
|
mess=_("Open list of existing tables"),
|
|
190
192
|
control="button",
|
|
191
|
-
datalen=
|
|
193
|
+
datalen=3,
|
|
192
194
|
valid=self.select_linked_table,
|
|
193
195
|
)
|
|
194
196
|
self.add_control("to_table", gridlabel=_("To table"), datatype="char", datalen=100)
|
|
@@ -199,7 +201,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
199
201
|
_("?"),
|
|
200
202
|
mess=_("Open list of existing tables"),
|
|
201
203
|
control="button",
|
|
202
|
-
datalen=
|
|
204
|
+
datalen=3,
|
|
203
205
|
valid=self.select_linked_table_pk,
|
|
204
206
|
)
|
|
205
207
|
self.add_control("to_column", gridlabel=_("To field"), datatype="char", datalen=100)
|
|
@@ -211,7 +213,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
211
213
|
_("?"),
|
|
212
214
|
mess=_("Open list of existing columns"),
|
|
213
215
|
control="button",
|
|
214
|
-
datalen=
|
|
216
|
+
datalen=3,
|
|
215
217
|
valid=self.select_linked_table_column,
|
|
216
218
|
)
|
|
217
219
|
self.add_control("/")
|
|
@@ -225,7 +227,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
225
227
|
_("?"),
|
|
226
228
|
mess=_("Open list of existing forms"),
|
|
227
229
|
control="button",
|
|
228
|
-
datalen=
|
|
230
|
+
datalen=3,
|
|
229
231
|
valid=self.select_linked_form,
|
|
230
232
|
)
|
|
231
233
|
self.add_control("to_form", gridlabel=_("Form to open"), datatype="char", datalen=100)
|
|
@@ -303,15 +305,7 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
303
305
|
rows = self.get_grid_selected_rows()
|
|
304
306
|
choice = choice_form()
|
|
305
307
|
if choice:
|
|
306
|
-
seq = (
|
|
307
|
-
int_(
|
|
308
|
-
q2cursor(
|
|
309
|
-
f"select max(seq) as maxseq from lines where name='{choice['name']}'",
|
|
310
|
-
q2app.q2_app.db_logic,
|
|
311
|
-
).r.maxseq
|
|
312
|
-
)
|
|
313
|
-
+ 1
|
|
314
|
-
)
|
|
308
|
+
seq = self.get_next_sequence(choice["name"])
|
|
315
309
|
for x in rows:
|
|
316
310
|
rec = self.model.get_record(x)
|
|
317
311
|
rec["seq"] = seq
|
|
@@ -321,6 +315,18 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
321
315
|
print(last_error(q2app.q2_app.db_logic))
|
|
322
316
|
self.refresh()
|
|
323
317
|
|
|
318
|
+
def get_next_sequence(self, form_name):
|
|
319
|
+
seq = (
|
|
320
|
+
int_(
|
|
321
|
+
q2cursor(
|
|
322
|
+
f"select max(seq) as maxseq from lines where name='{form_name}'",
|
|
323
|
+
q2app.q2_app.db_logic,
|
|
324
|
+
).r.maxseq
|
|
325
|
+
)
|
|
326
|
+
+ 1
|
|
327
|
+
)
|
|
328
|
+
return seq
|
|
329
|
+
|
|
324
330
|
def add_layout(self, layout_type):
|
|
325
331
|
selected_row = sorted(self.get_grid_selected_rows())
|
|
326
332
|
if len(selected_row) == 0:
|
|
@@ -401,8 +407,9 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
401
407
|
return
|
|
402
408
|
|
|
403
409
|
cols = self.q2_app.db_data.db_schema.get_schema_columns(self.prev_form.r.form_table)
|
|
410
|
+
seq = self.get_next_sequence(self.prev_form.r.name)
|
|
404
411
|
for x in cols:
|
|
405
|
-
if self.db.get("lines", f"name = '{self.prev_form.r.name}' and column = '{x}'") == {}:
|
|
412
|
+
if self.db.get("lines", f"name = '{self.prev_form.r.name}' and `column` = '{x}'") == {}:
|
|
406
413
|
insert(
|
|
407
414
|
"lines",
|
|
408
415
|
{
|
|
@@ -414,9 +421,46 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
414
421
|
"pk": cols[x]["pk"],
|
|
415
422
|
"ai": cols[x]["ai"],
|
|
416
423
|
"migrate": "*",
|
|
424
|
+
"seq": seq,
|
|
425
|
+
},
|
|
426
|
+
self.db,
|
|
427
|
+
)
|
|
428
|
+
seq += 1
|
|
429
|
+
self.refresh()
|
|
430
|
+
|
|
431
|
+
def csv_filler(self):
|
|
432
|
+
if self.model.row_count() > 0:
|
|
433
|
+
if q2AskYN("Lines list is not empty! Are you sure") != 2:
|
|
434
|
+
return
|
|
435
|
+
|
|
436
|
+
csv_file_name = q2app.q2_app.get_open_file_dialoq("Open CSV file", filter="CSV (*.csv)")[0]
|
|
437
|
+
if not csv_file_name:
|
|
438
|
+
return
|
|
439
|
+
|
|
440
|
+
with open(csv_file_name) as csv_file:
|
|
441
|
+
reader = csv.DictReader(csv_file, dialect="excel", delimiter=";")
|
|
442
|
+
cols = {x: 0 for x in reader.fieldnames}
|
|
443
|
+
for x in reader:
|
|
444
|
+
for key, value in x.items():
|
|
445
|
+
cols[key] = max(cols[key], len(value))
|
|
446
|
+
cols
|
|
447
|
+
seq = self.get_next_sequence(self.prev_form.r.name)
|
|
448
|
+
for x in cols:
|
|
449
|
+
if self.db.get("lines", f"name = '{self.prev_form.r.name}' and `column` = '{x}'") == {}:
|
|
450
|
+
insert(
|
|
451
|
+
"lines",
|
|
452
|
+
{
|
|
453
|
+
"name": self.prev_form.r.name,
|
|
454
|
+
"column": x,
|
|
455
|
+
"label": x,
|
|
456
|
+
"datatype": "char",
|
|
457
|
+
"datalen": cols[x],
|
|
458
|
+
"migrate": "*",
|
|
459
|
+
"seq": seq,
|
|
417
460
|
},
|
|
418
461
|
self.db,
|
|
419
462
|
)
|
|
463
|
+
seq += 1
|
|
420
464
|
self.refresh()
|
|
421
465
|
|
|
422
466
|
def before_crud_save(self):
|
|
@@ -431,7 +475,6 @@ class Q2Lines(Q2Form, Q2_save_and_run):
|
|
|
431
475
|
self.datatype_valid()
|
|
432
476
|
self.control_valid()
|
|
433
477
|
self.database_valid()
|
|
434
|
-
# self.next_sequense()
|
|
435
478
|
|
|
436
479
|
def datatype_valid(self):
|
|
437
480
|
self.w.datalen.set_enabled(self.s.datatype in ";".join(HAS_DATALEN))
|
|
@@ -31,7 +31,7 @@ class Q2Packages(Q2Form):
|
|
|
31
31
|
|
|
32
32
|
def on_init(self):
|
|
33
33
|
self.add_control("package_name", _("Name"), datatype="char", datalen=100, pk="*")
|
|
34
|
-
self.add_control("
|
|
34
|
+
self.add_control("package_pipname", _("Pip name"), datatype="char", datalen=100)
|
|
35
35
|
self.add_control("package_version", _("Version"), datatype="char", datalen=10)
|
|
36
36
|
self.add_control("comment", _("Comment"), datatype="text")
|
|
37
37
|
|
|
@@ -53,17 +53,21 @@ class Q2Packages(Q2Form):
|
|
|
53
53
|
|
|
54
54
|
def uninstall(self):
|
|
55
55
|
if q2AskYN(f"You are about tu uninstall package: {self.r.package_name}") == 2:
|
|
56
|
-
self.q2_app.pip_uninstall(
|
|
56
|
+
self.q2_app.pip_uninstall(
|
|
57
|
+
self.r.package_name if self.r.package_pipname == "" else self.r.package_pipname
|
|
58
|
+
)
|
|
57
59
|
|
|
58
60
|
def install(self):
|
|
59
61
|
version = (
|
|
60
62
|
self.r.package_version
|
|
61
63
|
if self.r.package_version
|
|
62
|
-
else self.q2_app.get_package_versions(self.r.package_name)[0]
|
|
64
|
+
else self.q2_app.get_package_versions(self.r.package_name, self.r.package_pipname)[0]
|
|
63
65
|
)
|
|
64
66
|
if version:
|
|
65
67
|
try:
|
|
66
|
-
self.q2_app.pip_install(
|
|
68
|
+
self.q2_app.pip_install(
|
|
69
|
+
self.r.package_name if self.r.package_pipname == "" else self.r.package_pipname, version
|
|
70
|
+
)
|
|
67
71
|
except Exception:
|
|
68
72
|
q2Mess(_(f"pip install <b>{self.r.package_name}</b> error!"))
|
|
69
73
|
finally:
|
|
@@ -72,7 +76,9 @@ class Q2Packages(Q2Form):
|
|
|
72
76
|
q2Mess(f"Package <b>{self.r.package_name}</b> not found!")
|
|
73
77
|
|
|
74
78
|
def info(self):
|
|
75
|
-
latest_version, current_version = self.q2_app.get_package_versions(
|
|
79
|
+
latest_version, current_version = self.q2_app.get_package_versions(
|
|
80
|
+
self.r.package_name, self.r.package_pipname
|
|
81
|
+
)
|
|
76
82
|
# if not current_version:
|
|
77
83
|
# current_version = "Was not imported; "
|
|
78
84
|
# _cv = self.q2_app.code_runner(
|
|
@@ -60,7 +60,7 @@ from q2rad.q2packages import Q2Packages
|
|
|
60
60
|
from q2rad.q2constants import Q2Constants, q2const
|
|
61
61
|
from q2rad.q2queries import Q2Queries
|
|
62
62
|
from q2rad.q2reports import Q2Reports, Q2RadReport
|
|
63
|
-
from q2rad.q2utils import Q2Tasker, Q2Form, auto_filter, set_logging, open_folder # noqa F401
|
|
63
|
+
from q2rad.q2utils import Q2Tasker, Q2Form, auto_filter, set_logging, open_folder, open_document # noqa F401
|
|
64
64
|
from q2rad.q2utils import q2choice
|
|
65
65
|
from q2rad.q2make import make_binary
|
|
66
66
|
|
|
@@ -110,7 +110,7 @@ def run_form(form_name, order="", where=""):
|
|
|
110
110
|
return q2app.q2_app.run_form(form_name, order=order, where=where)
|
|
111
111
|
|
|
112
112
|
|
|
113
|
-
def run_module(module_name=None,
|
|
113
|
+
def run_module(module_name=None, _globals={}, _locals=locals(), script="", import_only=False):
|
|
114
114
|
if module_name is not None:
|
|
115
115
|
script = q2app.q2_app.db_logic.get("modules", f"name = '{module_name}'", "script")
|
|
116
116
|
if not script:
|
|
@@ -130,7 +130,7 @@ def run_module(module_name=None, globals=globals(), locals=locals(), script="",
|
|
|
130
130
|
else:
|
|
131
131
|
__name__ = "__main__"
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
_locals.update(
|
|
134
134
|
{
|
|
135
135
|
"RETURN": None,
|
|
136
136
|
"ReturnEvent": ReturnEvent,
|
|
@@ -140,13 +140,15 @@ def run_module(module_name=None, globals=globals(), locals=locals(), script="",
|
|
|
140
140
|
"__name__": __name__,
|
|
141
141
|
}
|
|
142
142
|
)
|
|
143
|
+
_globals.update(globals())
|
|
144
|
+
_globals.update(_locals)
|
|
143
145
|
try:
|
|
144
|
-
exec(code["code"],
|
|
146
|
+
exec(code["code"], _globals)
|
|
145
147
|
except ReturnEvent as error:
|
|
146
148
|
pass
|
|
147
149
|
except Exception as error:
|
|
148
150
|
explain_error()
|
|
149
|
-
return
|
|
151
|
+
return _globals["RETURN"]
|
|
150
152
|
|
|
151
153
|
|
|
152
154
|
def explain_error(tb=None, errtype=None):
|
|
@@ -193,8 +195,10 @@ def explain_error(tb=None, errtype=None):
|
|
|
193
195
|
for x in error["locals"]:
|
|
194
196
|
if x in ("RETURN", "ReturnEvent", "mem", "self", "q2_app", "form", "myapp", "__name__"):
|
|
195
197
|
continue
|
|
198
|
+
# if x in globals():
|
|
199
|
+
# continue
|
|
196
200
|
value = str(error["locals"][x])[:100]
|
|
197
|
-
msg.append(f"{x}:{value}")
|
|
201
|
+
msg.append(f"{x}: {value}")
|
|
198
202
|
msg.append("-" * 25)
|
|
199
203
|
msg = "\n".join(msg)
|
|
200
204
|
|
|
@@ -519,11 +523,11 @@ class Q2RadApp(Q2App):
|
|
|
519
523
|
# self.dev_mode = False
|
|
520
524
|
|
|
521
525
|
if self.dev_mode:
|
|
522
|
-
self.add_menu("Dev|Forms", self.run_forms
|
|
523
|
-
self.add_menu("Dev|Modules", self.run_modules
|
|
524
|
-
self.add_menu("Dev|Querys", self.run_queries
|
|
525
|
-
self.add_menu("Dev|Reports", self.run_reports
|
|
526
|
-
self.add_menu("Dev|Packages", self.run_packages
|
|
526
|
+
self.add_menu("Dev|Forms", self.run_forms)
|
|
527
|
+
self.add_menu("Dev|Modules", self.run_modules)
|
|
528
|
+
self.add_menu("Dev|Querys", self.run_queries)
|
|
529
|
+
self.add_menu("Dev|Reports", self.run_reports)
|
|
530
|
+
self.add_menu("Dev|Packages", self.run_packages)
|
|
527
531
|
if not self.frozen:
|
|
528
532
|
self.add_menu("Dev|-")
|
|
529
533
|
self.add_menu("Dev|Make binary", self.make_binary)
|
|
@@ -695,8 +699,13 @@ class Q2RadApp(Q2App):
|
|
|
695
699
|
+ f"&&{pip_command} pip install --upgrade --force-reinstall q2rad",
|
|
696
700
|
)
|
|
697
701
|
|
|
698
|
-
def get_package_versions(self, package):
|
|
699
|
-
|
|
702
|
+
def get_package_versions(self, package, pipname=None):
|
|
703
|
+
if not isinstance(package, str):
|
|
704
|
+
pipname = package[1]
|
|
705
|
+
package = package[0]
|
|
706
|
+
response = open_url(
|
|
707
|
+
f"https://pypi.python.org/pypi/{pipname if pipname else package}/json"
|
|
708
|
+
) # noqa F405
|
|
700
709
|
if response:
|
|
701
710
|
latest_version = json.load(response)["info"]["version"]
|
|
702
711
|
else:
|
|
@@ -716,7 +725,7 @@ class Q2RadApp(Q2App):
|
|
|
716
725
|
except Exception as error:
|
|
717
726
|
_logger.error(f"Error checking version of {package}: {error}")
|
|
718
727
|
if current_version is None:
|
|
719
|
-
q2mess(f"Error
|
|
728
|
+
q2mess(f"Error checking curent version of {package}!")
|
|
720
729
|
else:
|
|
721
730
|
current_version = None
|
|
722
731
|
|
|
@@ -731,8 +740,14 @@ class Q2RadApp(Q2App):
|
|
|
731
740
|
if w.step(package):
|
|
732
741
|
break
|
|
733
742
|
latest_version, current_version = self.get_package_versions(package)
|
|
743
|
+
# q2mess([package, latest_version, current_version])
|
|
734
744
|
if self.db_logic is not None and package not in q2_modules:
|
|
735
|
-
pkg_ver = get(
|
|
745
|
+
pkg_ver = get(
|
|
746
|
+
"packages",
|
|
747
|
+
f"package_name='{package if isinstance(package, str) else package[0]}'",
|
|
748
|
+
"package_version",
|
|
749
|
+
q2_db=self.db_logic,
|
|
750
|
+
)
|
|
736
751
|
if pkg_ver != "":
|
|
737
752
|
try:
|
|
738
753
|
latest_version = version.parse(pkg_ver)
|
|
@@ -745,9 +760,10 @@ class Q2RadApp(Q2App):
|
|
|
745
760
|
continue
|
|
746
761
|
self.process_events()
|
|
747
762
|
if force or latest_version != current_version and latest_version:
|
|
763
|
+
self.pip_install(package, latest_version)
|
|
748
764
|
try:
|
|
749
765
|
self.pip_install(package, latest_version)
|
|
750
|
-
except Exception:
|
|
766
|
+
except Exception as error:
|
|
751
767
|
try:
|
|
752
768
|
self.pip_install(package, latest_version)
|
|
753
769
|
except Exception:
|
|
@@ -756,16 +772,20 @@ class Q2RadApp(Q2App):
|
|
|
756
772
|
latest_version, new_current_version = self.get_package_versions(package)
|
|
757
773
|
if latest_version:
|
|
758
774
|
upgraded.append(
|
|
759
|
-
f"{package
|
|
775
|
+
f"{package if isinstance(package, str) else package[0]} - "
|
|
776
|
+
f"<b>{current_version}</b> => "
|
|
777
|
+
f"<b>{latest_version}</b>"
|
|
760
778
|
)
|
|
761
779
|
else:
|
|
762
|
-
upgraded.append(
|
|
780
|
+
upgraded.append(
|
|
781
|
+
"Error occured while updating package "
|
|
782
|
+
f"<b>{package if isinstance(package, str) else package[0]}</b>!"
|
|
783
|
+
)
|
|
763
784
|
w.close()
|
|
764
785
|
if upgraded:
|
|
765
786
|
mess = ("Upgrading complete!<p>" "The program will be restarted!" "<p><p>") + "<p>".join(upgraded)
|
|
766
787
|
else:
|
|
767
788
|
mess = "Updates not found!<p>"
|
|
768
|
-
q2Mess(mess)
|
|
769
789
|
if upgraded:
|
|
770
790
|
self.restart()
|
|
771
791
|
|
|
@@ -819,11 +839,14 @@ class Q2RadApp(Q2App):
|
|
|
819
839
|
trm = Q2Terminal(callback=print)
|
|
820
840
|
trm.run(
|
|
821
841
|
f'"{sys.executable.replace("w.exe", ".exe")}" -m pip install '
|
|
822
|
-
f"--upgrade --no-cache-dir {package}
|
|
842
|
+
f"--upgrade --no-cache-dir {package if isinstance(package, str) else package[1]}"
|
|
843
|
+
f"=={latest_version}"
|
|
823
844
|
)
|
|
824
845
|
trm.close()
|
|
825
846
|
|
|
826
|
-
q2working(
|
|
847
|
+
q2working(
|
|
848
|
+
pip_runner, _("Installing package %s...") % package if isinstance(package, str) else package[1]
|
|
849
|
+
)
|
|
827
850
|
|
|
828
851
|
def pip_uninstall(self, package):
|
|
829
852
|
if self.frozen:
|
|
@@ -869,7 +892,8 @@ class Q2RadApp(Q2App):
|
|
|
869
892
|
if self.frozen:
|
|
870
893
|
return
|
|
871
894
|
extra_packages = [
|
|
872
|
-
x["package_name"]
|
|
895
|
+
(x["package_name"], x["package_pipname"])
|
|
896
|
+
for x in q2cursor("select * from packages", self.db_logic).records()
|
|
873
897
|
]
|
|
874
898
|
self.check_packages_update(extra_packages)
|
|
875
899
|
|
|
@@ -900,13 +924,16 @@ class Q2RadApp(Q2App):
|
|
|
900
924
|
continue
|
|
901
925
|
except Exception as error:
|
|
902
926
|
q2mess(
|
|
903
|
-
f"Error
|
|
927
|
+
f"Error parsing version for <b>{package}</b>:"
|
|
904
928
|
f"<br> {error}<br>"
|
|
905
929
|
f"<b>{package}</b> packages update skipped"
|
|
906
930
|
)
|
|
907
931
|
continue
|
|
908
932
|
if latest_version != current_version and latest_version:
|
|
909
|
-
list_2_upgrade_message.append(
|
|
933
|
+
list_2_upgrade_message.append(
|
|
934
|
+
f"<b>{package if isinstance(package, str) else package[0]}</b>: "
|
|
935
|
+
f"{current_version} > {latest_version}"
|
|
936
|
+
)
|
|
910
937
|
list_2_upgrade.append(package)
|
|
911
938
|
if not can_upgrade:
|
|
912
939
|
can_upgrade = True
|
|
@@ -1150,12 +1177,14 @@ class Q2RadApp(Q2App):
|
|
|
1150
1177
|
in_def_indent = -1
|
|
1151
1178
|
for x in script.split("\n"):
|
|
1152
1179
|
if x.strip() == "":
|
|
1180
|
+
new_script_lines.append("")
|
|
1153
1181
|
continue
|
|
1154
1182
|
spaces_count = count_leading_spaces(x)
|
|
1155
1183
|
# when in_def is True - do not modify return
|
|
1156
|
-
if
|
|
1157
|
-
in_def
|
|
1158
|
-
|
|
1184
|
+
if re.findall(r"^\s*def|^\s*class", x):
|
|
1185
|
+
if in_def is False:
|
|
1186
|
+
in_def = True
|
|
1187
|
+
in_def_indent = spaces_count
|
|
1159
1188
|
elif spaces_count <= in_def_indent:
|
|
1160
1189
|
in_def = False
|
|
1161
1190
|
in_def_indent = -1
|
|
@@ -1164,8 +1193,6 @@ class Q2RadApp(Q2App):
|
|
|
1164
1193
|
if x.strip() == "return":
|
|
1165
1194
|
x = x.replace("return", "raise ReturnEvent")
|
|
1166
1195
|
else:
|
|
1167
|
-
# x = x.replace("return", "RETURN = ") + ";raise ReturnEvent"
|
|
1168
|
-
# x = x.replace("\n", "").replace("\r", "") + ";raise ReturnEvent"
|
|
1169
1196
|
x = x.replace("\n", "").replace("\r", "")
|
|
1170
1197
|
x = x.replace("return", "RETURN =")
|
|
1171
1198
|
x += ";raise ReturnEvent"
|
|
@@ -1218,7 +1245,7 @@ class Q2RadApp(Q2App):
|
|
|
1218
1245
|
for x in args:
|
|
1219
1246
|
__locals_dict[x] = args[x]
|
|
1220
1247
|
globals()["q2_app"] = self
|
|
1221
|
-
return run_module(script=script,
|
|
1248
|
+
return run_module(script=script, _locals=__locals_dict)
|
|
1222
1249
|
|
|
1223
1250
|
return real_runner
|
|
1224
1251
|
|
|
@@ -357,7 +357,7 @@ def q2choice(records=[], title="Make your choice", column_title=["Column"]):
|
|
|
357
357
|
|
|
358
358
|
def choice_table():
|
|
359
359
|
return q2choice(
|
|
360
|
-
[{"table": x} for x in q2app.q2_app.db_data.db_schema.get_schema_tables()],
|
|
360
|
+
[{"table": x} for x in q2app.q2_app.db_data.db_schema.get_schema_tables() if not x.startswith("log_")],
|
|
361
361
|
title="Select table",
|
|
362
362
|
column_title="Table",
|
|
363
363
|
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.209"
|
q2rad-0.1.207/q2rad/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.207"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|