Creating Data in Asana

There are two methods on Task for writing to Asana: sync_to_asana() and add_comment().

Task.sync_to_asana(fields=None)

With no arguments, can be used to update the ‘completed’ status of a Task:

task.completed = True
task.save()
task.sync_to_asana()

Optionally, a sequence of fields can be passed:

task.notes = 'Get it done!'
task.due_on = today
task.save()
task.sync_to_asana(fields=('notes', 'due_on'))

Task.add_comment(text)

task.add_comment('Email sent to 123 users.')

Everything else

Other than those use cases, to create data in Asana, use the client provided by django-asana but beyond that use python-asana directly.

from dateutil.parser import parse
from django.db import IntegrityError
from djasana.connect import client_connect
from djasana.models import Task

def create_task():
    client = client_connect()
    workspace_id = 123456  # A djasana.models.Workspace.remote_id,
    owner_id = 567890,  # Maybe your own id at Asana
    project = {  # A dict of values you want to create
        'name': 'A test project',
        'workspace': workspace_id,
        'owner': owner_id,
    }
    # projects.create is a method provided by python-asana:
    project_response = client.projects.create(data)
    project_remote_id = project_response['gid']
    for key in (
            'followers', 'members', 'owner', 'team', 'workspace'):
        project_response.pop(key, None)
    # Convert string to boolean:
    response['archived'] = response['archived'] == 'true'
    Project.objects.create(
        remote_id=project_remote_id,
        owner_id=owner_id,
        workspace_id=workspace_id,
        **project_response
        )
    task = {'name': 'A test task', projects: [project_remote_id]}
    # tasks.create is a method provided by python-asana:
    task_response = client.tasks.create(workspace=workspace_id, **task)
    task_response['remote_id'] = task_response['gid']
    task_response['assignee_id'] = task_response.pop('assignee')['gid']
    if 'due_on' in task_response and isinstance(task_response['due_on'], str):
        task_response['due_on'] = parse(task_response['due_on'])
    if 'parent' in task_response and task_response['parent']:
        task_response['parent_id'] = task_response.pop('parent')['gid']
    for key in (
            'followers', 'hearts', 'liked', 'likes', 'num_likes', 'num_hearts',
            'memberships', 'projects', 'tags', 'workspace'):
        task_response.pop(key, None)
    Task.objects.create(**task_response)