implement AddGroupView
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Max Erenberg 2021-09-07 05:02:34 +00:00
parent ebaeeaaf13
commit 6b3ad28e89
7 changed files with 100 additions and 15 deletions

View File

@ -41,8 +41,12 @@ class Model:
'login_shell': '', 'login_shell': '',
}, },
'SetForwardingAddresses': { 'SetForwardingAddresses': {
'uid': '', 'uid': '',
'forwarding_addresses': [''], 'forwarding_addresses': [''],
},
'AddGroup': {
'cn': '',
'description': '',
}, },
} }
self.viewdata = deepcopy(self._initial_viewdata) self.viewdata = deepcopy(self._initial_viewdata)

View File

@ -1,5 +1,6 @@
from asciimatics.widgets import Frame, ListBox, Layout, Divider, \ import functools
Button, Widget
from asciimatics.widgets import Frame, ListBox, Layout, Divider, Button
from asciimatics.exceptions import NextScene, StopApplication from asciimatics.exceptions import NextScene, StopApplication
@ -9,11 +10,10 @@ class WelcomeView(Frame):
screen, screen,
height, height,
width, width,
can_scroll=False,
title='CSC Electronic Office', title='CSC Electronic Office',
) )
self._model = model self._model = model
self._members_menu_items = [ members_menu_items = [
('Add member', 'AddUser'), ('Add member', 'AddUser'),
('Add club rep', 'AddUser'), ('Add club rep', 'AddUser'),
('Renew member', 'RenewUser'), ('Renew member', 'RenewUser'),
@ -23,19 +23,43 @@ class WelcomeView(Frame):
('Change login shell', 'ChangeLoginShell'), ('Change login shell', 'ChangeLoginShell'),
('Set forwarding addresses', 'SetForwardingAddresses'), ('Set forwarding addresses', 'SetForwardingAddresses'),
] ]
self._members_menu = ListBox( members_menu = ListBox(
Widget.FILL_FRAME, len(members_menu_items),
[ [
(desc, i) for i, (desc, view) in (desc, i) for i, (desc, view) in
enumerate(self._members_menu_items) enumerate(members_menu_items)
], ],
name='members', name='members',
label='Members', label='Members',
on_select=self._members_menu_select, on_select=self._members_menu_select,
) )
groups_menu_items = [
('Add group', 'AddGroup'),
('Get group members', 'GetGroup'),
('Add member to group', 'AddMemberToGroup'),
('Remove member from group', 'RemoveMemberFromGroup'),
]
groups_menu = ListBox(
len(groups_menu_items),
[
(desc, i) for i, (desc, view) in
enumerate(groups_menu_items)
],
name='groups',
label='Groups',
on_select=functools.partial(self._generic_menu_select, 'groups'),
)
self._menu_groups = {
'members': members_menu_items,
'groups': groups_menu_items,
}
layout = Layout([100], fill_frame=True) layout = Layout([100], fill_frame=True)
self.add_layout(layout) self.add_layout(layout)
layout.add_widget(self._members_menu) layout.add_widget(members_menu)
layout.add_widget(groups_menu)
layout = Layout([100])
self.add_layout(layout)
layout.add_widget(Divider()) layout.add_widget(Divider())
layout = Layout([1, 1, 1]) layout = Layout([1, 1, 1])
@ -43,12 +67,23 @@ class WelcomeView(Frame):
layout.add_widget(Button("Quit", self._quit), 2) layout.add_widget(Button("Quit", self._quit), 2)
self.fix() self.fix()
def _members_menu_select(self): def _get_menu_item_desc_view(self, menu_name: str):
self.save() self.save()
item_id = self.data['members'] item_id = self.data[menu_name]
desc, view = self._members_menu_items[item_id] menu_items = self._menu_groups[menu_name]
return menu_items[item_id]
def _members_menu_select(self):
desc, view = self._get_menu_item_desc_view('members')
if desc.endswith('club rep'): if desc.endswith('club rep'):
self._model.is_club_rep = True self._model.is_club_rep = True
self._welcomeview_go_to_next_scene(desc, view)
def _generic_menu_select(self, menu_name):
desc, view = self._get_menu_item_desc_view('groups')
self._welcomeview_go_to_next_scene(desc, view)
def _welcomeview_go_to_next_scene(self, desc, view):
self._model.title = desc self._model.title = desc
self._model.scene_stack.append('Welcome') self._model.scene_stack.append('Welcome')
raise NextScene(view) raise NextScene(view)

