1
0
mirror of synced 2025-02-15 18:02:39 +01:00

tui: add user lookup

This commit is contained in:
Kevin Trocolli 2024-12-19 00:17:00 -05:00
parent 326b5988af
commit e8cd6e9596

102
tui.py
View File

@ -13,7 +13,7 @@ from core.data import Data
from core.config import CoreConfig from core.config import CoreConfig
try: 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.scene import Scene
from asciimatics.screen import Screen from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError, NextScene, StopApplication from asciimatics.exceptions import ResizeScreenError, NextScene, StopApplication
@ -27,10 +27,10 @@ class State:
def __init__(self, id: Optional[int] = None, name: Optional[str] = None): def __init__(self, id: Optional[int] = None, name: Optional[str] = None):
self.id = id self.id = id
self.name = name self.name = name
def __str__(self): def __str__(self):
if self.id is not None: 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" return "None"
def __int__(self): def __int__(self):
@ -171,39 +171,46 @@ class ManageUser(Frame):
screen.width * 2 // 3, screen.width * 2 // 3,
hover_focus=True, hover_focus=True,
can_scroll=False, can_scroll=False,
title="User Management" title="User Management",
on_load=self._redraw
) )
layout = Layout([3]) layout = Layout([3])
self.add_layout(layout) self.add_layout(layout)
layout.add_widget(Button("Create User", self._create_user)) layout.add_widget(Button("Create User", self._create_user))
layout.add_widget(Button("Lookup User", self._lookup)) 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 = [] usr_cards = []
#if state.selected_user.id != 0: #if state.selected_user.id != 0:
#cards = data.card.get_user_cards(state.selected_user.id) #cards = data.card.get_user_cards(state.selected_user.id)
#for card in cards: #for card in cards:
#usr_cards.append(card._asdict()) #usr_cards.append(card._asdict())
layout3 = Layout([100], True)
self.add_layout(layout3)
if len(usr_cards) > 0: if len(usr_cards) > 0:
layout.add_widget(Divider()) layout3 = Layout([100], True)
self.add_layout(layout3)
layout3.add_widget(RadioButtons( layout3.add_widget(RadioButtons(
[(f"{card['id']}\t{card['access_code']}\t{card['status']}", card['id']) for card in usr_cards], [(f"{card['id']}\t{card['access_code']}\t{card['status']}", card['id']) for card in usr_cards],
"Cards:", "Cards:",
"usr_cards" "usr_cards"
)) ))
layout3.add_widget(Divider()) layout3.add_widget(Divider())
layout2 = Layout([1, 1, 1, 1]) layout2 = Layout([1, 1, 1])
self.add_layout(layout2) self.add_layout(layout2)
a = Text("", f"status", readonly=True, disabled=True) a = Text("", f"status", readonly=True, disabled=True)
a.value = f"Selected User: {state.selected_user}" a.value = f"Selected User: {state.selected_user}"
layout2.add_widget(a) layout2.add_widget(a)
layout2.add_widget(Button("Back", self._back), 3) layout2.add_widget(Button("Back", self._back), 2)
self.fix() self.fix()
@ -217,11 +224,11 @@ class ManageUser(Frame):
def _edit_user(self): def _edit_user(self):
self.save() self.save()
raise NextScene("Lookup User") raise NextScene("Edit User")
def _del_user(self): def _del_user(self):
self.save() self.save()
raise NextScene("Lookup User") raise NextScene("Delete User")
def _back(self): def _back(self):
self.save() self.save()
@ -304,58 +311,51 @@ class CreateUserView(Frame):
class SearchResultsView(Frame): class SearchResultsView(Frame):
def __init__(self, screen: Screen): def __init__(self, screen: Screen):
super(CreateUserView, self).__init__( super(SearchResultsView, self).__init__(
screen, screen,
screen.height * 2 // 3, screen.height * 2 // 3,
screen.width * 2 // 3, screen.width * 2 // 3,
hover_focus=True, hover_focus=True,
can_scroll=False, 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) layout = Layout([100], fill_frame=True)
self.add_layout(layout) 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() self.fix()
def _ok(self): def _select_current(self):
self.save() self.save()
if not self.data.get("username"): a = self.data.get('selopt')
state.set_last_err("Username cannot be blank") state.set_user(a.id, a.name)
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')))
raise NextScene("User Management") 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): def _cancel(self):
state.clear_last_err() state.clear_last_err()
self.find_widget('status').value = state.last_err
raise NextScene("User Management") raise NextScene("User Management")
class LookupUserView(Frame): class LookupUserView(Frame):