diff --git a/ceo/tui/Model.py b/ceo/tui/Model.py index ee8d5cc..e662273 100644 --- a/ceo/tui/Model.py +++ b/ceo/tui/Model.py @@ -54,6 +54,12 @@ class Model: 'AddMemberToGroup': { 'cn': '', 'uid': '', + 'subscribe': True, + }, + 'RemoveMemberFromGroup': { + 'cn': '', + 'uid': '', + 'unsubscribe': True, }, } self.viewdata = deepcopy(self._initial_viewdata) diff --git a/ceo/tui/groups/AddMemberToGroupView.py b/ceo/tui/groups/AddMemberToGroupView.py index 9d1c404..2a0ba0f 100644 --- a/ceo/tui/groups/AddMemberToGroupView.py +++ b/ceo/tui/groups/AddMemberToGroupView.py @@ -18,7 +18,8 @@ class AddMemberToGroupView(CeoFrame): self._username = Text('Username:', 'uid') layout.add_widget(self._username) layout.add_widget(Label('')) - self._checkbox = CheckBox('subscribe to auxiliary mailing lists') + self._checkbox = CheckBox( + 'subscribe to auxiliary mailing lists', name='subscribe') self._checkbox.value = True layout.add_widget(self._checkbox) diff --git a/ceo/tui/groups/RemoveMemberFromGroupView.py b/ceo/tui/groups/RemoveMemberFromGroupView.py new file mode 100644 index 0000000..3704948 --- /dev/null +++ b/ceo/tui/groups/RemoveMemberFromGroupView.py @@ -0,0 +1,44 @@ +from asciimatics.widgets import Layout, Text, CheckBox, Label + +from ...utils import defer, http_delete +from ..CeoFrame import CeoFrame +from ceod.transactions.groups import RemoveMemberFromGroupTransaction + + +class RemoveMemberFromGroupView(CeoFrame): + def __init__(self, screen, width, height, model): + super().__init__( + screen, height, width, model, 'RemoveMemberFromGroup', + save_data=True, + ) + layout = Layout([100], fill_frame=True) + self.add_layout(layout) + self._cn = Text('Group name:', 'cn') + layout.add_widget(self._cn) + self._username = Text('Username:', 'uid') + layout.add_widget(self._username) + layout.add_widget(Label('')) + self._checkbox = CheckBox( + 'unsubscribe from auxiliary mailing lists', name='unsubscribe') + self._checkbox.value = True + layout.add_widget(self._checkbox) + + self.add_buttons( + back_btn=True, + next_scene='Confirm', on_next=self._next) + self.fix() + + def _next(self): + cn = self._cn.value + uid = self._username.value + self._model.confirm_lines = [ + f'Are you sure you want to remove {uid} from {cn}?', + ] + operations = RemoveMemberFromGroupTransaction.operations + url = f'/api/groups/{cn}/members/{uid}' + # TODO: deduplicate this logic from the CLI + if not self._checkbox.value: + url += '?unsubscribe_from_lists=false' + operations.remove('unsubscribe_user_from_auxiliary_mailing_lists') + self._model.deferred_req = defer(http_delete, url) + self._model.operations = operations diff --git a/ceo/tui/start.py b/ceo/tui/start.py index a3e6820..1183087 100644 --- a/ceo/tui/start.py +++ b/ceo/tui/start.py @@ -15,6 +15,7 @@ from .groups.AddGroupView import AddGroupView from .groups.AddMemberToGroupView import AddMemberToGroupView from .groups.GetGroupView import GetGroupView from .groups.GetGroupResultView import GetGroupResultView +from .groups.RemoveMemberFromGroupView import RemoveMemberFromGroupView from .members.AddUserView import AddUserView from .members.ChangeLoginShellView import ChangeLoginShellView from .members.GetUserView import GetUserView @@ -63,6 +64,7 @@ def screen_wrapper(screen, last_scene, model): ('GetGroup', GetGroupView(screen, width, height, model)), ('GetGroupResult', GetGroupResultView(screen, width, height, model)), ('AddMemberToGroup', AddMemberToGroupView(screen, width, height, model)), + ('RemoveMemberFromGroup', RemoveMemberFromGroupView(screen, width, height, model)), ] scenes = [ Scene([view], -1, name=name) for name, view in views diff --git a/ceod/transactions/groups/RemoveMemberFromGroupTransaction.py b/ceod/transactions/groups/RemoveMemberFromGroupTransaction.py index d5e2a77..c1ef0b6 100644 --- a/ceod/transactions/groups/RemoveMemberFromGroupTransaction.py +++ b/ceod/transactions/groups/RemoveMemberFromGroupTransaction.py @@ -69,9 +69,9 @@ class RemoveMemberFromGroupTransaction(AbstractTransaction): yield 'unsubscribe_user_from_auxiliary_mailing_lists' except KeyError: pass - except Exception: + except Exception as err: logger.error(traceback.format_exc()) - yield 'failed_to_unsubscribe_user_from_auxiliary_mailing_lists' + yield 'failed_to_unsubscribe_user_from_auxiliary_mailing_lists: ' + str(err) result = { 'removed_from_groups': [self.group_name] + [