from asciimatics.exceptions import NextScene from asciimatics.widgets import Frame, Layout, Text, Button, Divider from ...utils import http_get, http_post, defer, user_dict_kv, \ get_terms_for_new_user, get_adduser_operations class AddUserView(Frame): def __init__(self, screen, width, height, model): super().__init__( screen, height, width, can_scroll=False, on_load=self._on_load, ) self._model = model 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') self._num_terms.value = '1' layout.add_widget(self._num_terms) layout = Layout([100]) self.add_layout(layout) layout.add_widget(Divider()) layout = Layout([1, 1]) self.add_layout(layout) layout.add_widget(Button('Back', self._back), 0) layout.add_widget(Button("Next", self._next), 1) self.fix() def _on_load(self): self.title = self._model.title 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 self._get_uwldap_info(username) def _get_uwldap_info(self, username): resp = http_get('/api/uwldap/' + username) if resp.status_code != 200: return data = resp.json() 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] def _back(self): raise NextScene(self._model.scene_stack.pop()) def _next(self): self._model.prev_scene = 'AddUser' 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.for_member: body['terms'] = new_terms else: body['non_member_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.scene_stack.append('AddUser') raise NextScene('Confirm')