Обновление настраиваемого поля с использованием API-интерфейса ASANA Python

Я пытаюсь обновить значения настраиваемых полей в списке Асаны. Я использую Официальную клиентскую библиотеку Python для Asana API v1.

Мой код в настоящее время выглядит так;

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 возвращает все детали задачи, но пользовательское поле не было обновлено.

2 ответа

Я думаю, что проблема в том, что наш API не является симметричным по отношению к пользовательским полям... что я нахожу обломом; в таких случаях это может быть настоящей ошибкой. Вместо того, чтобы устанавливать значение настраиваемого поля в блоке значений, как вы делаете выше, что является интуитивно понятным, вы должны установить их с помощью словаря-настройки ключа: значение custom_field_id:new_value - не такой интуитивно понятный, к сожалению. Так выше, где у вас есть

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

Я думаю, что вы должны сделать что-то вроде этого:

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

Цель состоит в том, чтобы сгенерировать JSON для запроса POST, который выглядит примерно так:

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

В качестве дальнейшего примечания, значение должно быть новой текстовой строкой, если у вас есть текстовое настраиваемое поле, числом, если это числовое настраиваемое поле, и идентификатором enum_options выбор (посмотрите на третий пример под этим заголовком на нашем сайте документации), если это пользовательское поле enum.

Благодаря Мэтту я нашел решение.

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 в моем оригинальном и обновленном коде.

Другие вопросы по тегам