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

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)