Positions TUI #20
|
@ -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)
|
|
@ -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?',
|
||||
]
|
|
@ -0,0 +1,2 @@
|
|||
from .GetPositionsView import GetPositionsView
|
||||
from .SetPositionsView import SetPositionsView
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue