You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
8.4 KiB
210 lines
8.4 KiB
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, List
|
|
|
|
import requests
|
|
|
|
from ..todoist_api_python.endpoints import (
|
|
COLLABORATORS_ENDPOINT,
|
|
COMMENTS_ENDPOINT,
|
|
LABELS_ENDPOINT,
|
|
PROJECTS_ENDPOINT,
|
|
QUICK_ADD_ENDPOINT,
|
|
SECTIONS_ENDPOINT,
|
|
SHARED_LABELS_ENDPOINT,
|
|
SHARED_LABELS_REMOVE_ENDPOINT,
|
|
SHARED_LABELS_RENAME_ENDPOINT,
|
|
TASKS_ENDPOINT,
|
|
get_rest_url,
|
|
get_sync_url,
|
|
)
|
|
from ..todoist_api_python.http_requests import delete, get, post
|
|
from ..todoist_api_python.models import (
|
|
Collaborator,
|
|
Comment,
|
|
Label,
|
|
Project,
|
|
QuickAddResult,
|
|
Section,
|
|
Task,
|
|
)
|
|
|
|
|
|
class TodoistAPI:
|
|
def __init__(self, token: str, session: requests.Session | None = None) -> None:
|
|
self._token: str = token
|
|
self._session = session or requests.Session()
|
|
|
|
def get_task(self, task_id: str) -> Task:
|
|
endpoint = get_rest_url(f"{TASKS_ENDPOINT}/{task_id}")
|
|
task = get(self._session, endpoint, self._token)
|
|
return Task.from_dict(task)
|
|
|
|
def get_tasks(self, **kwargs) -> List[Task]:
|
|
ids = kwargs.pop("ids", None)
|
|
|
|
if ids:
|
|
kwargs.update({"ids": ",".join(str(i) for i in ids)})
|
|
|
|
endpoint = get_rest_url(TASKS_ENDPOINT)
|
|
tasks = get(self._session, endpoint, self._token, kwargs)
|
|
return [Task.from_dict(obj) for obj in tasks]
|
|
|
|
def add_task(self, content: str, **kwargs) -> Task:
|
|
endpoint = get_rest_url(TASKS_ENDPOINT)
|
|
data: Dict[str, Any] = {"content": content}
|
|
data.update(kwargs)
|
|
task = post(self._session, endpoint, self._token, data=data)
|
|
return Task.from_dict(task)
|
|
|
|
def update_task(self, task_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{TASKS_ENDPOINT}/{task_id}")
|
|
return post(self._session, endpoint, self._token, data=kwargs)
|
|
|
|
def close_task(self, task_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{TASKS_ENDPOINT}/{task_id}/close")
|
|
return post(self._session, endpoint, self._token, data=kwargs)
|
|
|
|
def reopen_task(self, task_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{TASKS_ENDPOINT}/{task_id}/reopen")
|
|
return post(self._session, endpoint, self._token, data=kwargs)
|
|
|
|
def delete_task(self, task_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{TASKS_ENDPOINT}/{task_id}")
|
|
return delete(self._session, endpoint, self._token, args=kwargs)
|
|
|
|
def quick_add_task(self, text: str) -> QuickAddResult:
|
|
endpoint = get_sync_url(QUICK_ADD_ENDPOINT)
|
|
data = {
|
|
"text": text,
|
|
"meta": True,
|
|
"auto_reminder": True,
|
|
}
|
|
task_data = post(self._session, endpoint, self._token, data=data)
|
|
return QuickAddResult.from_quick_add_response(task_data)
|
|
|
|
def get_project(self, project_id: str) -> Project:
|
|
endpoint = get_rest_url(f"{PROJECTS_ENDPOINT}/{project_id}")
|
|
project = get(self._session, endpoint, self._token)
|
|
return Project.from_dict(project)
|
|
|
|
def get_projects(self) -> List[Project]:
|
|
print('eeeeeeee')
|
|
endpoint = get_rest_url(PROJECTS_ENDPOINT)
|
|
projects = get(self._session, endpoint, self._token)
|
|
return [Project.from_dict(obj) for obj in projects]
|
|
|
|
def add_project(self, name: str, **kwargs) -> Project:
|
|
endpoint = get_rest_url(PROJECTS_ENDPOINT)
|
|
data: Dict[str, Any] = {"name": name}
|
|
data.update(kwargs)
|
|
project = post(self._session, endpoint, self._token, data=data)
|
|
return Project.from_dict(project)
|
|
|
|
def update_project(self, project_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{PROJECTS_ENDPOINT}/{project_id}")
|
|
return post(self._session, endpoint, self._token, data=kwargs)
|
|
|
|
def delete_project(self, project_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{PROJECTS_ENDPOINT}/{project_id}")
|
|
return delete(self._session, endpoint, self._token, args=kwargs)
|
|
|
|
def get_collaborators(self, project_id: str) -> List[Collaborator]:
|
|
endpoint = get_rest_url(
|
|
f"{PROJECTS_ENDPOINT}/{project_id}/{COLLABORATORS_ENDPOINT}"
|
|
)
|
|
collaborators = get(self._session, endpoint, self._token)
|
|
return [Collaborator.from_dict(obj) for obj in collaborators]
|
|
|
|
def get_section(self, section_id: str) -> Section:
|
|
endpoint = get_rest_url(f"{SECTIONS_ENDPOINT}/{section_id}")
|
|
section = get(self._session, endpoint, self._token)
|
|
return Section.from_dict(section)
|
|
|
|
def get_sections(self, **kwargs) -> List[Section]:
|
|
endpoint = get_rest_url(SECTIONS_ENDPOINT)
|
|
sections = get(self._session, endpoint, self._token, kwargs)
|
|
return [Section.from_dict(obj) for obj in sections]
|
|
|
|
def add_section(self, name: str, project_id: str, **kwargs) -> Section:
|
|
endpoint = get_rest_url(SECTIONS_ENDPOINT)
|
|
data = {"name": name, "project_id": project_id}
|
|
data.update(kwargs)
|
|
section = post(self._session, endpoint, self._token, data=data)
|
|
return Section.from_dict(section)
|
|
|
|
def update_section(self, section_id: str, name: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{SECTIONS_ENDPOINT}/{section_id}")
|
|
data: Dict[str, Any] = {"name": name}
|
|
data.update(kwargs)
|
|
return post(self._session, endpoint, self._token, data=data)
|
|
|
|
def delete_section(self, section_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{SECTIONS_ENDPOINT}/{section_id}")
|
|
return delete(self._session, endpoint, self._token, args=kwargs)
|
|
|
|
def get_comment(self, comment_id: str) -> Comment:
|
|
endpoint = get_rest_url(f"{COMMENTS_ENDPOINT}/{comment_id}")
|
|
comment = get(self._session, endpoint, self._token)
|
|
return Comment.from_dict(comment)
|
|
|
|
def get_comments(self, **kwargs) -> List[Comment]:
|
|
endpoint = get_rest_url(COMMENTS_ENDPOINT)
|
|
comments = get(self._session, endpoint, self._token, kwargs)
|
|
return [Comment.from_dict(obj) for obj in comments]
|
|
|
|
def add_comment(self, content: str, **kwargs) -> Comment:
|
|
endpoint = get_rest_url(COMMENTS_ENDPOINT)
|
|
data = {"content": content}
|
|
data.update(kwargs)
|
|
comment = post(self._session, endpoint, self._token, data=data)
|
|
return Comment.from_dict(comment)
|
|
|
|
def update_comment(self, comment_id: str, content: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{COMMENTS_ENDPOINT}/{comment_id}")
|
|
data: Dict[str, Any] = {"content": content}
|
|
data.update(kwargs)
|
|
return post(self._session, endpoint, self._token, data=data)
|
|
|
|
def delete_comment(self, comment_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{COMMENTS_ENDPOINT}/{comment_id}")
|
|
return delete(self._session, endpoint, self._token, args=kwargs)
|
|
|
|
def get_label(self, label_id: str) -> Label:
|
|
endpoint = get_rest_url(f"{LABELS_ENDPOINT}/{label_id}")
|
|
label = get(self._session, endpoint, self._token)
|
|
return Label.from_dict(label)
|
|
|
|
def get_labels(self) -> List[Label]:
|
|
endpoint = get_rest_url(LABELS_ENDPOINT)
|
|
labels = get(self._session, endpoint, self._token)
|
|
return [Label.from_dict(obj) for obj in labels]
|
|
|
|
def add_label(self, name: str, **kwargs) -> Label:
|
|
endpoint = get_rest_url(LABELS_ENDPOINT)
|
|
data = {"name": name}
|
|
data.update(kwargs)
|
|
label = post(self._session, endpoint, self._token, data=data)
|
|
return Label.from_dict(label)
|
|
|
|
def update_label(self, label_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{LABELS_ENDPOINT}/{label_id}")
|
|
return post(self._session, endpoint, self._token, data=kwargs)
|
|
|
|
def delete_label(self, label_id: str, **kwargs) -> bool:
|
|
endpoint = get_rest_url(f"{LABELS_ENDPOINT}/{label_id}")
|
|
return delete(self._session, endpoint, self._token, args=kwargs)
|
|
|
|
def get_shared_labels(self) -> List[str]:
|
|
endpoint = get_rest_url(SHARED_LABELS_ENDPOINT)
|
|
return get(self._session, endpoint, self._token)
|
|
|
|
def rename_shared_label(self, name: str, new_name: str) -> bool:
|
|
endpoint = get_rest_url(SHARED_LABELS_RENAME_ENDPOINT)
|
|
data = {"name": name, "new_name": new_name}
|
|
return post(self._session, endpoint, self._token, data=data)
|
|
|
|
def remove_shared_label(self, name: str) -> bool:
|
|
endpoint = get_rest_url(SHARED_LABELS_REMOVE_ENDPOINT)
|
|
data = {"name": name}
|
|
return post(self._session, endpoint, self._token, data=data)
|
|
|