Working with Projects¶
This guide covers all project-related operations available in the API client.
Project Models¶
ProjectCreate¶
Used when creating a new project:
from dida365 import ProjectCreate, ViewMode, ProjectKind
project = ProjectCreate(
name="My Project", # Required: Project name
color="#FF0000", # Optional: Hex color code
view_mode=ViewMode.KANBAN, # Optional: LIST, KANBAN, TIMELINE
kind=ProjectKind.TASK # Optional: TASK, NOTE
)
ProjectUpdate¶
Used when updating an existing project:
from dida365 import ProjectUpdate
update = ProjectUpdate(
id="project_id", # Required: Project ID
name="Updated Name", # Optional: New name
color="#00FF00", # Optional: New color
view_mode=ViewMode.LIST, # Optional: New view mode
kind=ProjectKind.TASK # Optional: New kind
)
Basic Operations¶
Create a Project¶
# Simple creation
project = await client.create_project(
ProjectCreate(name="Simple Project")
)
# Full options
project = await client.create_project(
ProjectCreate(
name="Detailed Project",
color="#FF0000",
view_mode=ViewMode.KANBAN,
kind=ProjectKind.TASK
)
)
Get Projects¶
# Get all projects
projects = await client.get_projects()
# Get a specific project
project = await client.get_project("project_id")
# Get project with all its data (tasks and columns)
project_data = await client.get_project_with_data("project_id")
print(f"Project has {len(project_data.tasks)} tasks")
for column in project_data.columns: # Only in KANBAN view
print(f"Column: {column.name}")
Inbox
The inbox is a special type of project that is not returned by get_projects()
. However, you can still create tasks in the inbox by using an empty string (""
) as the project_id
. When you create a task in the inbox, the returned task's project_id
will contain the actual inbox project_id.
Update a Project¶
# Update specific fields
updated = await client.update_project(
ProjectUpdate(
id="project_id",
name="New Name"
)
)
# Full update
updated = await client.update_project(
ProjectUpdate(
id="project_id",
name="Updated Project",
color="#00FF00",
view_mode=ViewMode.TIMELINE,
kind=ProjectKind.TASK
)
)
Delete a Project¶
Project Properties¶
Property | Type | Required | Description |
---|---|---|---|
id |
str | Yes (update) | Project identifier |
name |
str | Yes (create) | Project name |
color |
str | No | Hex color code (e.g., "#FF0000") |
view_mode |
ViewMode | No | View mode (LIST, KANBAN, TIMELINE) |
kind |
ProjectKind | No | Project kind (TASK, NOTE) |
closed |
bool | No | Whether project is closed |
group_id |
str | No | Project group identifier |
permission |
ProjectPermission | No | Access level (READ, WRITE, COMMENT) |
View Modes¶
from dida365 import ViewMode
# Available view modes:
ViewMode.LIST # Default list view
ViewMode.KANBAN # Kanban board view
ViewMode.TIMELINE # Timeline/calendar view
Project Kinds¶
from dida365 import ProjectKind
# Available project kinds:
ProjectKind.TASK # Regular task project
ProjectKind.NOTE # Note-taking project
Error Handling¶
from dida365.exceptions import NotFoundError, ValidationError
try:
project = await client.get_project("non_existent_id")
except NotFoundError:
print("Project not found")
except ValidationError as e:
print(f"Invalid data: {e}")
Complete Example¶
from dida365 import (
Dida365Client,
ProjectCreate,
ProjectUpdate,
ViewMode,
ProjectKind
)
async def manage_projects():
client = Dida365Client()
# Create a project
project = await client.create_project(
ProjectCreate(
name="My Project",
color="#FF0000",
view_mode=ViewMode.KANBAN
)
)
# Get all tasks in the project
data = await client.get_project_with_data(project.id)
print(f"Project has {len(data.tasks)} tasks")
# Update project
updated = await client.update_project(
ProjectUpdate(
id=project.id,
name="Updated Project",
view_mode=ViewMode.TIMELINE
)
)
# Delete when done
await client.delete_project(project.id)