add flash_message

This commit is contained in:
Max Erenberg 2021-09-06 20:16:45 +00:00
parent 39158676ae
commit af73dd713d
7 changed files with 79 additions and 81 deletions

View File

@ -1,5 +1,5 @@
from asciimatics.exceptions import NextScene from asciimatics.exceptions import NextScene
from asciimatics.widgets import Frame, Layout, Divider, Button from asciimatics.widgets import Frame, Layout, Divider, Button, Label
class CeoFrame(Frame): class CeoFrame(Frame):
@ -54,7 +54,7 @@ class CeoFrame(Frame):
def add_buttons( def add_buttons(
self, back_btn=False, back_btn_text='Back', self, back_btn=False, back_btn_text='Back',
next_scene=None, next_scene_text='Next', on_next=None, next_scene=None, next_btn_text='Next', on_next=None,
on_next_excl=None, on_next_excl=None,
): ):
""" """
@ -81,12 +81,30 @@ class CeoFrame(Frame):
return return
if on_next is not None: if on_next is not None:
on_next() on_next()
self._model.scene_stack.append(self._name) self.go_to_next_scene(next_scene)
raise NextScene(next_scene)
layout = Layout([1, 1]) layout = Layout([1, 1])
self.add_layout(layout) self.add_layout(layout)
if back_btn: if back_btn:
layout.add_widget(Button(back_btn_text, _back), 0) layout.add_widget(Button(back_btn_text, _back), 0)
if next_scene is not None or on_next_excl is not None: if next_scene is not None or on_next_excl is not None:
layout.add_widget(Button(next_scene_text, _next), 1) layout.add_widget(Button(next_btn_text, _next), 1)
def go_to_next_scene(self, next_scene: str):
self._model.scene_stack.append(self._name)
raise NextScene(next_scene)
def add_flash_message_layout(self):
layout = Layout([100])
self.add_layout(layout)
self._status_label = Label('')
layout.add_widget(self._status_label)
def flash_message(self, msg: str, force_update: bool = False):
self._status_label.text = msg
if force_update:
self._model.screen.force_update()
self._model.screen.draw_next_frame()
def clear_flash_message(self):
self.flash_message('')

View File

@ -34,11 +34,21 @@ class ConfirmView(CeoFrame):
# fill the rest of the space # fill the rest of the space
self.add_layout(Layout([100], fill_frame=True)) self.add_layout(Layout([100], fill_frame=True))
kwargs = {
'back_btn': True, 'back_btn_text': 'No', 'next_btn_text': 'Yes',
}
if self._model.operations is not None: if self._model.operations is not None:
next_scene = 'Transaction' kwargs['next_scene'] = 'Transaction'
else: else:
next_scene = 'Result' self.add_flash_message_layout()
self.add_buttons( kwargs['on_next_excl'] = self._next
back_btn=True, back_btn_text='No', self.add_buttons(**kwargs)
next_scene=next_scene, next_scene_text='Yes')
self.fix() self.fix()
def _next(self):
self.flash_message('Sending request...', force_update=True)
try:
self._model.deferred_req_resp = self._model.deferred_req()
finally:
self.clear_flash_message()
self.go_to_next_scene('Result')

View File

@ -36,6 +36,7 @@ class Model:
self.confirm_lines = None self.confirm_lines = None
self.operations = None self.operations = None
self.deferred_req = None self.deferred_req = None
self.deferred_req_resp = None
def reset(self): def reset(self):
self.viewdata = deepcopy(self._initial_viewdata) self.viewdata = deepcopy(self._initial_viewdata)
@ -43,6 +44,7 @@ class Model:
self.confirm_lines = None self.confirm_lines = None
self.operations = None self.operations = None
self.deferred_req = None self.deferred_req = None
self.deferred_req_resp = None
self.title = None self.title = None
self.error_message = None self.error_message = None
self.scene_stack.clear() self.scene_stack.clear()

View File

