Source code for pykechain.models.sidebar.sidebar_button

from typing import Dict, Optional

from pykechain.enums import (
    FontAwesomeMode,
    SidebarAccessLevelOptions,
    SidebarItemAlignment,
    SidebarType,
    URITarget,
)
from pykechain.exceptions import IllegalArgumentError
from pykechain.models.sidebar.sidebar_base import SideBarItem


[docs] class SideBarButton(SideBarItem): """ Side-bar button class. Every custom button in the side-bar is maintained as an object of this class. The original KE-chain buttons for the project detail, tasks and work breakdown structure are not separate buttons. :cvar allowed_attributes: allowed additional attributed provided as options alongside the specifically allowed ones. :cvar item_type: the item type of this class. Defaults to a BUTTON. """ _allowed_attributes = [ "displayName_nl", "displayName_en", "displayName_de", "displayName_fr", "displayName_it", ] _item_type = SidebarType.BUTTON def __init__( self, side_bar_manager: "SideBarManager", json: Optional[Dict] = None, title: Optional[str] = None, icon: Optional[str] = None, uri: Optional[str] = None, alignment: SidebarItemAlignment = SidebarItemAlignment.TOP, minimum_access_level: SidebarAccessLevelOptions = SidebarAccessLevelOptions.IS_MEMBER, uri_target: URITarget = URITarget.INTERNAL, icon_mode: FontAwesomeMode = FontAwesomeMode.REGULAR, **kwargs, ): """ Create a side-bar button. :param side_bar_manager: Manager object to which the button is linked. :param json: the json response to construct the :class:`SideBarButton` from :param title: visible label of the button :param icon: FontAwesome icon of the button :param uri: Uniform Resource Identifier, the address of the linked page :param uri_target: type of URI, either internal or external :param alignment: alignment of the button top or bottom :param minimum_access_level: the minimum permission needed to see the button :param icon_mode: FontAwesome display mode of the icon :returns None :raises IllegalArgumentError: When the provided Argument is not according to the type. """ super().__init__() if json is None: json = {} title = title if title else json.get("displayName") icon = icon if icon else json.get("displayIcon") uri = uri if uri else json.get("uri") uri_target = json.get("uriTarget", uri_target) icon_mode = json.get("displayIconMode", icon_mode) alignment = json.get("align", alignment) minimum_access_level = json.get("minimumAccessLevel", minimum_access_level) if not isinstance(title, str): raise IllegalArgumentError(f'title must be a string, "{title}" is not.') if not isinstance(icon, str): raise IllegalArgumentError(f'icon must be a string, "{icon}" is not.') if not isinstance(uri, str): raise IllegalArgumentError(f'uri must be a string, "{uri}" is not.') if uri_target not in URITarget.values(): raise IllegalArgumentError( f'uri_target must be a URITarget option, "{uri_target}" is not.' ) if icon_mode not in FontAwesomeMode.values(): raise IllegalArgumentError( f'icon_mode must be a FontAwesomeMode option, "{icon_mode}" is not.' ) for key in kwargs.keys(): if key not in self._allowed_attributes: raise IllegalArgumentError( f'Attribute "{key}" is not supported in the configuration of a side-bar' " card." ) self._manager: "SideBarManager" = side_bar_manager self.display_name: str = title self.display_icon: str = icon self.uri: str = uri self.uri_target: URITarget = uri_target self.display_icon_mode: FontAwesomeMode = icon_mode self.alignment: SidebarItemAlignment = alignment self.minimum_access_level: SidebarAccessLevelOptions = minimum_access_level self._other_attributes = kwargs for key in self._allowed_attributes: if key in json: self._other_attributes[key] = json[key]
[docs] def as_dict(self) -> Dict: """ Retrieve the configuration data, or `meta`, of the side-bar button. :return: dictionary of the configuration data :rtype dict """ config = { "itemType": self._item_type, "displayName": self.display_name, "displayIcon": self.display_icon, "uriTarget": self.uri_target, "uri": self.uri, "displayIconMode": self.display_icon_mode, "align": self.alignment, "minimumAccessLevel": self.minimum_access_level, } config.update(self._other_attributes) config = {k: v for k, v in config.items() if v is not None} return config