from asciimatics.widgets import Layout, Text from ...term_utils import get_terms_for_renewal from ...utils import http_post, defer from ..CeoFrame import CeoFrame class RenewUserView(CeoFrame): def __init__(self, screen, width, height, model): super().__init__( screen, height, width, model, 'RenewUser', save_data=True, ) self._model = model layout = Layout([100], fill_frame=True) self.add_layout(layout) self._username = Text("Username:", "uid") layout.add_widget(self._username) self._num_terms = Text( "Number of terms:", "num_terms", validator=lambda s: s.isdigit() and s[0] != '0') layout.add_widget(self._num_terms) self.add_flash_message_layout() self.add_buttons( back_btn=True, next_scene='Confirm', on_next=self._next) self.fix() def _next(self): uid = self._username.value self.flash_message('Looking up user...', force_update=True) try: new_terms = get_terms_for_renewal( uid, int(self._num_terms.value), self._model.is_club_rep, self._model, ) finally: self.clear_flash_message() body = {'uid': uid} if self._model.is_club_rep: body['non_member_terms'] = new_terms terms_str = 'non-member terms' else: body['terms'] = new_terms terms_str = 'member terms' self._model.confirm_lines = [ 'The following ' + terms_str + ' will be added:', '', ','.join(new_terms), '', 'Are you sure you want to continue?', ] self._model.deferred_req = defer( http_post, f'/api/members/{uid}/renew', json=body)