q2rad 0.1.219__py3-none-any.whl → 0.1.221__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 CHANGED
@@ -173,10 +173,18 @@ class AppManager(Q2Form):
173
173
  "load_app",
174
174
  "From JSON file",
175
175
  control="button",
176
+ mess="Excluding _ prefixes",
176
177
  # datalen=10,
177
178
  valid=self.import_app,
178
179
  )
179
-
180
+ self.add_control(
181
+ "load_app_all",
182
+ "From JSON file *",
183
+ mess="Import all, including _ prefixes",
184
+ control="button",
185
+ # datalen=10,
186
+ valid=self.import_app_all,
187
+ )
180
188
  if self.q2_app.app_url:
181
189
  self.add_control(
182
190
  "load_q2market_app",
@@ -455,6 +463,19 @@ class AppManager(Q2Form):
455
463
  # self.q2_app.migrate_db_data()
456
464
  self.q2_app.open_selected_app()
457
465
 
466
+ def import_app_all(self, file=""):
467
+ filetype = "JSON(*.json)"
468
+ if not file:
469
+ file, filetype = q2app.q2_app.get_open_file_dialoq("Import Application", filter=filetype)
470
+
471
+ if not file or not os.path.isfile(file):
472
+ return
473
+
474
+ data = json.load(open(file))
475
+ self.import_json_app(data, prefix="*")
476
+ # self.q2_app.migrate_db_data()
477
+ self.q2_app.open_selected_app()
478
+
458
479
  @staticmethod
459
480
  def import_json_app(data, db=None, prefix=""):
460
481
  if db is None:
@@ -469,7 +490,9 @@ class AppManager(Q2Form):
469
490
  continue
470
491
  wait_row = Q2WaitShow(len(data[table]))
471
492
  if table != "packages":
472
- if prefix:
493
+ if prefix == "*":
494
+ db.cursor(f"delete from `{table}`")
495
+ elif prefix:
473
496
  db.cursor(f'delete from `{table}` where substr(name,1,{len(prefix)}) = "{prefix}"')
474
497
  else:
475
498
  db.cursor(f'delete from `{table}` where substr(name,1,1) <> "_"')
@@ -484,7 +507,9 @@ class AppManager(Q2Form):
484
507
  ):
485
508
  continue
486
509
  else:
487
- if prefix:
510
+ if prefix == "*":
511
+ pass
512
+ elif prefix:
488
513
  if not row.get("name").startswith(prefix):
489
514
  continue
490
515
  else:
q2rad/q2appselector.py CHANGED
@@ -467,7 +467,7 @@ class Q2AppSelect(Q2Form):
467
467
  self.close()
468
468
  AppManager.import_json_app(json.load(response_app))
469
469
  self.q2_app.open_selected_app()
470
- self.q2_app.migrate_db_data()
470
+ # self.q2_app.migrate_db_data()
471
471
  AppManager.import_json_data(json.load(response_data))
472
472
  else:
473
473
  q2Mess(_("Can't to load Demo App"))
q2rad/q2extensions.py CHANGED
@@ -25,6 +25,8 @@ from q2rad.q2appmanager import AppManager
25
25
  from q2terminal.q2terminal import Q2Terminal
26
26
  import gettext
27
27
  import json
28
+ from q2rad.q2raddb import read_url
29
+ from q2gui.q2model import Q2Model
28
30
 
29
31
 
30
32
  _ = gettext.gettext
@@ -40,7 +42,9 @@ class Q2Extensions(Q2Form):
40
42
  self.add_control("prefix", _("Name"), datatype="char", datalen=50, pk="*")
41
43
  self.add_control("seq", _("Sequence number"), datatype="int")
42
44
  self.add_control("version", _("Version"), datatype="char", datalen=16, readonly=True)
43
- self.add_control("checkupdates", _("Check for updatea"), control="check", datatype="char", datalen=1)
45
+ self.add_control("q2market_path", _("q2market folder"), datatype="char", datalen=255)
46
+ self.add_control("q2market_url", _("q2market url"), datatype="char", datalen=255)
47
+ self.add_control("checkupdates", _("Check for updates"), control="check", datatype="char", datalen=1)
44
48
  self.add_control("comment", _("Comment"), datatype="text")
45
49
 
46
50
  cursor: Q2Cursor = self.q2_app.db_data.table(table_name="extensions")
@@ -49,11 +53,19 @@ class Q2Extensions(Q2Form):
49
53
  self.set_model(model)
