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 = ''