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
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
@ -27,10 +27,10 @@ class State:
def __init__(self, id: Optional[int] = None, name: Optional[str] = None):
self.id = id
self.name = name
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,39 +171,46 @@ 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:
#cards = data.card.get_user_cards(state.selected_user.id)
#for card in cards:
#usr_cards.append(card._asdict())
layout3 = Layout([100], True)
self.add_layout(layout3)
if len(usr_cards) > 0:
layout.add_widget(Divider())
layout3 = Layout([100], True)
self.add_layout(layout3)
layout3.add_widget(RadioButtons(
[(f"{card['id']}\t{card['access_code']}\t{card['status']}", card['id']) for card in usr_cards],
"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)
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):