50
54
  self.add_action("/crud")
51
55
  self.add_action("Export|as JSON file", self.export_json, eof_disabled=True)
52
- if os.path.isdir(self.q2_app.q2market_path):
53
- self.add_action("Export|to q2Market", self.export_q2market, eof_disabled=True)
56
+ # if os.path.isdir(self.q2_app.q2market_path):
57
+ self.add_action("Export|to q2Market", self.export_q2market, eof_disabled=True)
54
58
  self.add_action("Import|from JSON file", self.import_json, eof_disabled=True)
55
59
  self.add_action("Import|from q2Market", self.import_q2market, eof_disabled=True)
56
60
 
61
+ def before_form_show(self):
62
+ if self.crud_mode == "NEW":
63
+ if q2AskYN("Would you like to download one from q2market?") == 2:
64
+ q2market = Q2MarketExt().run()
65
+ if q2market.heap._return:
66
+ self.s.prefix = q2market.heap._return
67
+ self.s.checkupdates = "*"
68
+
57
69
  def info(self):
58
70
  pass
59
71
 
@@ -96,42 +108,48 @@ class Q2Extensions(Q2Form):
96
108
 
97
109
  def export_q2market(self):
98
110
  prefix = self.r.prefix
99
- if not self.q2_app.app_url:
111
+ q2market_path = self.r.q2market_path if self.r.q2market_path else self.q2_app.q2market_path
112
+ q2market_url = self.r.q2market_url if self.r.q2market_url else self.q2_app.q2market_url
113
+ if not os.path.isdir(q2market_path):
114
+ q2Mess("No q2market path!")
115
+ return
116
+ if not q2market_url:
100
117
  q2Mess("No App URL!")
101
118
  return
102
119
  if (
103
120
  q2AskYN(
104
121
  f"<p>You are about to export Extension ({prefix}) "
105
- f"<p>into folder {os.path.abspath(self.q2_app.q2market_path)}"
122
+ f"<p>into folder {os.path.abspath(q2market_path)}"
123
+ f"<p>and upload into {os.path.abspath(q2market_url)}"
106
124
  "<p>Are you sure?"
107
125
  )
108
126
  != 2
109
127
  ):
110
128
  return
111
129
 
112
- q2market_file = f"{self.q2_app.q2market_path}/q2market.json"
130
+ q2market_file = f"{q2market_path}/q2market.json"
113
131
  if os.path.isfile(q2market_file):
114
132
  q2market = json.load(open(q2market_file))
115
133
  else:
116
134
  q2market = {}
117
135
 
118
136
  version = datetime.now().strftime(r"%Y-%m-%d %H:%M:%S")
119
- ext_url = f"{os.path.dirname(self.q2_app.app_url)}/{prefix}"
137
+ ext_url = f"{q2market_url}/{prefix}"
120
138
  q2market[ext_url] = {
121
139
  "ext_title": prefix,
122
140
  "ext_version": version,
123
141
  "ext_description": self.r.comment,
124
142
  }
125
143
  json.dump(q2market, open(q2market_file, "w"), indent=2)
126
- open(f"{self.q2_app.q2market_path}/{prefix}.version", "w").write(version)
144
+ open(f"{q2market_path}/{prefix}.version", "w").write(version)
127
145
  self.db.update("extensions", {"prefix": prefix, "version": version})
128
146
 
129
- self.export_json(f"{self.q2_app.q2market_path}/{prefix}.json")
147
+ self.export_json(f"{q2market_path}/{prefix}.json")
130
148
 
131
149
  trm = Q2Terminal(callback=print)
132
150
 
133
151
  def worker():
134
- trm.run(f"cd {self.q2_app.q2market_path}")
152
+ trm.run(f"cd {q2market_path}")
135
153
  trm.run("git add -A")
136
154
  trm.run(f"""git commit -a -m"{version}" """)
137
155
 
@@ -140,4 +158,39 @@ class Q2Extensions(Q2Form):
140
158
  trm.close()
141
159
 
142
160
  def import_q2market(self):
