2016-12-21 1 views
0

내 Asana 목록의 사용자 정의 필드 값을 업데이트하려고합니다. Official Python client library for the Asana API v1을 사용하고 있습니다.ASANA Python API를 사용하여 사용자 정의 필드 업데이트

내 코드는 현재 다음과 같습니다.

project = "Example Project" 
keyword = "Example Task" 

print "Logging into ASANA" 
api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
client = asana.Client.basic_auth(api_key) 
me = client.users.me() 
all_projects = next(workspace for workspace in me['workspaces']) 
projects = client.projects.find_by_workspace(all_projects['id']) 

for project in projects: 
    if 'Example Project' not in project['name']: 
     continue 
    print "Project found." 
    print "\t"+project['name'] 
    print 

    tasks = client.tasks.find_by_project(project['id'], {"opt_fields":"this.name,custom_fields"}, iterator_type=None) 

    for task in tasks: 
     if keyword in task['name']: 
      print "Task found:" 
      print "\t"+str(task) 
      print 
      for custom_field in task['custom_fields']: 
       custom_field['text_value'] = "New Data!" 
      print client.tasks.update(task['id'], {'data':task}) 

하지만 코드를 실행할 때 작업이 업데이트되지 않습니다. print client.tasks.update가 리턴되면 태스크의 모든 세부 사항이 리턴되지만 사용자 정의 필드는 갱신되지 않습니다.

답변

1

제가 생각하기에 문제는 우리 API가 사용자 정의 필드와 관련하여 대칭 적이 지 않은 것입니다 ... 어떤 종류의 오류가있는 것으로 나타났습니다. 이런 경우에는 정말 혼란 스러울 수 있습니다. 직관적 인 위와 같이 값 블록 내에 사용자 정의 필드의 값을 설정할 수있는 것보다, 값 사전 형식의 custom_field_id:new_value과 같은 키로 설정해야합니다. 불행히도 직관적이지는 않습니다. . 그래서 위의, 당신은

for custom_field in task['custom_fields']: 
    custom_field['text_value'] = "New Data!" 

난 당신이 그런 짓을 할 거라고 생각이 여기서

목표는

{ 
    "data": { 
    "custom_fields":{ 
     "12345678":"New Data!" 
    } 
    } 
} 
같이 보입니다 POST 요청에 대한 JSON을 생성하는 것입니다
new_custom_fields = {} 
for custom_field in task['custom_fields']: 
    new_custom_fields[custom_field['id']] = "New Data!" 
task['custom_fields'] = new_custom_fields 

텍스트 맞춤 입력란 인 경우 값이 새로운 텍스트 문자열이어야하고 숫자 맞춤 입력란 인 경우 숫자이어야하며 enum_options 선택의 ID가 있어야합니다 (thir d 예제는 enum 사용자 정의 필드 인 경우 설명서 사이트의 this header 아래).

+0

귀찮은, 저를 위해 일하지 않는 것 같습니다. – KSmith

+0

client.tasks.update (task [ 'id'], { 'data': task})의 결과가 원래 작업을 반환합니다. – KSmith

0

Matt 덕분에 해결책을 찾았습니다.

new_custom_fields = {} 
for custom_field in task['custom_fields']: 
    new_custom_fields[custom_field['id']] = "New Data!" 

print client.tasks.update(task['id'], {'custom_fields':new_custom_fields}) 

내 원래 코드에서 두 가지 문제가 있었다 첫 번째는 내가 대칭 API를 치료하려고했던이 식별 및 매트에 의해 해결되었다이었다. 두 번째는 잘못된 형식으로 업데이트하려고 시도했기 때문입니다. 원래와 업데이트 된 코드에서 client.tasks.update의 차이점에 유의하십시오.