from asciimatics.exceptions import NextScene from asciimatics.widgets import Layout, Label import requests from .CeoFrame import CeoFrame class ResultView(CeoFrame): def __init__(self, screen, width, height, model): super().__init__( screen, height, width, model, 'Result', on_load=self._resultview_on_load, title='Result', has_dynamic_layouts=True, escape_on_q=True, ) # TODO: deduplicate this from ConfirmView def _add_text(self, text: str = '\n', center: bool = False): if center: layout = Layout([100]) align = '^' col = 0 else: layout = Layout([1, 10]) align = '<' col = 1 self.add_layout(layout) for line in text.splitlines(): layout.add_widget(Label(line, align=align), col) def _add_pair(self, key: str, val: str): layout = Layout([10, 1, 10]) self.add_layout(layout) if key: layout.add_widget(Label(key + ':', align='>'), 0) else: layout.add_widget(Label(''), 0) layout.add_widget(Label(val, align='<'), 2) # override this method in child classes if desired def show_result(self, resp: requests.Response): self._add_text('The operation was successfully performed.', center=True) def _resultview_on_load(self): self._add_text() resp = self._model.resp if not resp.ok: self._add_text('An error occurred:') if resp.headers.get('content-type') == 'application/json': err_msg = resp.json()['error'] else: err_msg = resp.text.rstrip() self._add_text(err_msg) else: self.show_result(resp) # fill the rest of the space self.add_layout(Layout([100], fill_frame=True)) self.add_buttons(on_next_excl=self._next) self.fix() def _next(self): self._model.reset() raise NextScene('Welcome')