96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
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)
|