使用ASANA Python API更新自定义字段

问题描述:

我正在尝试更新Asana列表中的自定义字段的值.我正在使用 Asana API v1的官方Python客户端库.

I'm trying to update the values of custom fields in my Asana list. I'm using the Official Python client library for the Asana API v1.

我的代码当前看起来像这样;

My code currently looks like this;

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将返回任务的所有详细信息,但是自定义字段尚未更新.

But when I run the code, the task doesn't update. The return of print client.tasks.update returns all the details of the task, but the custom field has not been updated.

我认为问题在于我们的API与自定义字段不对称...我觉得这实在太可惜了.在这种情况下,这可能是一个真正的陷阱.不能像上面那样在值块内设置自定义字段的值(这很直观),您必须使用键:类似于值字典的设置custom_field_id:new_value来设置它们-不那么直观, 很遗憾.所以上面,你在哪里

I think the problem is that our API is not symmetrical with respect to custom fields... which I kind of find to be a bummer; it can be a real gotcha in cases like this. Rather than being able to set the value of a custom field within the block of values as you're doing above, which is intuitive, you have to set them with a key:value dictionary-like setup of custom_field_id:new_value - not as intuitive, unfortunately. So above, where you have

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

我认为您必须执行以下操作:

I think you'd have to do something like this:

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

目标是为看起来像这样的POST请求生成JSON

The goal is to generate JSON for the POST request that looks something like

{
  "data": {
    "custom_fields":{
      "12345678":"New Data!"
    }
  }
}

作为进一步的说明,如果您有文本自定义字段,则值应该是新的文本字符串,如果是数字自定义字段,则值应该是数字,以及enum_options选择的ID(请看第三个示例)如果它是枚举自定义字段,则在此标头下)

As a further note, the value should be the new text string if you have a text custom field, a number if it's a number custom field, and the ID of the enum_options choice (take a look at the third example under this header on our documentation site) if it's an enum custom field.