#!/usr/bin/env python3
"""
NextCloud tasks console interface, basing on the async Python API and Textual.
The environment variables NEXTCLOUD_USER and NEXTCLOUD_PASS can be set to skip the login prompt.
"""
import argparse
import sys
from typing import Optional
from nextcloud_tasks_api import NextcloudTasksApiFactory, NextcloudTasksApi
from textual.app import App
from .screens import UnlockScreen, MainScreen
from .status import NotificationHandler
class KeePassApp(App[int]):
"""Main app, passing the API from the password/unlock screen to the task browser."""
def __init__(self, api: NextcloudTasksApiFactory, default_list: Optional[str]) -> None:
super().__init__()
self._api: NextcloudTasksApiFactory = api
self._default_list: Optional[str] = default_list
def on_mount(self) -> None:
NotificationHandler.configure_logging(self)
self.push_screen(UnlockScreen(self._api), callback=self._on_unlock)
def _on_unlock(self, api: Optional[NextcloudTasksApi]) -> None:
if api is None:
self.exit(0)
else:
self.push_screen(MainScreen(api, self._default_list), callback=self.exit)
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__.strip(),
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--task-list", metavar="NAME", type=str, default=None,
help="task list to initially select")
parser.add_argument("--no-verify-ssl", action="store_const", const=True, default=False,
help="ignore certificate errors")
parser.add_argument("url", metavar="URL", type=str,
help="NextCloud installation root URL")
args = parser.parse_args()
rv: Optional[int] = KeePassApp(NextcloudTasksApiFactory(
base_url=args.url,
verify_ssl=not args.no_verify_ssl,
limit=1,
timeout=30.0,
), args.task_list).run()
return rv if rv is not None else 1
if __name__ == "__main__":
sys.exit(main())