From 67aa4d005631c555a46e42d9f1bc8bcdd2646577 Mon Sep 17 00:00:00 2001 From: Rio Liu Date: Sat, 25 Sep 2021 14:27:06 -0400 Subject: [PATCH] positions tui --- ceo/tui/positions/GetPositionsView.py | 65 +++++++++++++++++++++++++++ ceo/tui/positions/SetPositionsView.py | 29 ++++++++++++ ceo/tui/positions/__init__.py | 2 + ceo/tui/start.py | 3 ++ 4 files changed, 99 insertions(+) create mode 100644 ceo/tui/positions/GetPositionsView.py create mode 100644 ceo/tui/positions/SetPositionsView.py create mode 100644 ceo/tui/positions/__init__.py diff --git a/ceo/tui/positions/GetPositionsView.py b/ceo/tui/positions/GetPositionsView.py new file mode 100644 index 0000000..7d15e68 --- /dev/null +++ b/ceo/tui/positions/GetPositionsView.py @@ -0,0 +1,65 @@ +from asciimatics.widgets import Layout, Text, Button +from zope import component + +from ...utils import http_get +from ..CeoFrame import CeoFrame +from ceo_common.interfaces import IConfig + + +position_names = { + 'president': "President", + 'vice-president': "Vice President", + 'treasurer': "Treasurer", + 'secretary': "Secretary", + 'sysadmin': "Sysadmin", + 'cro': "Chief Returning Officer", + 'librarian': "Librarian", + 'imapd': "IMAPd", + 'webmaster': "Web Master", + 'offsck': "Office Manager", +} + + +class GetPositionsView(CeoFrame): + def __init__(self, screen, width, height, model, readonly=True): + super().__init__( + screen, height, width, model, + 'GetPositions', + on_load = self._on_load) + + cfg = component.getUtility(IConfig) + + layout = Layout([100], fill_frame=True) + self.add_layout(layout) + + self._positions = [] + for pos in cfg.get('positions_available'): + widget = Text( + f"{position_names.get(pos, pos)}:", + pos, + readonly=readonly, + ) + self._positions.append(widget) + layout.add_widget(widget) + + self.add_flash_message_layout() + self._add_buttons() + self.fix() + + + def _add_buttons(self): + self.add_buttons( + next_btn_text="Change", + next_scene='SetPositions', + back_btn=True, + ) + + + def _on_load(self): + res = http_get('/api/positions') + if res.status_code != 200: + return + + positions = res.json() + for pos in self._positions: + pos.value = positions.get(pos.name) diff --git a/ceo/tui/positions/SetPositionsView.py b/ceo/tui/positions/SetPositionsView.py new file mode 100644 index 0000000..497edba --- /dev/null +++ b/ceo/tui/positions/SetPositionsView.py @@ -0,0 +1,29 @@ +from ...utils import defer, http_post +from . import GetPositionsView +class SetPositionsView(GetPositionsView): + def __init__(self, screen, widgets, height, model): + super().__init__(screen, widgets, height, model, False) + + + def _add_buttons(self): + self.add_buttons( + next_btn_text="Update", + next_scene='Confirm', + on_next=self._next, + back_btn=True, + ) + + + def _next(self): + positions = {} + for pos in self._positions: + positions[pos.name] = pos.value + + self._model.deferred_req = defer(http_post, f'/api/positions', json=positions) + self._model.confirm_lines = [ + "The positions will be updated as follows", + '', + *positions.items(), + '', + 'Are you sure you want to continue?', + ] diff --git a/ceo/tui/positions/__init__.py b/ceo/tui/positions/__init__.py new file mode 100644 index 0000000..55fa7d1 --- /dev/null +++ b/ceo/tui/positions/__init__.py @@ -0,0 +1,2 @@ +from .GetPositionsView import GetPositionsView +from .SetPositionsView import SetPositionsView diff --git a/ceo/tui/start.py b/ceo/tui/start.py index a7bf5a4..204f0d5 100644 --- a/ceo/tui/start.py +++ b/ceo/tui/start.py @@ -28,6 +28,7 @@ from .members.RenewUserView import RenewUserView from .members.ResetPasswordView import ResetPasswordView from .members.ResetPasswordResultView import ResetPasswordResultView from .members.SetForwardingAddressesView import SetForwardingAddressesView +from .positions import GetPositionsView, SetPositionsView # tuples of (name, view) @@ -66,6 +67,8 @@ def screen_wrapper(screen, last_scene, model): ('CreateDatabaseResult', CreateDatabaseResultView(screen, width, height, model)), ('ResetDatabasePassword', ResetDatabasePasswordView(screen, width, height, model)), ('ResetDatabasePasswordResult', ResetDatabasePasswordResultView(screen, width, height, model)), + ('GetPositions', GetPositionsView(screen, width, height, model)), + ('SetPositions', SetPositionsView(screen, width, height, model)), ] scenes = [ Scene([view], -1, name=name) for name, view in views