使用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.