import functools from asciimatics.widgets import ListBox, Layout, Divider, Button, Label from asciimatics.exceptions import NextScene, StopApplication from .CeoFrame import CeoFrame class WelcomeView(CeoFrame): def __init__(self, screen, width, height, model): super().__init__( screen, height, width, model, 'Welcome', title='CSC Electronic Office', escape_on_q=True, ) members_menu_items = [ ('Add member', 'AddUser'), ('Add club rep', 'AddUser'), ('Renew member', 'RenewUser'), ('Renew club rep', 'RenewUser'), ('Get user info', 'GetUser'), ('Reset password', 'ResetPassword'), ('Change login shell', 'ChangeLoginShell'), ('Set forwarding addresses', 'SetForwardingAddresses'), ] members_menu = self._create_menu( members_menu_items, 'members', 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 = self._create_menu(groups_menu_items, 'groups') db_menu_items = [ ('Create MySQL database', 'CreateMySQL'), ('Reset MySQL password', 'ResetMySQLPassword'), ('Create PostgreSQL database', 'CreatePostgreSQL'), ('Reset PostgreSQL password', 'ResetPostgreSQLPassword'), ] db_menu = self._create_menu( db_menu_items, 'databases', self._db_menu_select) positions_menu_items = [ ('Get positions', 'GetPositions'), ('Set positions', 'SetPositions'), ] positions_menu = self._create_menu(positions_menu_items, 'positions') self._menu_groups = { 'members': members_menu_items, 'groups': groups_menu_items, 'databases': db_menu_items, 'positions': positions_menu_items, } layout = Layout([1, 4, 1], fill_frame=True) self.add_layout(layout) layout.add_widget(members_menu, 1) layout.add_widget(groups_menu, 1) layout.add_widget(db_menu, 1) layout.add_widget(positions_menu, 1) layout = Layout([100]) self.add_layout(layout) layout.add_widget(Label('Press to switch widgets')) layout.add_widget(Divider()) layout = Layout([1, 1, 1]) self.add_layout(layout) layout.add_widget(Button("Quit", self._quit), 2) self.fix() def _create_menu(self, menu_items, name, on_select=None): if on_select is None: on_select = functools.partial(self._generic_menu_select, name) return ListBox( len(menu_items), [ (desc, i) for i, (desc, view) in enumerate(menu_items) ], name=name, label=name.capitalize(), on_select=on_select, ) def _get_menu_item_desc_view(self, menu_name: str): self.save() item_id = self.data[menu_name] 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'): self._model.is_club_rep = True self._welcomeview_go_to_next_scene(desc, view) def _db_menu_select(self): pass 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.scene_stack.append('Welcome') raise NextScene(view) @staticmethod def _quit(): raise StopApplication("User pressed quit")