Prepare for installation and source code release

This commit is contained in:
2026-08-17 14:43:30 +02:00
parent 2b99c60dd3
commit 35f63d26d3
7 changed files with 129 additions and 20 deletions
+49
View File
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg
viewBox="0 0 1536 1536"
xmlns="http://www.w3.org/2000/svg">
<g
id="database"
transform="matrix(1.2722662,0,0,1.272228,-90.933152,-28.35833)">
<path
d="m 117,608.4 v 178.5 c 1.5,93.7 155.7,169.5 395,169.5 239.3,0 393.4,-75.8 395,-169.5 V 608.4 Z"
fill="#1b9bdb"
style="stroke-width:0.617813" />
<path
d="m 907,607.7 c 0,99.4 -154.8,180 -395,180 -240.2,0 -395,-80.6 -395,-180 0,-99.4 154.8,-180 395,-180 240.2,0 395,80.5 395,180 z"
fill="#ffffff"
style="stroke-width:0.617813" />
<path
d="m 117,428.4 v 158.5 c 1.5,93.7 155.7,179.5 395,179.5 239.3,0 393.4,-85.8 395,-179.5 V 428.4 Z"
fill="#1b9bdb"
style="stroke-width:0.617813" />
<path
d="m 907,427.7 c 0,99.4 -154.8,180 -395,180 -240.2,0 -395,-80.6 -395,-180 0,-99.4 154.8,-180 395,-180 240.2,0 395,80.5 395,180 z"
fill="#ffffff"
style="stroke-width:0.617813" />
<path
d="m 117,248.4 v 158.5 c 1.5,93.7 155.7,179.5 395,179.5 239.3,0 393.4,-85.8 395,-179.5 V 248.4 Z"
fill="#1b9bdb"
style="stroke-width:0.617813" />
<path
d="m 907,247.7 c 0,99.4 -154.8,180 -395,180 -240.2,0 -395,-80.6 -395,-180 0,-99.4 154.8,-180 395,-180 240.2,0 395,80.5 395,180 z"
fill="#3ed6ff"
style="stroke-width:0.617813" />
</g>
<g
id="vessel"
transform="matrix(1.1909726,0,0,1.1909662,-198.75012,-148.39229)">
<path
d="M 1037.0086,942.8165 C 974.9073,737.83301 942.30445,523.89181 951.83243,309.49199 c 1.5097,-38.97292 5.19683,-77.86596 8.09496,-116.78033 1.33545,-17.93774 14.12957,-29.73918 29.76885,-28.01762 15.18766,1.67139 24.69326,15.34216 22.63436,33.07917 -33.49361,282.57064 3.9464,579.18885 117.5337,840.84319 14.0515,28.6031 34.323,54.1283 42.0974,85.5486 -0.8685,0.8127 -1.7384,1.6268 -2.6068,2.4395 22.4824,0.4363 45.4611,-0.9256 67.6396,2.0896 24.6445,3.8083 31.7539,27.8852 14.8155,46.1268 -42.8084,33.5071 -93.4092,57.5965 -144.1675,76.5923 -45.2046,15.5791 -92.8194,15.752 -140.07182,14.7971 -86.06691,-2.4785 -172.62034,-4.5918 -258.15753,-14.5378 -49.89263,-6.6633 -89.41252,-33.7999 -122.0572,-71.3733 -13.21372,-15.2083 -26.37865,-30.4626 -39.73874,-45.5441 -9.4764,-10.6974 -10.62506,-25.0345 -2.49944,-35.8518 7.82173,-10.413 21.13582,-11.584 34.42482,-7.7519 58.20923,12.4036 118.76875,12.9598 177.93008,19.0738 116.70842,6.7176 232.51074,16.4769 349.60533,15.8078 -107.60982,-101.9209 -250.59373,-174.55152 -386.30655,-76.5421 -36.41405,23.8245 -62.39401,63.1905 -94.97736,7.8272 -161.7569,-288.68926 58.74593,-585.96682 271.1984,-776.50727 10.62367,-9.71744 23.00936,-11.36791 32.93463,-4.62244 10.06468,6.84027 13.4744,18.81456 8.23018,32.2149 -107.65021,209.91817 -24.71143,451.69299 97.1213,635.25935 0.5771,-0.28437 1.1529,-0.56456 1.73,-0.84614 z M 629.22054,855.6216 c 2.64024,35.38899 6.80412,87.08895 19.83243,124.46576 3.86278,12.49983 15.35351,17.36761 25.40425,13.65265 10.09116,-3.73169 14.12679,-14.04296 10.64179,-26.96238 -50.10731,-188.23341 43.24326,-376.97144 157.7854,-522.04023 7.43699,-8.44334 11.91451,-23.02159 4.19454,-31.75907 -12.41217,-8.27327 -26.32149,3.53793 -34.90295,12.81905 C 698.60268,542.0512 635.33044,690.09335 629.22054,855.6216 Z"
fill="#000000"
style="fill:#044a6c;fill-opacity:1;stroke-width:0.689852" />
<path
d="m 976.33894,1356.0705 c -106.98667,25.935 -160.80619,60.3789 -268.18457,0.9479 -83.80725,-45.1288 -152.96774,47.5988 -271.91213,-6.3594 -59.29377,-30.832 -86.0014,-16.994 -139.15153,16.1855 -12.44423,7.2878 -23.33834,6.6061 -31.00534,-2.0644 -7.54153,-8.5284 -8.05034,-21.3029 1.8596,-31.0008 49.1605,-48.1007 101.79234,-72.3253 166.37634,-46.3094 81.32174,40.1062 120.05401,16.0991 200.59093,-0.9702 92.29392,-18.6557 148.72441,75.2624 246.39219,32.0253 70.72316,-27.9312 115.42315,-28.2797 187.00917,-3.485 45.8612,16.2051 88.8145,-7.7826 131.3747,-23.0369 66.9956,-28.7494 133.4782,6.9866 198.992,22.6201 42.7219,10.7058 34.2534,66.196 -10.6752,61.8231 -29.3883,-6.5698 -59.0972,-13.3655 -87.2644,-24.2748 -92.043,-34.5247 -143.9527,62.0098 -261.4404,19.63 -20.3914,-6.2952 -41.45474,-10.4283 -62.96136,-15.731 z"
fill="#000000"
style="fill:#044a6c;fill-opacity:1;stroke-width:0.689852" />
<path
d="m 629.22333,855.62439 c 6.09457,-165.49758 69.39608,-313.59968 182.95406,-429.82561 8.56334,-9.26022 22.53958,-21.18433 34.90574,-12.81626 7.66282,8.87408 3.26754,23.24881 -4.19872,31.75627 -114.52681,145.02977 -207.89968,333.85143 -157.78122,522.04302 3.48361,12.91663 -0.55202,23.2293 -10.64318,26.96099 -10.05074,3.71635 -21.54008,-1.15282 -25.40564,-13.65126 -13.02693,-37.33638 -17.20892,-89.08095 -19.83104,-124.46715 z"
fill="#ffffff"
style="stroke-width:0.689852" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+11
View File
@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=YMS
Comment=Yacht Management Software
Exec=/usr/local/bin/yms
Icon=yms
StartupNotify=true
Terminal=false
Type=Application
Categories=Office;
Keywords=Database;Documentation
Executable
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
# should be located in /usr/local/bin as yms
exec /usr/bin/python3 /usr/local/lib/yms/ymsgui.py "$@"
+38
View File
@@ -31,3 +31,41 @@ def init_named_controls(window, builder):
continue
var = getattr(window, ctrltype[nameparts[0]])
var[nameparts[2]] = widget
def messagebox(messagetext, symbol=None, title=None, parent=None):
if not symbol:
symbol = Gtk.MessageType.INFO
if parent:
flags = Gtk.DialogFlags.DESTROY_WITH_PARENT
else:
flags = 0
md = Gtk.MessageDialog(parent=parent, flags=flags, message_type=symbol, buttons=Gtk.ButtonsType.CLOSE)
md.set_markup(messagetext)
if title:
md.set_title(title)
if not parent:
md.set_position(Gtk.WindowPosition.CENTER)
md.run()
md.destroy()
def questionbox(messagetext, symbol=None, title=None, parent=None):
"""
Ja/Nein-Nachfrage bei wirklich wichtigen Entscheidungen
Die Entscheidung wird als Rückgabewert geliefert: True falls
zugestimmt wurde, False bei Ablehnung
"""
if not symbol:
symbol = Gtk.MessageType.QUESTION
if parent:
flags = Gtk.DialogFlags.DESTROY_WITH_PARENT
else:
flags = 0
md = Gtk.MessageDialog(parent=parent, flags=flags, message_type=symbol, buttons=Gtk.ButtonsType.YES_NO)
md.set_markup(messagetext)
if title:
md.set_title(title)
if not parent:
md.set_position(Gtk.WindowPosition.CENTER)
response = md.run()
md.destroy()
return response == Gtk.ResponseType.YES
+25 -17
View File
@@ -110,7 +110,7 @@ class Frontend():
self.window.show_all()
Gtk.main()
def user_display(self)
def user_display(self):
self.entry['user_login'].set_text(self._user.login)
self.entry['user_displayname'].set_text(self._user.displayname)
combobox.activate_row(self.combo['user_role'], self._user.role)
@@ -132,6 +132,12 @@ class Frontend():
def on_but_user_del_clicked(self, widget):
print("Delete user")
answer = gtkutils.questionbox(
_("Delete user!\n"
"Are you sure?"
), title="YMS")
if answer == False:
return
self._user.delete()
selection = self.tree['user'].get_selection()
model, tree_iter = selection.get_selected()
@@ -210,20 +216,6 @@ class Frontend():
def on_destroy(self, widget, data=None):
Gtk.main_quit()
def messagebox(messagetext, symbol=None, title=None, parent=None):
if not symbol:
symbol = Gtk.MessageType.INFO
if parent:
symbol |= Gtk.DIALOG_DESTROY_WITH_PARENT
md = Gtk.MessageDialog(parent=parent, flags=0, message_type=symbol, buttons=Gtk.ButtonsType.CLOSE)
md.set_markup(messagetext)
if title:
md.set_title(title)
if not parent:
md.set_position(Gtk.WindowPosition.CENTER)
md.run()
md.destroy()
def create_config(cfgfile):
# create inital config file
with open(cfgfile, 'w') as fh:
@@ -238,6 +230,21 @@ def create_config(cfgfile):
os.chmod(cfgfile, 0o600)
if __name__ == "__main__":
dialog = Gtk.MessageDialog(
message_type=Gtk.MessageType.QUESTION,
buttons=Gtk.ButtonsType.YES_NO,
text="Are you sure?"
)
image = Gtk.Image.new_from_stock(
Gtk.STOCK_DIALOG_QUESTION,
Gtk.IconSize.DIALOG
)
dialog.set_image(image)
dialog.show_all()
response = dialog.run()
dialog.destroy()
locale.setlocale(locale.LC_ALL, '')
gettext.bindtextdomain('ymsgui', 'locale')
gettext.textdomain('ymsgui')
@@ -246,11 +253,12 @@ if __name__ == "__main__":
cfgfile = os.path.expanduser(cfg['cfgfile'])
if not config.read(cfgfile):
create_config(cfgfile)
messagebox(_("Configuration file '%s' not found.\n"
gtkutils.messagebox(
_("Configuration file '{}' not found.\n"
"Default configuration has been created.\n"
"Please edit that file according to your needs.\n\n"
"Then restart this program."
) % cfgfile, title="YMS")
).format(cfgfile), title="YMS")
else:
cfg['host'] = config.get('DB', 'host')
cfg['db'] = config.get('DB', 'db')