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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: q2rad
3
- Version: 0.1.207
3
+ Version: 0.1.209
4
4
  Summary: RAD - database, GUI, reports
5
5
  Author: Andrei Puchko
6
6
  Author-email: andrei.puchko@gmx.de
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "q2rad"
3
- version = "0.1.207"
3
+ version = "0.1.209"
4
4
  description = "RAD - database, GUI, reports"
5
5
  authors = ["Andrei Puchko <andrei.puchko@gmx.de>"]
6
6
  readme = "README.md"
@@ -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 x in db.get_tables():
353
- if x in app_tables:
414
+ for table in db.get_tables():
415
+ if table in app_tables:
354
416
  continue
355
- if x.startswith("log_") or x == "sqlite_sequence":
417
+ if table.startswith("log_") or table == "sqlite_sequence":
356
418
  continue
357
- rez[x] = []
358
- for row in db.table(x).records():
359
- rez[x].append(row)
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['table']
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['col']
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=2,
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=2,
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=2,
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=2,
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("package_alias", _("Alias"), datatype="char", datalen=100)
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(self.r.package_name)
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(self.r.package_name, version)
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(self.r.package_name)
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, globals=globals(), locals=locals(), script="", import_only=False):
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
- locals.update(
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"], globals, locals)
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 locals["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, toolbar=self.dev_mode)
523
- self.add_menu("Dev|Modules", self.run_modules, toolbar=self.dev_mode)
524
- self.add_menu("Dev|Querys", self.run_queries, toolbar=self.dev_mode)
525
- self.add_menu("Dev|Reports", self.run_reports, toolbar=self.dev_mode)
526
- self.add_menu("Dev|Packages", self.run_packages, toolbar=self.dev_mode)
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
- response = open_url(f"https://pypi.python.org/pypi/{package}/json") # noqa F405
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 checkin curent version of {package}!")
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("packages", f"package_name='{package}'", "package_version", q2_db=self.db_logic)
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} - " f"<b>{current_version}</b> => " f"<b>{latest_version}</b>"
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(f"Error occured while updating package <b>{package}</b>!")
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}=={latest_version}"
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(pip_runner, _("Installing package %s...") % package)
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"] for x in q2cursor("select * from packages", self.db_logic).records()
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 зparsing version for <b>{package}</b>:"
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(f"<b>{package}</b>: {current_version} > {latest_version}")
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 in_def is False and re.findall(r"^\s*def|^\s*class", x):
1157
- in_def = True
1158
- in_def_indent = spaces_count
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, locals=__locals_dict)
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"
@@ -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