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 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: Q2Db = q2app.q2_app.db_logic
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, title=""):
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="q2apps.sqlite")
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
- "host_data", _("Host"), gridlabel=_("Data host"), datalen=100
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
- "host_logic", _("Host"), gridlabel=_("Logic host"), datalen=100
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("q2rad_sqlite_databases"):
250
- os.mkdir("q2rad_sqlite_databases")
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": "q2rad_sqlite_databases/my_first_app_data_storage.sqlite",
239
+ "database_data": "databases/my_first_app_data_storage.sqlite",
258
240
  "driver_logic": "Sqlite",
259
- "database_logic": "q2rad_sqlite_databases/my_first_app_logic_storage.sqlite",
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
- self.db_logic.set_schema(data_schema)
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 = self.selected_application.get("dev_mode") or os.path.isdir(self.q2market_path) or os.path.isfile(".dev")
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
- "update_q2rad",
628
+ "run_q2rad",
613
629
  ("" if "win32" in sys.platform else "#!/bin/bash\n")
614
- + ("q2rad\\scripts\\activate " if "win32" in sys.platform else "source q2rad/bin/activate")
615
- + "&& pip install --upgrade --force-reinstall q2gui"
616
- + "&& pip install --upgrade --force-reinstall q2db"
617
- + "&& pip install --upgrade --force-reinstall q2report"
618
- + "&& pip install --upgrade --force-reinstall q2terminal"
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
- + ("start q2rad\\scripts\\pythonw.exe -m q2rad" if "win32" in sys.platform else "q2rad/bin/q2rad\n"),
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
- open("make_shortcut.vbs", "w").write(
634
- 'Set oWS = WScript.CreateObject("WScript.Shell")\n'
635
- 'Set oLink = oWS.CreateShortcut(oWS.SpecialFolders("Desktop") & "\\q2RAD.lnk")\n'
636
- 'cu = WScript.CreateObject("Scripting.FileSystemObject").'
637
- "GetParentFolderName(WScript.ScriptFullName)\n"
638
- 'oLink.TargetPath = cu & "\\run_q2rad.vbs"\n'
639
- 'oLink.WorkingDirectory = cu & ""\n'
640
- 'oLink.Description = "q2RAD"\n'
641
- 'oLink.IconLocation = cu & "\\assets\\q2rad.ico"\n'
642
- "oLink.Save\n"
643
- )
644
- if sys.platform != "darwin":
645
- if q2AskYN("Should I make a desktop shortcut?") == 2:
646
- self.make_desktop_shortcut()
647
- self.process_events()
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(f"{package} - " f"<b>{current_version}</b> => " f"<b>{latest_version}</b>")
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(f"{executable} -m pip install --upgrade --force-reinstall --no-deps" f" {_source_suffix}{package}{_source_postfix}")
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 = [x["package_name"] for x in q2cursor("select * from packages", self.db_logic).records()]
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
- folder = "make"
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.166"
1
+ __version__ = "0.1.168"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: q2rad
3
- Version: 0.1.166
3
+ Version: 0.1.168
4
4
  Summary: RAD - database, GUI, reports
5
5
  Author: Andrei Puchko
6
6
  Author-email: andrei.puchko@gmx.de
@@ -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=Vvzxt_Aic0Ou06x3azk9_4IFlLCNfrsHJGEWizAMyL0,15425
5
- q2rad/q2appselector.py,sha256=nn5X8nj1gNLLZBGSHxViuVNU5qOrgkvB-4wnNYZu6LI,12445
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=Co9v1DlrtjmCM2nXC9sPUDXkfTL2dt3jyDeeJJg7p-E,42830
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=BA-8-objPNvw7QVKfLIsoKUDOTB_1i9AmioUerVn950,13875
18
- q2rad/version.py,sha256=w0yTzaLPxHMnkI0K1qHPJQ-vcKAvs1qdXwnV6CQgvq4,23
19
- q2rad-0.1.166.dist-info/entry_points.txt,sha256=DmsJQE6f3wYuhdN2h6ARYxSe8_d03paeepfGpdVj5rs,42
20
- q2rad-0.1.166.dist-info/LICENSE,sha256=JRR3LlR18ghhYXT4G2cWgXmnxRvcuVcKlqncWWK4MRY,10347
21
- q2rad-0.1.166.dist-info/METADATA,sha256=rFPVl3e3LbTZuMRjHUVK0JOQiXU0HaqOLT7c3D4K8fM,3509
22
- q2rad-0.1.166.dist-info/WHEEL,sha256=WGfLGfLX43Ei_YORXSnT54hxFygu34kMpcQdmgmEwCQ,88
23
- q2rad-0.1.166.dist-info/RECORD,,
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,,