143
- q2app.q2_app.check_ext_update(self.r.prefix, force_update=True)
161
+ q2market_url = self.r.q2market_url if self.r.q2market_url else self.q2_app.q2market_url
162
+ if q2market_url:
163
+ q2app.q2_app.check_ext_update(self.r.prefix, force_update=True)
164
+ else:
165
+ q2Mess("No App URL!")
166
+
167
+
168
+ class Q2MarketExt(Q2Form):
169
+ def __init__(self, title=""):
170
+ super().__init__("q2Market")
171
+ self.no_view_action = True
172
+ self.heap._return = None
173
+
174
+ def on_init(self):
175
+ self.add_control("ext_title", _("Name"), datatype="char", datalen=100)
176
+ self.add_control("ext_version", _("Version"), datatype="char", datalen=100)
177
+ self.add_control("ext_description", _("Description"), control="text", datatype="char", datalen=100)
178
+ self.add_control("ext_url", _("Path"), datatype="char", datalen=100)
179
+
180
+ q2market_catalogue_url = f"{self.q2_app.q2market_url}/q2market.json"
181
+ data = json.loads(read_url(q2market_catalogue_url).decode("utf-8"))
182
+ rez = []
183
+ for x in data:
184
+ if "ext_title" in data[x]:
185
+ rec = data[x]
186
+ rec["ext_url"] = x
187
+ rez.append(rec)
188
+ model = Q2Model()
189
+ model.set_records(rez)
190
+ self.set_model(model)
191
+ self.add_action_view()
192
+ self.add_action("Select", self.select_row, tag="select", eof_disabled=1)
193
+
194
+ def select_row(self):
195
+ self.heap._return = self.r.ext_title
196
+ self.close()
q2rad/q2forms.py CHANGED
@@ -288,7 +288,7 @@ class Q2Forms(Q2Form, Q2_save_and_run):
288
288
  super().after_crud_save()
289
289
  if self.crud_mode != "EDIT":
290
290
  if self.s.form_table:
