from threading import Thread from asciimatics.widgets import Layout, Text from ...term_utils import get_terms_for_new_user from ...utils import http_get, http_post, defer, user_dict_kv, \ get_adduser_operations from ..CeoFrame import CeoFrame class AddUserView(CeoFrame): def __init__(self, screen, width, height, model): super().__init__( screen, height, width, model, 'AddUser', save_data=True, ) self._username_changed = False layout = Layout([100], fill_frame=True) self.add_layout(layout) self._username = Text( "Username:", "uid", on_change=self._on_username_change, on_blur=self._on_username_blur, ) layout.add_widget(self._username) self._full_name = Text("Full name:", "cn") layout.add_widget(self._full_name) self._program = Text("Program:", "program") layout.add_widget(self._program) self._forwarding_address = Text("Forwarding address:", "forwarding_address") layout.add_widget(self._forwarding_address) 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 _on_username_change(self): self._username_changed = True def _on_username_blur(self): if not self._username_changed: return self._username_changed = False username = self._username.value if username == '': return Thread(target=self._get_uwldap_info, args=[username]).start() def _get_uwldap_info(self, username): self.flash_message('Looking up user...') try: resp = http_get('/api/uwldap/' + username) if resp.status_code != 200: return data = resp.json() self._status_label.text = '' self._full_name.value = data['cn'] self._program.value = data.get('program', '') if data.get('mail_local_addresses'): self._forwarding_address.value = data['mail_local_addresses'][0] finally: self.clear_flash_message() def _next(self): body = { 'uid': self._username.value, 'cn': self._full_name.value, } if self._program.value: body['program'] = self._program.value if self._forwarding_address.value: body['forwarding_addresses'] = [self._forwarding_address.value] new_terms = get_terms_for_new_user(int(self._num_terms.value)) if self._model.is_club_rep: body['non_member_terms'] = new_terms else: body['terms'] = new_terms pairs = user_dict_kv(body) self._model.confirm_lines = [ 'The following user will be created:', '', ] + pairs + [ '', 'Are you sure you want to continue?', ] self._model.deferred_req = defer(http_post, '/api/members', json=body) self._model.operations = get_adduser_operations(body) self._model.txn_view_name = 'AddUserTransaction'