tui: add user lookup
This commit is contained in:
parent
326b5988af
commit
e8cd6e9596
102
tui.py
102
tui.py
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user