tui: add user lookup
This commit is contained in:
parent
326b5988af
commit
e8cd6e9596
92
tui.py
92
tui.py
@ -13,7 +13,7 @@ from core.data import Data
|
||||
from core.config import CoreConfig
|
||||
|
||||
try:
|
||||
from asciimatics.widgets import Frame, Layout, Text, Button, RadioButtons, CheckBox, Divider
|
||||
from asciimatics.widgets import Frame, Layout, Text, Button, RadioButtons, CheckBox, Divider, Label
|
||||
from asciimatics.scene import Scene
|
||||
from asciimatics.screen import Screen
|
||||
from asciimatics.exceptions import ResizeScreenError, NextScene, StopApplication
|
||||
@ -30,7 +30,7 @@ class State:
|
||||
|
||||
def __str__(self):
|
||||
if self.id is not None:
|
||||
return f"{self.name} ({self.id})" if self.name else f"User {self.id}"
|
||||
return f"{self.name} ({self.id})" if self.name else f"User{self.id:04d}"
|
||||
return "None"
|
||||
|
||||
def __int__(self):
|
||||
@ -171,15 +171,23 @@ class ManageUser(Frame):
|
||||
screen.width * 2 // 3,
|
||||
hover_focus=True,
|
||||
can_scroll=False,
|
||||
title="User Management"
|
||||
title="User Management",
|
||||
on_load=self._redraw
|
||||
)
|
||||
|
||||
layout = Layout([3])
|
||||
self.add_layout(layout)
|
||||
layout.add_widget(Button("Create User", self._create_user))
|
||||
layout.add_widget(Button("Lookup User", self._lookup))
|
||||
layout.add_widget(Button("Edit User", self._edit_user, disabled=state.selected_user.id != 0))
|
||||
layout.add_widget(Button("Delete User", self._del_user, disabled=state.selected_user.id != 0))
|
||||
|
||||
def _redraw(self):
|
||||
self._layouts = [self._layouts[0]]
|
||||
|
||||
layout = Layout([3])
|
||||
self.add_layout(layout)
|
||||
layout.add_widget(Button("Edit User", self._edit_user, disabled=state.selected_user.id == 0 or state.selected_user.id is None))
|
||||
layout.add_widget(Button("Delete User", self._del_user, disabled=state.selected_user.id == 0 or state.selected_user.id is None))
|
||||
layout.add_widget((Divider()))
|
||||
|
||||
usr_cards = []
|
||||
#if state.selected_user.id != 0:
|
||||
@ -187,10 +195,9 @@ class ManageUser(Frame):
|
||||
#for card in cards:
|
||||
#usr_cards.append(card._asdict())
|
||||
|
||||
if len(usr_cards) > 0:
|
||||
layout3 = Layout([100], True)
|
||||
self.add_layout(layout3)
|
||||
if len(usr_cards) > 0:
|
||||
layout.add_widget(Divider())
|
||||
layout3.add_widget(RadioButtons(
|
||||
[(f"{card['id']}\t{card['access_code']}\t{card['status']}", card['id']) for card in usr_cards],
|
||||
"Cards:",
|
||||
@ -198,12 +205,12 @@ class ManageUser(Frame):
|
||||
))
|
||||
layout3.add_widget(Divider())
|
||||
|
||||
layout2 = Layout([1, 1, 1, 1])
|
||||
layout2 = Layout([1, 1, 1])
|
||||
self.add_layout(layout2)
|
||||
a = Text("", f"status", readonly=True, disabled=True)
|
||||
a.value = f"Selected User: {state.selected_user}"
|
||||
layout2.add_widget(a)
|
||||
layout2.add_widget(Button("Back", self._back), 3)
|
||||
layout2.add_widget(Button("Back", self._back), 2)
|
||||
|
||||
self.fix()
|
||||
|
||||
@ -217,11 +224,11 @@ class ManageUser(Frame):
|
||||
|
||||
def _edit_user(self):
|
||||
self.save()
|
||||
raise NextScene("Lookup User")
|
||||
raise NextScene("Edit User")
|
||||
|
||||
def _del_user(self):
|
||||
self.save()
|
||||
raise NextScene("Lookup User")
|
||||
raise NextScene("Delete User")
|
||||
|
||||
def _back(self):
|
||||
self.save()
|
||||
@ -304,58 +311,51 @@ class CreateUserView(Frame):
|
||||
|
||||
class SearchResultsView(Frame):
|
||||
def __init__(self, screen: Screen):
|
||||
super(CreateUserView, self).__init__(
|
||||
super(SearchResultsView, self).__init__(
|
||||
screen,
|
||||
screen.height * 2 // 3,
|
||||
screen.width * 2 // 3,
|
||||
hover_focus=True,
|
||||
can_scroll=False,
|
||||
title="Search Results"
|
||||
title="Search Results",
|
||||
on_load=self._redraw
|
||||
)
|
||||
|
||||
layout2 = Layout([1, 1, 1, 1])
|
||||
self.add_layout(layout2)
|
||||
layout2.add_widget(Button("Select", self._select_current), 2)
|
||||
layout2.add_widget(Button("Cancel", self._cancel), 2)
|
||||
|
||||
def _redraw(self):
|
||||
self._layouts = [self._layouts[0]]
|
||||
layout = Layout([100], fill_frame=True)
|
||||
self.add_layout(layout)
|
||||
layout.add_widget(Text("Username:", "username"))
|
||||
opts = []
|
||||
if state.search_type == "user":
|
||||
layout.add_widget(Label(" ID | Username | Role | Email"))
|
||||
layout.add_widget(Divider())
|
||||
|
||||
for usr in state.search_results:
|
||||
name = str(usr['username'])
|
||||
if len(name) < 8:
|
||||
name = str(usr['username']) + ' ' * (8 - len(name))
|
||||
elif len(name) > 8:
|
||||
name = usr['username'][:5] + "..."
|
||||
|
||||
opts.append((f"{usr['id']:05d} | {name} | {usr['permissions']:08b} | {usr['email']}", state.SelectedUser(usr["id"], str(usr['username']))))
|
||||
|
||||
layout.add_widget(RadioButtons(opts, "", "selopt"))
|
||||
|
||||
self.fix()
|
||||
|
||||
def _ok(self):
|
||||
def _select_current(self):
|
||||
self.save()
|
||||
if not self.data.get("username"):
|
||||
state.set_last_err("Username cannot be blank")
|
||||
self.find_widget('status').value = state.last_err
|
||||
self.screen.reset()
|
||||
return
|
||||
|
||||
state.clear_last_err()
|
||||
self.find_widget('status').value = state.last_err
|
||||
|
||||
if not self.data.get("passwd"):
|
||||
pw = "".join(
|
||||
secrets.choice(string.ascii_letters + string.digits) for i in range(20)
|
||||
)
|
||||
else:
|
||||
pw = self.data.get("passwd")
|
||||
|
||||
hash = bcrypt.hashpw(pw.encode(), bcrypt.gensalt())
|
||||
|
||||
loop.run_until_complete(self._create_user_async(self.data.get("username"), hash.decode(), self.data.get("email"), self.data.get('role')))
|
||||
|
||||
a = self.data.get('selopt')
|
||||
state.set_user(a.id, a.name)
|
||||
raise NextScene("User Management")
|
||||
|
||||
async def _create_user_async(self, username: str, password: str, email: Optional[str], role: str):
|
||||
usr_id = await data.user.create_user(
|
||||
username=username,
|
||||
email=email if email else None,
|
||||
password=password,
|
||||
permission=int(role)
|
||||
)
|
||||
|
||||
state.set_user(usr_id, username)
|
||||
|
||||
def _cancel(self):
|
||||
state.clear_last_err()
|
||||
self.find_widget('status').value = state.last_err
|
||||
raise NextScene("User Management")
|
||||
|
||||
class LookupUserView(Frame):
|
||||
|
Loading…
x
Reference in New Issue
Block a user