User management with native gui and further improvements
This commit is contained in:
@@ -30,7 +30,8 @@ gi.require_version('Rsvg', '2.0')
|
||||
from gi.repository import GLib, Gtk, Rsvg
|
||||
|
||||
from yms import database
|
||||
from yms import gtkutils
|
||||
from yms import gtkutils, combobox, treeview
|
||||
from yms import user
|
||||
|
||||
cfg = {
|
||||
'cfgfile': '~/.config/ymsgui.conf',
|
||||
@@ -69,10 +70,11 @@ class Frontend():
|
||||
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']))
|
||||
vessel = {}
|
||||
db.dcur.execute("SELECT vid, vesselname, model FROM vessel ORDER BY vid")
|
||||
for row in db.dcur.fetchall():
|
||||
vessel[row['vid']] = row['vesselname'] + " - " + row['model']
|
||||
combobox.load_from_dict(self.combo['vessel'], vessel, self.vid)
|
||||
|
||||
# load shape of vessel if available
|
||||
handle = Rsvg.Handle()
|
||||
@@ -84,17 +86,97 @@ class Frontend():
|
||||
#viewport.height = 240
|
||||
#self._svg.render_document(ctx, viewport)
|
||||
|
||||
# combos
|
||||
roles = {'captain': 'Captain', 'helmsman': 'Helmsman', 'sailor': 'Sailor'}
|
||||
combobox.load_from_dict(self.combo['user_role'], roles)
|
||||
langs = {'de': 'Deutsch', 'en': 'English'}
|
||||
combobox.load_from_dict(self.combo['user_lang'], langs)
|
||||
|
||||
# prepare lists
|
||||
self.lst_user = Gtk.ListStore(int, str)
|
||||
db.cur.execute("SELECT userid, login FROM user ORDER BY login")
|
||||
db.cur.execute("SELECT userid, login FROM user WHERE userid > 0 ORDER BY login")
|
||||
for row in db.cur.fetchall():
|
||||
self.lst_user.append(row)
|
||||
treeview.add_column(self.tree['user'], 'ID', 0)
|
||||
treeview.add_column(self.tree['user'], 'Login', 1)
|
||||
self.tree['user'].set_model(self.lst_user)
|
||||
|
||||
# current selected objects
|
||||
self._user = user.User(db.conn, 0)
|
||||
print(self._user)
|
||||
|
||||
def run(self):
|
||||
self.label['vessel'].set_text(self.vname)
|
||||
self.window.show_all()
|
||||
Gtk.main()
|
||||
|
||||
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)
|
||||
combobox.activate_row(self.combo['user_lang'], self._user.language)
|
||||
self.check['user_locked'].set_active('locked' in self._user.flags)
|
||||
self.check['user_deleted'].set_active('deleted' in self._user.flags)
|
||||
self.entry['user_pass'].set_text('')
|
||||
|
||||
def on_tvw_user_row_activated(self, widget, path, column):
|
||||
# load selected user
|
||||
self._user.user_id = treeview.get_value(widget, 0)
|
||||
self._user.load()
|
||||
self.user_display()
|
||||
|
||||
def on_but_user_new_clicked(self, widget):
|
||||
# get first free user id and create a new record with name "user<nnn>"
|
||||
self._user.create()
|
||||
self.lst_user.append((self._user.user_id, self._user.login))
|
||||
|
||||
def on_but_user_del_clicked(self, widget):
|
||||
print("Delete user")
|
||||
self._user.delete()
|
||||
selection = self.tree['user'].get_selection()
|
||||
model, tree_iter = selection.get_selected()
|
||||
model.remove(tree_iter)
|
||||
# TODO Select some other user from new list selection
|
||||
self._user.user_id = treeview.get_value(self.tree['user'])
|
||||
self._user.load()
|
||||
self.user_display()
|
||||
|
||||
def on_but_user_newpass_clicked(self, widget):
|
||||
self.entry['user_pass'].set_text(user.User.genpass())
|
||||
# self.lst_user.
|
||||
|
||||
def on_but_user_save_clicked(self, widget):
|
||||
newlogin = self.entry['user_login'].get_text()
|
||||
# check if changed login exists and throw error in that case
|
||||
if newlogin != self._user.login:
|
||||
sql = "SELECT COUNT(login) FROM user WHERE login=%s"
|
||||
db.cur.execute(sql, (newlogin, ))
|
||||
if db.cur.fetchone()[0] > 0:
|
||||
# TODO set error indicator
|
||||
print("Error: Login already exists!")
|
||||
return
|
||||
sql = "UPDATE user SET login=%s WHERE userid=%s"
|
||||
db.cur.execute(sql, (newlogin, self._user.user_id))
|
||||
treeview.set_value(self.tree['user'], 1, newlogin)
|
||||
self._user.displayname = self.entry['user_displayname'].get_text()
|
||||
self._user.role = combobox.get_list_value(self.combo['user_role'])
|
||||
self._user.language = combobox.get_list_value(self.combo['user_lang'])
|
||||
self._user.flags = []
|
||||
if self.check['user_locked'].get_active(): self._user.flags.append('locked')
|
||||
if self.check['user_deleted'].get_active(): self._user.flags.append('deleted')
|
||||
self._user.save()
|
||||
# password field is different. if filled set new password
|
||||
newpass = self.entry['user_pass'].get_text()
|
||||
if len(newpass) >= 8:
|
||||
try:
|
||||
self._user.setpass(newpass)
|
||||
finally:
|
||||
newpass = None
|
||||
self.entry['user_pass'].set_text('')
|
||||
else:
|
||||
# Password to short
|
||||
pass
|
||||
|
||||
def on_but_info_clicked(self, widget):
|
||||
# Userlist
|
||||
sql = ("SELECT userid, login, displayname FROM user ORDER BY login")
|
||||
|
||||
Reference in New Issue
Block a user