positions tui

This commit is contained in:
Rio Liu 2021-09-25 14:27:06 -04:00
parent 749ca41080
commit 8cdb62aba0
5 changed files with 103 additions and 5 deletions

View File

@ -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)

View File

@ -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?',
]

View File

@ -0,0 +1,2 @@
from .GetPositionsView import GetPositionsView
from .SetPositionsView import SetPositionsView

View File

@ -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

View File

@ -1,16 +1,15 @@
#!/bin/sh -e
if ! [ -d venv ]; then
echo "You need to create the virtualenv first!" >&2
exit 1
host="$1"
if [ "$host" != auth1 ]; then
python -m pip install -r requirements.txt -r dev-requirements.txt
fi
host="$1"
[ -x ".drone/$host-setup.sh" ] && ".drone/$host-setup.sh"
if [ "$host" = auth1 ]; then
exec sleep infinity
else
. venv/bin/activate
exec .drone/supervise.sh flask run -h 0.0.0.0 -p 9987
fi