Skip to content

Working with Tasks

This guide covers all task-related operations available in the API client.

Task Models

TaskCreate

Used when creating a new task:

from datetime import datetime, timezone
from dida365 import TaskCreate, TaskPriority

task = TaskCreate(
    project_id="project_id",       # Required: Project ID, "" for inbox
    title="My Task",               # Required: Task title
    content="Task details",        # Optional: Task content
    desc="Task description",       # Optional: Task description
    priority=TaskPriority.HIGH,    # Optional: Task priority
    is_all_day=False,             # Optional: All-day task
    start_date=datetime.now(timezone.utc),  # Optional: Start time
    due_date=None,                # Optional: Due time
    time_zone="UTC",              # Optional: Time zone
    reminders=["TRIGGER:PT0S"],   # Optional: Reminder triggers
    repeat_flag=None,             # Optional: Recurring rules
    items=[                       # Optional: Checklist items
        {
            "title": "Subtask 1",
            "status": 0
        }
    ]
)

Note

If the provided project_id does not exist, the task will be created in the inbox. You can also explicitly create a task in the inbox by setting project_id="" (empty string).

TaskUpdate

Used when updating an existing task:

from dida365 import TaskUpdate, TaskPriority

update = TaskUpdate(
    id="task_id",                 # Required: Task ID
    project_id="project_id",      # Required: Project ID
    title="Updated Task",         # Optional: New title
    priority=TaskPriority.MEDIUM  # Optional: New priority
)

Basic Operations

Create a Task

# Simple task
task = await client.create_task(
    TaskCreate(
        project_id="project_id",
        title="Simple Task"
    )
)

# Detailed task
from datetime import datetime, timezone
task = await client.create_task(
    TaskCreate(
        project_id="project_id",
        title="Important Meeting",
        content="Quarterly review",
        priority=TaskPriority.HIGH,
        start_date=datetime.now(timezone.utc),
        is_all_day=False,
        time_zone="UTC",
        reminders=["TRIGGER:PT0S"],  # Reminder at start time
        items=[
            {"title": "Prepare slides", "status": 0},
            {"title": "Review metrics", "status": 0}
        ]
    )
)

Get Tasks

# Get a specific task
task = await client.get_task("project_id", "task_id")

# Get all tasks in a project
project_data = await client.get_project_with_data("project_id")
tasks = project_data.tasks

Update a Task

# Update specific fields
updated = await client.update_task(
    TaskUpdate(
        id="task_id",
        project_id="project_id",
        title="New Title"
    )
)

# Full update
updated = await client.update_task(
    TaskUpdate(
        id="task_id",
        project_id="project_id",
        title="Updated Task",
        content="New content",
        priority=TaskPriority.HIGH,
        start_date=datetime.now(timezone.utc),
        items=[
            {"title": "New subtask", "status": 0}
        ]
    )
)

Complete/Delete Tasks

# Mark task as complete
await client.complete_task("project_id", "task_id")

# Delete task
await client.delete_task("project_id", "task_id")

Task Properties

Property Type Required Description
id str Yes (update) Task identifier
project_id str Yes Project identifier
title str Yes Task title
content str No Task content/notes
desc str No Task description
priority TaskPriority No Task priority level
is_all_day bool No Whether task is all-day
start_date datetime No Start date and time
due_date datetime No Due date and time
time_zone str No Time zone for dates
reminders List[str] No Reminder triggers
repeat_flag str No Recurring rules
items List[dict] No Checklist items
status TaskStatus No Task status

Priority Levels

from dida365 import TaskPriority

# Available priority levels:
TaskPriority.NONE    # No priority (0)
TaskPriority.LOW     # Low priority (1)
TaskPriority.MEDIUM  # Medium priority (3)
TaskPriority.HIGH    # High priority (5)

Task Status

from dida365 import TaskStatus

# Available status values:
TaskStatus.NORMAL     # Normal/incomplete (0)
TaskStatus.COMPLETED  # Completed (2)

Checklist Items

Checklist items (subtasks) have their own properties:

checklist_item = {
    "title": "Subtask",           # Required: Item title
    "status": 0,                  # Optional: 0=normal, 1=completed
    "start_date": datetime.now(), # Optional: Start time
    "is_all_day": False,         # Optional: All-day item
    "time_zone": "UTC"           # Optional: Time zone
}

Error Handling

from dida365.exceptions import NotFoundError, ValidationError

try:
    task = await client.get_task("project_id", "non_existent_id")
except NotFoundError:
    print("Task not found")
except ValidationError as e:
    print(f"Invalid data: {e}")

Complete Example

from datetime import datetime, timezone
from dida365 import (
    Dida365Client,
    TaskCreate,
    TaskUpdate,
    TaskPriority,
    ProjectCreate
)

async def manage_tasks():
    client = Dida365Client()

    # Create a project first
    project = await client.create_project(
        ProjectCreate(name="Task Demo")
    )

    # Create a task with subtasks
    task = await client.create_task(
        TaskCreate(
            project_id=project.id,
            title="Important Task",
            content="Task details",
            priority=TaskPriority.HIGH,
            start_date=datetime.now(timezone.utc),
            items=[
                {"title": "Subtask 1", "status": 0},
                {"title": "Subtask 2", "status": 0}
            ]
        )
    )

    # Update the task
    updated = await client.update_task(
        TaskUpdate(
            id=task.id,
            project_id=project.id,
            title="Updated Task",
            priority=TaskPriority.MEDIUM
        )
    )

    # Mark as complete
    await client.complete_task(project.id, task.id)

    # Clean up
    await client.delete_task(project.id, task.id)
    await client.delete_project(project.id)