Source code for nc_py_api.ex_app.ui.top_menu

"""Nextcloud API for working with Top App menu."""

import dataclasses

from ..._exceptions import NextcloudExceptionNotFound
from ..._misc import require_capabilities
from ..._session import AsyncNcSessionApp, NcSessionApp


[docs] @dataclasses.dataclass class UiTopMenuEntry: """App top menu entry description.""" def __init__(self, raw_data: dict): self._raw_data = raw_data @property def appid(self) -> str: """App ID for which this entry is.""" return self._raw_data["appid"] @property def name(self) -> str: """Top Menu entry name, acts like ID.""" return self._raw_data["name"] @property def display_name(self) -> str: """Display name of the entry.""" return self._raw_data["display_name"] @property def icon(self) -> str: """Relative to the ExApp url with icon or empty value to use the default one icon.""" return self._raw_data["icon"] if self._raw_data["icon"] else "" @property def admin_required(self) -> bool: """Flag that determines whether the entry menu is displayed only for administrators.""" return bool(int(self._raw_data["admin_required"])) def __repr__(self): return f"<{self.__class__.__name__} name={self.name}, admin_required={self.admin_required}>"
[docs] class _UiTopMenuAPI: """API for the top menu app nav bar in Nextcloud, avalaible as **nc.ui.top_menu.<method>**.""" _ep_suffix: str = "ui/top-menu" def __init__(self, session: NcSessionApp): self._session = session
[docs] def register(self, name: str, display_name: str, icon: str = "", admin_required=False) -> None: """Registers or edit the App entry in Top Meny. :param name: Unique name for the menu entry. :param display_name: Display name of the menu entry. :param icon: Optional, url relative to the ExApp, like: "img/icon.svg" :param admin_required: Boolean value indicating should be Entry visible to all or only to admins. """ require_capabilities("app_api", self._session.capabilities) params = { "name": name, "displayName": display_name, "icon": icon, "adminRequired": int(admin_required), } self._session.ocs("POST", f"{self._session.ae_url}/{self._ep_suffix}", json=params)
[docs] def unregister(self, name: str, not_fail=True) -> None: """Removes App entry in Top Menu.""" require_capabilities("app_api", self._session.capabilities) try: self._session.ocs("DELETE", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name}) except NextcloudExceptionNotFound as e: if not not_fail: raise e from None
[docs] def get_entry(self, name: str) -> UiTopMenuEntry | None: """Get information of the top meny entry for current app.""" require_capabilities("app_api", self._session.capabilities) try: return UiTopMenuEntry( self._session.ocs("GET", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name}) ) except NextcloudExceptionNotFound: return None
class _AsyncUiTopMenuAPI: """Async API for the top menu app nav bar in Nextcloud.""" _ep_suffix: str = "ui/top-menu" def __init__(self, session: AsyncNcSessionApp): self._session = session async def register(self, name: str, display_name: str, icon: str = "", admin_required=False) -> None: """Registers or edit the App entry in Top Meny. :param name: Unique name for the menu entry. :param display_name: Display name of the menu entry. :param icon: Optional, url relative to the ExApp, like: "img/icon.svg" :param admin_required: Boolean value indicating should be Entry visible to all or only to admins. """ require_capabilities("app_api", await self._session.capabilities) params = { "name": name, "displayName": display_name, "icon": icon, "adminRequired": int(admin_required), } await self._session.ocs("POST", f"{self._session.ae_url}/{self._ep_suffix}", json=params) async def unregister(self, name: str, not_fail=True) -> None: """Removes App entry in Top Menu.""" require_capabilities("app_api", await self._session.capabilities) try: await self._session.ocs("DELETE", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name}) except NextcloudExceptionNotFound as e: if not not_fail: raise e from None async def get_entry(self, name: str) -> UiTopMenuEntry | None: """Get information of the top meny entry for current app.""" require_capabilities("app_api", await self._session.capabilities) try: return UiTopMenuEntry( await self._session.ocs("GET", f"{self._session.ae_url}/{self._ep_suffix}", params={"name": name}) ) except NextcloudExceptionNotFound: return None