#!/usr/bin/python3 """ YMS native GUI. Runs as user SYSTEM with id=0 Configuration file located at ~/.config/ymsgui.conf: [DB] host = localhost db = yms user = ymsgui pass = topsecret [Documents] basepath = /var/local/yms """ import os import sys import locale import gettext import configparser os.environ["NO_AT_BRIDGE"] = "1" # fix dbus warnings import gi gi.require_version("Gtk", "3.0") from gi.repository import GLib, Gtk from yms import database from yms import gtkutils cfg = { 'cfgfile': '~/.config/ymsgui.conf', 'host': 'localhost', 'db': 'yms', 'user': 'yms', 'docpath': '/var/local/yms' } class Frontend(): def __init__(self): builder = Gtk.Builder() builder.add_from_file("yms/ui/main.ui") builder.connect_signals(self) self.window = builder.get_object("wnd_main") gtkutils.init_named_controls(self, builder) # get current vessel id db.cur.execute("SELECT valint FROM settings WHERE userid=0 AND sno=1") row = db.cur.fetchone() if not row: self.vid = 0 self.vname = "Ghost" db.cur.execute("INSERT INTO settings (userid, sno, valint) VALUES (0, 1, 0)") db.conn.commit() else: self.vid = row[0] # get vessel infos if self.vid > 0: db.cur.execute("SELECT vesselname, model FROM vessel WHERE vid=%s", (self.vid, )) self.vessel = db.cur.fetchone() print(self.vessel['vesselname']) else: self.vname = "Ghost(0)" # get list of vessels db.cur.execute("SELECT vid, vesselname, model FROM vessel ORDER BY vid") for row in db.cur.fetchall(): print(row) #print(type(self.combo['vessel'])) def run(self): self.label['vessel'].set_text(self.vname) self.window.show_all() Gtk.main() def on_but_info_clicked(self, widget): # Userlist sql = ("SELECT userid, login, displayname FROM user ORDER BY login") db.cur.execute(sql) for row in db.cur.fetchall(): print(row) def on_but_equip_detail_clicked(self, widget): self.stack['equipment'].set_visible_child(self.box['equip_detail']) def on_but_equip_edit_clicked(self, widget): self.stack['equipment'].set_visible_child(self.box['equip_edit']) def on_but_equip_save_clicked(self, widget): pass def on_but_equip_cancel_clicked(self, widget): self.stack['equipment'].set_visible_child(self.box['equipment']) def on_but_equip_cancel_clicked(self, widget): self.stack['equipment'].set_visible_child(self.box['equipment']) 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: fh.write('[DB]\n') fh.write('host = {}\n'.format(cfg['host'])) fh.write('db = {}\n'.format(cfg['db'])) fh.write('user = {}\n'.format(cfg['user'])) fh.write('pass = changeme!\n\n') fh.write('[documents]\n') fh.write('basepath = {}\n'.format(cfg['docpath'])) # secure configuration os.chmod(cfgfile, 0o600) if __name__ == "__main__": locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain('ymsgui', 'locale') gettext.textdomain('ymsgui') _ = gettext.gettext config = configparser.ConfigParser() cfgfile = os.path.expanduser(cfg['cfgfile']) if not config.read(cfgfile): create_config(cfgfile) messagebox(_("Configuration file '%s' 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") else: cfg['host'] = config.get('DB', 'host') cfg['db'] = config.get('DB', 'db') cfg['user'] = config.get('DB', 'user') cfg['pass'] = config.get('DB', 'pass') db = database.Database(cfg['host'], cfg['db']) if db.connect(cfg['user'], cfg['pass']): app = Frontend() app.run() db.disconnect() else: errno, errtxt = db.last_error() messagebox(_("Database connection cannot be established.\n\n" "Server: %s\nDatabase: %s\n" "Error: %s (%d)" ) % (cfg['host'], cfg['db'], errtxt, errno), title="YMS") # Another fine product of the sirius cybernetics corporation