80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
from threading import Thread
|
|
|
|
from asciimatics.widgets import Layout, Label
|
|
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):
|
|
super().__init__(
|
|
screen, height, width, model, 'GetPositions',
|
|
escape_on_q=True,
|
|
on_load=self._on_load)
|
|
|
|
cfg = component.getUtility(IConfig)
|
|
avail = cfg.get('positions_available')
|
|
|
|
layout = Layout([100])
|
|
self.add_layout(layout)
|
|
layout.add_widget(Label(''))
|
|
|
|
self._main_layout = Layout([10, 1, 10], fill_frame=True)
|
|
self.add_layout(self._main_layout)
|
|
|
|
self._position_widgets = {}
|
|
for pos in avail:
|
|
self._position_widgets[pos] = self._add_pair(position_names[pos], '')
|
|
|
|
self.add_flash_message_layout()
|
|
self.add_buttons(back_btn=True)
|
|
self.fix()
|
|
|
|
def _add_blank_line(self):
|
|
self._main_layout.add_widget(Label(' ', 0))
|
|
self._main_layout.add_widget(Label(' ', 2))
|
|
|
|
def _add_pair(self, key: str, val: str):
|
|
key_widget = Label(key + ':', align='>')
|
|
value_widget = Label(val, align='<')
|
|
self._main_layout.add_widget(key_widget, 0)
|
|
self._main_layout.add_widget(value_widget, 2)
|
|
return value_widget
|
|
|
|
def _on_load(self):
|
|
def target():
|
|
self.flash_message('Looking up positions...')
|
|
try:
|
|
resp = http_get('/api/positions')
|
|
if not resp.ok:
|
|
return
|
|
positions = resp.json()
|
|
for pos, username in positions.items():
|
|
self._position_widgets[pos].text = username
|
|
finally:
|
|
self.clear_flash_message(force_update=True)
|
|
Thread(target=target).start()
|
|
|
|
def _ceoframe_on_reset(self):
|
|
super()._ceoframe_on_reset()
|
|
# clear the labels
|
|
for widget in self._position_widgets.values():
|
|
widget.text = ''
|