61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
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)
|