291
- ai = "*" if q2ask("Set AUTOINCREMENT for primary key?") else ""
291
+ ai = "*" if q2ask("Set AUTOINCREMENT for primary key?") == 2 else ""
292
292
  self.db.insert(
293
293
  "lines",
294
294
  {
q2rad/q2lines.py CHANGED
@@ -125,7 +125,8 @@ class Q2Lines(Q2Form, Q2_save_and_run):
125
125
  if self.add_control("/h"):
126
126
  self.add_control("stretch", _("Stretch factor"), datatype="int")
127
127
  self.add_control("alignment", _("Alignment"), datatype="int", datalen=3)
128
- self.add_control("tag", _("Tag"), datatype="char", datalen=100)
128
+ self.add_control("tag", _("Tag"), datatype="char", datalen=100, stretch=99)
129
+ self.add_control("/s")
129
130
  self.add_control("/")
130
131
  if self.add_control("/h", _("Control type")):
131
132
  self.add_control(
q2rad/q2modules.py CHANGED
@@ -104,7 +104,7 @@ class Q2Modules(Q2Form, Q2_save_and_run):
104
104
  != 2
105
105
  ):
106
106
  return False
107
- self.s.last_line = self.w.script.current_line()+1
107
+ self.s.last_line = self.w.script.current_line() + 1
108
108
  # return super().before_crud_save()
109
109
 
110
110
  def before_form_show(self):
@@ -118,8 +118,12 @@ class Q2Modules(Q2Form, Q2_save_and_run):
118
118
  self.w.script.set_focus()
119
119
 
120
120
  def script_runner(self):
121
- self.q2_app.code_runner(self.r.script)()
121
+ # self.q2_app.code_runner(self.r.script)()
122
+ from q2rad.q2rad import run_module
123
+ run_module(script=self.r.script)
122
124
 
123
125
  def editor_just_run(self):
124
- self.q2_app.code_runner(self.s.script)()
126
+ # self.q2_app.code_runner(self.s.script)()
127
+ from q2rad.q2rad import run_module
128
+ run_module(script=self.s.script)
125
129
  self.w.script.set_focus()
q2rad/q2rad.py CHANGED
@@ -139,6 +139,7 @@ def run_module(module_name=None, _globals={}, _locals={}, script="", import_only
139
139
  else:
140
140
  __name__ = "__main__"
141
141
 
142
+ _globals.update(globals())
142
143
  _globals.update(
143
144
  {
144
145
  "RETURN": None,
@@ -149,7 +150,6 @@ def run_module(module_name=None, _globals={}, _locals={}, script="", import_only
149
150
  "__name__": __name__,
150
151
  }
151
152
  )
152
- _globals.update(globals())
153
153
  try:
154
154
  if _locals:
155
155
  exec(code["code"], _globals, _locals)
@@ -322,7 +322,7 @@ class Q2RadApp(Q2App):
322
322
  self.set_title("Open Application")
323
323
  Q2AppSelect().run(autoload_enabled)
324
324
  if self.selected_application != {}:
325
- self.open_selected_app(True)
325
+ self.open_selected_app(True, migrate_db_data=False)
326
326
  self.check_app_update()
327
327
  self.check_ext_update()
328
328
  self.on_new_tab()
@@ -330,14 +330,18 @@ class Q2RadApp(Q2App):
330
330
  self.close()
331
331
  self.subwindow_count_changed()
332
332
 
333
- def open_selected_app(self, go_to_q2market=False):
333
+ def open_selected_app(self, go_to_q2market=False, migrate_db_data=True):
334
334
  wait = Q2WaitShow(5, "Loading app> ")
335
335
  wait.step("Prepare")
336
336
  self.clear_app_info()
337
337
  wait.step("Migrate logic DB")
338
338
  self.migrate_db_logic(self.db_logic)
339
- wait.step("Migrate data DB")
340
- self.migrate_db_data()
339
+ if migrate_db_data:
340
+ wait.step("Migrate data DB")
341
+ self.migrate_db_data()
342
+ else:
343
+ wait.step("Create menus")
344
+ self.create_menu()
341
345
  wait.step("looking for updates")
342
346
  self.process_events()
343
347
  wait.step("Done!")
@@ -926,7 +930,7 @@ class Q2RadApp(Q2App):
926
930
  AppManager.import_json_app(data)
927
931
  self.open_selected_app()
928
932
 
929
- def check_ext_update(self, prefix="", force_update=False):
933
+ def check_ext_update(self, prefix="", force_update=False, _ext_url=""):
930
934
  if self.frozen:
931
935
  return
932
936
  if prefix:
@@ -935,7 +939,14 @@ class Q2RadApp(Q2App):
935
939
  cu = q2cursor(f"select * from extensions where checkupdates<>'' order by seq")
936
940
  for row in cu.records():
937
941
  _prefix = row["prefix"]
938
- ext_url = f"{os.path.dirname(self.app_url)}/{_prefix}"
942
+
943
+ if _ext_url:
944
+ ext_url = f"{_ext_url}/{_prefix}"
945
+ elif self.app_url:
946
+ ext_url = f"{os.path.dirname(self.app_url)}/{_prefix}"
947
+ else:
948
+ ext_url = f"{self.q2market_url}/{_prefix}"
949
+
939
950
  ext_version = row["version"]
940
951
  if not os.path.isdir(self.q2market_path) or force_update:
941
952
  try:
@@ -963,6 +974,7 @@ class Q2RadApp(Q2App):
963
974
  ):
964
975
  data = json.load(open_url(ext_url + ".json")) # noqa F405
965
976
  AppManager.import_json_app(data, prefix=_prefix)
977
+ update("extensions", {"prefix":row["prefix"], "version":market_version})
966
978
  self.open_selected_app()
967
979
 
968
980
  def update_app_packages(self):
q2rad/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.219"
1
+ __version__ = "0.1.221"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: q2rad
3
- Version: 0.1.219
3
+ Version: 0.1.221
4
4
  Summary: RAD - database, GUI, reports
5
5
  Author: Andrei Puchko
6
6
  Author-email: andrei.puchko@gmx.de
@@ -1,25 +1,25 @@
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=eExRvOSyLhT_v1XCR-DmLEhQ9g_LRkrlyXnwDCjT0LM,8258
4
- q2rad/q2appmanager.py,sha256=o5j4bBz5wTVYn8Dot10HS_O1uyDEyzydOpz0NCxUHKI,19522
5
- q2rad/q2appselector.py,sha256=-QazsbpOxRlzuCZZ35QU-p9iiBrF16oDU-Os-5rPIRQ,18811
4
+ q2rad/q2appmanager.py,sha256=4c1h5I_7f4S7Ef9nDnDQthRqPC-uyK8v8B8zmhdhtr0,20567
5
+ q2rad/q2appselector.py,sha256=bjl4MDg9DoU1h6NZOQDElaIGURjVQwiHnsUwr3kp3nc,18813
6
6
  q2rad/q2constants.py,sha256=dQtN4OMvZw0FATDAFYjolI7eGMVUnNnbTl6qM-ggZ4I,3416
7
- q2rad/q2extensions.py,sha256=PclrX3vPgqwjQIOqiKrRiJaBvhWlCjDUmmxvnF0FLwc,5281
8
- q2rad/q2forms.py,sha256=36NriEUquuF97fkHpBBQyw1PDIrBQQlwxb21YVrmtng,11117
9
- q2rad/q2lines.py,sha256=KQslxn06vypKSFahCDAa7oFPoo_BhvABTKy5iDEOFbc,19133
7
+ q2rad/q2extensions.py,sha256=iQz8_GlMCm8g9LOR3aP3YSBgi9rD5i1YkuNaxRiTn5g,7541
8
+ q2rad/q2forms.py,sha256=e9FrhXjvi9ZmrhRBmnmsHoPxDQJqsanLnsPjY6rjaQI,11122
9
+ q2rad/q2lines.py,sha256=hGdEOdUmBdBpfJ4jHBrXR4gLRXCrgn0dlywsH8nbJ6Q,19185
10
10
  q2rad/q2make.py,sha256=wXoyBUwf2zaAl9JjWDCbjAteUElRq0O7ippyaMY9eug,6476
11
11
  q2rad/q2market.py,sha256=RNXTNv-fFUgbzBGhHPNXlzGjsAHAtz71BRbTErJarNo,2641
12
- q2rad/q2modules.py,sha256=FetB84IxsuDzNYKTFM3BdvfH5GrWrFKoi6cV5uW1fKo,4360
12
+ q2rad/q2modules.py,sha256=SpDdXJPG6IcVz1u3xnLoynA2rmiODCNZTZJT8s5iTRI,4538
13
13
  q2rad/q2packages.py,sha256=y72L1RAw1OgtKGaL8lJ1KHIaers5I6kTZSiphwwrY0M,3808
14
14
  q2rad/q2queries.py,sha256=l9SJ_T5Y38p23xa505EPZocCEmFw_a2y4ck0_-AHVP0,13119
15
- q2rad/q2rad.py,sha256=--C8iBgUlOxDHCVjsf6E1rbDIW3oRZ_cIufksiaeV8U,51838
15
+ q2rad/q2rad.py,sha256=5IfUu4VHhqVuygem5ZwWFdj1WL_1VyXSKLngaVtbxbo,52313
16
16
  q2rad/q2raddb.py,sha256=tMX971d_awTwiWeYLkZGSfdrIs88oiNHBAs2cMFvSbU,4685
17
17
  q2rad/q2reports.py,sha256=1fewf1Zlz98raqTIWlRLIg-zTCYA2flGVqyIC120UEU,84802
18
18
  q2rad/q2stylesettings.py,sha256=rEJLyLzsffJEXnMbg9bPB3KHLjYfw-49QgrtcYOfGV0,4769
19
19
  q2rad/q2utils.py,sha256=Vb5K8Lbb7PzQGDiBEHFrPyDcytVnUSVXy9yIkvWM1Oc,19734
20
- q2rad/version.py,sha256=oVgRTA3VUYJNe8a3a2qNCC9nbYyeVwJmTF9d4EbOWMo,23
21
- q2rad-0.1.219.dist-info/entry_points.txt,sha256=DmsJQE6f3wYuhdN2h6ARYxSe8_d03paeepfGpdVj5rs,42
22
- q2rad-0.1.219.dist-info/LICENSE,sha256=JRR3LlR18ghhYXT4G2cWgXmnxRvcuVcKlqncWWK4MRY,10347
23
- q2rad-0.1.219.dist-info/METADATA,sha256=4Kh5XxHBz9DfsFf0CidLrhFxMyNu3R6SRd8ViNkobyM,3369
24
- q2rad-0.1.219.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
25
- q2rad-0.1.219.dist-info/RECORD,,
20
+ q2rad/version.py,sha256=cAD9mqAwq0S1-BMh3hvd-bOW2U1IH16XAr4cwraQU60,23
21
+ q2rad-0.1.221.dist-info/entry_points.txt,sha256=DmsJQE6f3wYuhdN2h6ARYxSe8_d03paeepfGpdVj5rs,42
22
+ q2rad-0.1.221.dist-info/LICENSE,sha256=JRR3LlR18ghhYXT4G2cWgXmnxRvcuVcKlqncWWK4MRY,10347
23
+ q2rad-0.1.221.dist-info/METADATA,sha256=_pCl1FLf9OSMdKqMC6eH-8wYEg1xpviYD4I-bfGrXso,3369
24
+ q2rad-0.1.221.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
25
+ q2rad-0.1.221.dist-info/RECORD,,