Positions TUI (#20)
Closes #17 Co-authored-by: Rio Liu <rio.liu@r26.me> Co-authored-by: Max Erenberg <> Reviewed-on: #20 Co-authored-by: Rio <r345liu@localhost> Co-committed-by: Rio <r345liu@localhost>pull/22/head
parent
2a5d903eba
commit
7edc01e42b
@ -0,0 +1,79 @@ |
||||
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 = '' |
@ -0,0 +1,49 @@ |
||||
from asciimatics.widgets import Layout, Label, Text |
||||
from zope import component |
||||
|
||||
from ...utils import defer, http_post |
||||
from ..CeoFrame import CeoFrame |
||||
from .GetPositionsView import position_names |
||||
from ceo_common.interfaces import IConfig |
||||
from ceod.transactions.members.UpdateMemberPositionsTransaction import UpdateMemberPositionsTransaction |
||||
|
||||
|
||||
class SetPositionsView(CeoFrame): |
||||
def __init__(self, screen, width, height, model): |
||||
super().__init__( |
||||
screen, height, width, model, 'SetPositions', |
||||
save_data=True) |
||||
cfg = component.getUtility(IConfig) |
||||
avail = cfg.get('positions_available') |
||||
required = cfg.get('positions_required') |
||||
|
||||
layout = Layout([100], fill_frame=True) |
||||
self.add_layout(layout) |
||||
for pos in avail: |
||||
suffix = ' (*)' if pos in required else '' |
||||
widget = Text(position_names[pos] + suffix, pos) |
||||
layout.add_widget(widget) |
||||
|
||||
layout = Layout([100]) |
||||
self.add_layout(layout) |
||||
layout.add_widget(Label('(*) Required')) |
||||
|
||||
self.add_flash_message_layout() |
||||
self.add_buttons( |
||||
back_btn=True, |
||||
next_scene='Confirm', on_next=self._next) |
||||
self.fix() |
||||
|
||||
def _next(self): |
||||
self.save() |
||||
body = {pos: username for pos, username in self.data.items() if username} |
||||
|
||||
self._model.deferred_req = defer(http_post, '/api/positions', json=body) |
||||
self._model.operations = UpdateMemberPositionsTransaction.operations |
||||
self._model.confirm_lines = [ |
||||
"The positions will be updated as follows:", |
||||
'', |
||||
*self.data.items(), |
||||
'', |
||||
'Are you sure you want to continue?', |
||||
] |
@ -0,0 +1,2 @@ |
||||
from .GetPositionsView import GetPositionsView |
||||
from .SetPositionsView import SetPositionsView |
Loading…
Reference in new issue