diff --git a/tui.py b/tui.py index 06c51e9..9705c97 100644 --- a/tui.py +++ b/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 @@ -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):