View File

@ -0,0 +1,42 @@
from asciimatics.widgets import Layout, Text
from ...utils import defer, http_post
from ..CeoFrame import CeoFrame
from ceod.transactions.groups import AddGroupTransaction
class AddGroupView(CeoFrame):
def __init__(self, screen, width, height, model):
super().__init__(
screen, height, width, model, 'AddGroup',
save_data=True,
)
layout = Layout([100], fill_frame=True)
self.add_layout(layout)
self._cn = Text('Name:', 'cn')
layout.add_widget(self._cn)
self._description = Text('Description:', 'description')
layout.add_widget(self._description)
self.add_buttons(
back_btn=True,
next_scene='Confirm', on_next=self._next)
self.fix()
def _next(self):
cn = self._cn.value
description = self._description.value
body = {
'cn': cn,
'description': description,
}
self._model.confirm_lines = [
'The following group will be created:',
'',
('cn', cn),
('description', description),
'',
'Are you sure you want to continue?',
]
self._model.deferred_req = defer(http_post, '/api/groups', json=body)
self._model.operations = AddGroupTransaction.operations

View File

@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

View File

@ -24,7 +24,7 @@ class ChangeLoginShellView(CeoFrame):
layout.add_widget(self._username) layout.add_widget(self._username)
self._login_shell = Text('Login shell:', 'login_shell') self._login_shell = Text('Login shell:', 'login_shell')
layout.add_widget(self._login_shell) layout.add_widget(self._login_shell)
self.add_flash_message_layout() self.add_flash_message_layout()
self.add_buttons( self.add_buttons(
back_btn=True, back_btn=True,

View File

@ -27,7 +27,7 @@ class SetForwardingAddressesView(CeoFrame):
line_wrap=True) line_wrap=True)
layout.add_widget(self._forwarding_addresses) layout.add_widget(self._forwarding_addresses)
layout.add_widget(Label('Press <TAB> to switch widgets')) layout.add_widget(Label('Press <TAB> to switch widgets'))
self.add_flash_message_layout() self.add_flash_message_layout()
self.add_buttons( self.add_buttons(
back_btn=True, back_btn=True,

View File

@ -11,6 +11,7 @@ from .Model import Model
from .ResultView import ResultView from .ResultView import ResultView
from .TransactionView import TransactionView from .TransactionView import TransactionView
from .WelcomeView import WelcomeView from .WelcomeView import WelcomeView
from .groups.AddGroupView import AddGroupView
from .members.AddUserView import AddUserView from .members.AddUserView import AddUserView
from .members.ChangeLoginShellView import ChangeLoginShellView from .members.ChangeLoginShellView import ChangeLoginShellView
from .members.GetUserView import GetUserView from .members.GetUserView import GetUserView
@ -55,6 +56,7 @@ def screen_wrapper(screen, last_scene, model):
('ResetPasswordResult', ResetPasswordResultView(screen, width, height, model)), ('ResetPasswordResult', ResetPasswordResultView(screen, width, height, model)),
('ChangeLoginShell', ChangeLoginShellView(screen, width, height, model)), ('ChangeLoginShell', ChangeLoginShellView(screen, width, height, model)),
('SetForwardingAddresses', SetForwardingAddressesView(screen, width, height, model)), ('SetForwardingAddresses', SetForwardingAddressesView(screen, width, height, model)),
('AddGroup', AddGroupView(screen, width, height, model)),
] ]
scenes = [ scenes = [
Scene([view], -1, name=name) for name, view in views Scene([view], -1, name=name) for name, view in views