111 lines
4.2 KiB
Python
111 lines
4.2 KiB
Python
from threading import Thread
|
|
|
|
from ...utils import http_get
|
|
from .Controller import Controller
|
|
from .AddUserTransactionController import AddUserTransactionController
|
|
import ceo.term_utils as term_utils
|
|
from ceo.tui.models import TransactionModel
|
|
from ceo.tui.views import AddUserConfirmationView, TransactionView
|
|
from ceod.transactions.members import AddMemberTransaction
|
|
|
|
|
|
class AddUserController(Controller):
|
|
def __init__(self, model, app):
|
|
super().__init__(model, app)
|
|
self.right_col_idx = 0
|
|
self.prev_searched_username = None
|
|
|
|
def on_confirmation_button_pressed(self, button):
|
|
body = {
|
|
'uid': self.model.username,
|
|
'cn': self.model.full_name,
|
|
'given_name': self.model.first_name,
|
|
'sn': self.model.last_name,
|
|
}
|
|
if self.model.program:
|
|
body['program'] = self.model.program
|
|
if self.model.forwarding_address:
|
|
body['forwarding_addresses'] = [self.model.forwarding_address]
|
|
new_terms = term_utils.get_terms_for_new_user(self.model.num_terms)
|
|
if self.model.membership_type == 'club_rep':
|
|
body['non_member_terms'] = new_terms
|
|
else:
|
|
body['terms'] = new_terms
|
|
|
|
model = TransactionModel(
|
|
AddMemberTransaction.operations,
|
|
'POST', '/api/members',
|
|
json=body
|
|
)
|
|
controller = AddUserTransactionController(model, self.app)
|
|
view = TransactionView(model, controller, self.app)
|
|
controller.view = view
|
|
self.switch_to_view(view)
|
|
|
|
def on_next_button_pressed(self, button):
|
|
try:
|
|
username = self.get_username_from_view()
|
|
num_terms = self.get_num_terms_from_view()
|
|
except Controller.InvalidInput:
|
|
return
|
|
full_name = self.view.full_name_edit.edit_text
|
|
# TODO: share validation logic between CLI and TUI
|
|
if not full_name:
|
|
self.view.popup('Full name must not be empty')
|
|
return
|
|
self.model.username = username
|
|
self.model.full_name = full_name
|
|
self.model.first_name = self.view.first_name_edit.edit_text
|
|
self.model.last_name = self.view.last_name_edit.edit_text
|
|
self.model.program = self.view.program_edit.edit_text
|
|
self.model.forwarding_address = self.view.forwarding_address_edit.edit_text
|
|
self.model.num_terms = num_terms
|
|
view = AddUserConfirmationView(self.model, self, self.app)
|
|
self.switch_to_view(view)
|
|
|
|
def on_membership_type_changed(self, radio_button, new_state, selected_type):
|
|
if new_state:
|
|
self.model.membership_type = selected_type
|
|
|
|
def on_row_focus_changed(self):
|
|
_, idx = self.view.listwalker.get_focus()
|
|
old_idx = self.right_col_idx
|
|
self.right_col_idx = idx
|
|
# The username field is the third row, so when
|
|
# idx changes from 2 to 3, this means the user
|
|
# moved from the username field to the next field
|
|
if old_idx == 2 and idx == 3:
|
|
Thread(
|
|
target=self._lookup_user,
|
|
args=(self.view.username_edit.edit_text,)
|
|
).start()
|
|
|
|
def _set_flash_text(self, *args):
|
|
self.view.flash_text.set_text('Looking up user...')
|
|
|
|
def _clear_flash_text(self):
|
|
self.view.flash_text.set_text('')
|
|
|
|
def _on_lookup_user_success(self):
|
|
self._clear_flash_text()
|
|
self.view.update_fields()
|
|
|
|
def _lookup_user(self, username):
|
|
if not username:
|
|
return
|
|
if username == self.prev_searched_username:
|
|
return
|
|
self.prev_searched_username = username
|
|
self.app.run_in_main_loop(self._set_flash_text)
|
|
resp = http_get('/api/uwldap/' + username)
|
|
if not resp.ok:
|
|
self.app.run_in_main_loop(self._clear_flash_text)
|
|
return
|
|
data = resp.json()
|
|
self.model.full_name = data.get('cn', '')
|
|
self.model.first_name = data.get('given_name', '')
|
|
self.model.last_name = data.get('sn')
|
|
self.model.program = data.get('program', '')
|
|
self.model.forwarding_address = data.get('mail_local_addresses', [''])[0]
|
|
self.app.run_in_main_loop(self._on_lookup_user_success)
|