106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
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')
|