@ -1,7 +1,5 @@
from threading import Thread
from asciimatics.exceptions import NextScene from asciimatics.exceptions import NextScene
from asciimatics.widgets import Layout, Label, Button, Divider from asciimatics.widgets import Layout, Label
import requests import requests
from .CeoFrame import CeoFrame from .CeoFrame import CeoFrame
@ -13,43 +11,28 @@ class ResultView(CeoFrame):
screen, height, width, model, 'Result', screen, height, width, model, 'Result',
on_load=self._resultview_on_load, title='Result', on_load=self._resultview_on_load, title='Result',
) )
layout = Layout([1, 10])
self.add_layout(layout)
layout.add_widget(Label(''), 1)
self._status_label = Label('Sending request... ')
layout.add_widget(self._status_label, 1)
layout.add_widget(Label(''), 1)
self._summary_layout = Layout([1, 10], fill_frame=True) self._summary_layout = Layout([1, 10], fill_frame=True)
self.add_layout(self._summary_layout) self.add_layout(self._summary_layout)
self._show_msg()
self._add_buttons() self.add_buttons(on_next_excl=self._next)
self.fix()
def _add_buttons(self): def _next(self):
layout = Layout([100]) self._model.reset()
self.add_layout(layout) raise NextScene('Welcome')
layout.add_widget(Divider())
layout = Layout([1, 1]) def _show_msg(self, text: str = '\n', center=False):
self.add_layout(layout)
self._next_btn = Button('Next', self._next)
self._next_btn.disabled = True
layout.add_widget(self._next_btn, 1)
def _show_msg(self, text: str = ''):
for line in text.splitlines(): for line in text.splitlines():
self._summary_layout.add_widget(Label(line), 1) align = '^' if center else '<'
self._summary_layout.add_widget(Label(line, align=align), 1)
# override this method in child classes if desired # override this method in child classes if desired
def show_result(self, resp: requests.Response): def show_result(self, resp: requests.Response):
self._show_msg('The operation was successfully performed.') self._show_msg('The operation was successfully performed.', center=True)
def _resultview_on_load(self): def _resultview_on_load(self):
def target(): resp = self._model.deferred_req_resp
try: try:
resp = self._model.deferred_req()
self._status_label.text += 'Done.'
self._next_btn.disabled = False
if resp.status_code != 200: if resp.status_code != 200:
self._show_msg('An error occurred:') self._show_msg('An error occurred:')
self._show_msg(resp.text.rstrip()) self._show_msg(resp.text.rstrip())
@ -57,10 +40,3 @@ class ResultView(CeoFrame):
self.show_result(resp) self.show_result(resp)
finally: finally:
self.fix() self.fix()
self.reset()
self._model.screen.force_update()
Thread(target=target).start()
def _next(self):
self._model.reset()
raise NextScene('Welcome')

View File

@ -18,7 +18,7 @@ class WelcomeView(Frame):
('Add club rep', 'AddUser'), ('Add club rep', 'AddUser'),
('Renew member', 'RenewUser'), ('Renew member', 'RenewUser'),
('Renew club rep', 'RenewUser'), ('Renew club rep', 'RenewUser'),
('Get user info', 'GetUserInfo'), ('Get user info', 'GetUser'),
('Reset password', 'ResetPassword'), ('Reset password', 'ResetPassword'),
('Modify user', 'ModifyUser'), ('Modify user', 'ModifyUser'),
] ]

View File

@ -1,6 +1,6 @@
from threading import Thread from threading import Thread
from asciimatics.widgets import Layout, Text, Label from asciimatics.widgets import Layout, Text
from ...term_utils import get_terms_for_new_user from ...term_utils import get_terms_for_new_user
from ...utils import http_get, http_post, defer, user_dict_kv, \ from ...utils import http_get, http_post, defer, user_dict_kv, \
@ -35,11 +35,7 @@ class AddUserView(CeoFrame):
validator=lambda s: s.isdigit() and s[0] != '0') validator=lambda s: s.isdigit() and s[0] != '0')
layout.add_widget(self._num_terms) layout.add_widget(self._num_terms)
layout = Layout([100]) self.add_flash_message_layout()
self.add_layout(layout)
self._status_label = Label('')
layout.add_widget(self._status_label)
self.add_buttons( self.add_buttons(
back_btn=True, back_btn=True,
next_scene='Confirm', on_next=self._next) next_scene='Confirm', on_next=self._next)
@ -58,7 +54,7 @@ class AddUserView(CeoFrame):
Thread(target=self._get_uwldap_info, args=[username]).start() Thread(target=self._get_uwldap_info, args=[username]).start()
def _get_uwldap_info(self, username): def _get_uwldap_info(self, username):
self._status_label.text = 'Looking up user...' self.flash_message('Looking up user...')
try: try:
resp = http_get('/api/uwldap/' + username) resp = http_get('/api/uwldap/' + username)
if resp.status_code != 200: if resp.status_code != 200:
@ -70,7 +66,7 @@ class AddUserView(CeoFrame):
if data.get('mail_local_addresses'): if data.get('mail_local_addresses'):
self._forwarding_address.value = data['mail_local_addresses'][0] self._forwarding_address.value = data['mail_local_addresses'][0]
finally: finally:
self._status_label.text = '' self.clear_flash_message()
def _next(self): def _next(self):
body = { body = {

View File

@ -22,11 +22,7 @@ class RenewUserView(CeoFrame):
validator=lambda s: s.isdigit() and s[0] != '0') validator=lambda s: s.isdigit() and s[0] != '0')
layout.add_widget(self._num_terms) layout.add_widget(self._num_terms)
layout = Layout([100]) self.add_flash_message_layout()
self.add_layout(layout)
self._status_label = Label('')
layout.add_widget(self._status_label)
self.add_buttons( self.add_buttons(
back_btn=True, back_btn=True,
next_scene='Confirm', on_next=self._next) next_scene='Confirm', on_next=self._next)
@ -34,16 +30,16 @@ class RenewUserView(CeoFrame):
def _next(self): def _next(self):
uid = self._username.value uid = self._username.value
self._status_label.text = 'Looking up user...' self.flash_message('Looking up user...', force_update=True)
self._model.screen.force_update() try:
self._model.screen.draw_next_frame()
new_terms = get_terms_for_renewal( new_terms = get_terms_for_renewal(
uid, uid,
int(self._num_terms.value), int(self._num_terms.value),
self._model.is_club_rep, self._model.is_club_rep,
self._model, self._model,
) )
self._status_label.text = '' finally:
self.clear_flash_message()
body = {'uid': uid} body = {'uid': uid}
if self._model.is_club_rep: if self._model.is_club_rep: