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)
							 | 
						|
								
							 |