Сбор всех комментариев из проекта

Обзор

Инструмент извлечения комментариев получает все ресурсы в проекте, извлекает комментарии и выводит их в файл CSV. В этом пошаговом руководстве используются следующие ресурсы:

  • Python SDK — SDK выполняет разбивку на страницы за вас и настраивает клиент, который можно использовать с токенами разработчика (аутентификация Bearer).
  • Инструмент извлечения комментариев на Python — пример кода, который мы используем, находится здесь.

Попробуйте на Glitch

Glitch — это простой инструмент, который позволяет настраивать собственные приложения, тестировать и запускать их на их серверах. Если вы еще не работали с Glitch, ознакомьтесь с нашим руководством по использованию Glitch. Если хотите увидеть, как работает инструмент извлечения комментариев на сервере, мы настроили приложение Flask на Glitch: инструмент извлечения комментариев Frame.io на Python.

Необходимые области доступа

Перед началом работы с этим руководством убедитесь, что у вас есть токен, который включает как минимум следующие области доступа:

Область доступаПричина
Проекты: чтениеНе является строго обязательным, но необходимо для получения root_asset_id проекта.
Ресурсы: чтениеНеобходимо для навигации по asset_ids через API-интерфейс
Комментарии: чтениеНеобходимо для получения самих комментариев.

1. Подготовка приложения

Это руководство будет следовать такой же схеме, как чтение дерева файлов. Соответственно, для начала работы вам потребуется:

Также нужно импортировать FrameioClient в ваше приложение Python и некоторые дополнительные вспомогательные библиотеки:

Python
1from frameioclient import FrameioClient
2import requests, json, csv, itertools
3
4ROOT_ASSET_ID = "<ROOT_ASSET_ID>"
5TOKEN = "<DEV_TOKEN>"

2. Сканирование проекта

Теперь нужно рекурсивно получить все ресурсы, проверить их на наличие комментариев и сохранить любые ресурсы с комментариями в списке, из которого можно создать файл .csv.

При сканировании проекта нужно выполнить следующие проверки для каждого ресурса:

  • Является ли ресурс файлом? (&quot;_type&quot;: &quot;file&quot;).

  • Если это файл, есть ли у него комментарии? * Если есть, получите их и добавьте в ваш список.

  • Является ли ресурс папкой? (&quot;_type&quot;: &quot;folder&quot;)

  • Если это папка, выполните рекурсивную обработку ее дочерних элементов.

  • Является ли ресурс стеком версий? (&quot;_type&quot;: &quot;version_stack&quot;)

  • Если это стек версий, получите все дочерние элементы и проверьте их на наличие комментариев.

Python
1def all_comments(client, asset_id, comment_list):
2 files = client.get_asset_children(asset_id)
3
4 for asset in files:
5 if asset['type'] == "file":
6 if asset['comment_count'] > 0:
7 asset_parent_id = asset['parent_id']
8 asset_name = asset['name']
9 comments = client.get_comments(asset['id'])
10 my_comment_list = [comment for comment in comments.results]
11 for object in my_comment_list:
12 object.update({'parent_id':asset_parent_id})
13 object.update({'name':asset_name})
14 comment_list.append(my_comment_list)
15
16 if asset['type'] == "folder":
17 if asset['item_count'] > 0:
18 all_comments(client, asset['id'], comment_list)
19
20 if asset['type'] == "version_stack":
21 asset_name = asset['name']
22 parent_id = asset['parent_id']
23 vfiles = client.get_asset_children(asset['id'])
24
25 for asset in vfiles.results:
26 asset_name = asset['name']
27 parent_id = asset['parent_id']
28 if asset['type'] == "file":
29 if asset['comment_count'] > 0:
30 comments = client.get_comments(asset['id'])
31 my_comment_list = [comment for comment in comments.results]
32 for object in my_comment_list:
33 object.update({'parent_id':parent_id})
34 object.update({'name':asset_name})
35 comment_list.append(my_comment_list)
36
37def get_all_project_comments(root_asset_id, token):
38 comment_list = []
39 client = FrameioClient(token)
40
41 all_comments(client, root_asset_id, comment_list)
42
43 return comment_list
Не забудьте о разбивке на страницы

Приведенный выше пример игнорирует разбивку на страницы — но при навигации по большим коллекциям этим не следует пренебрегать! См. наше руководство Основные концепции для справки.

3. Приведение списка комментариев к плоскому виду

Если вы не сделали этого во время сканирования, нужно будет привести список к плоскому виду для более легкой обработки.

Python
1# The response list comes back as a list of lists.
2# Flatten out responses to a single list so you can build your .csv file.
3
4flat_response_list = list(itertools.chain.from_iterable(responses))

4. Отбраковка списка и создание файла .csv

Когда список приведен к плоскому виду, можно использовать генератор списков для извлечения полезных для вас элементов из каждого комментария, а затем вывести их в файл .csv. Мы рекомендуем включить как минимум:

  • Комментарий — text
  • ИД родительского элемента — parent_id
  • ИД ресурса — asset_id
  • Имя ресурса — имя
  • ИД владельца — owner_id
  • Адрес электронной почты владельца — owner.email
  • Метка времени — timestamp
  • Время обновления — updated_at

После создания нового списка с нужными данными для каждого ресурса и получением итогового результата, можно записывать данные в файл .csv.

Python
1list_for_csv = [[o['text'], o['parent_id'], o['asset_id'], o['name'], o['owner_id'], o['owner']['email'], o['timestamp'], o['updated_at']] for o in flat_response_list]
2
3# Let's write our new list out to a .csv file. We'll add a heading.
4with open("output.csv", 'w') as myfile:
5 wr = csv.writer(myfile, dialect='excel')
6 wr.writerow(['Comment', 'Parent ID', 'Asset ID', 'Asset Name', 'Owner ID', 'Email', 'Timestamp', 'Updated At'])
7 wr.writerows(list_for_csv)

Вот и все!Теперь у вас есть файл .csv с развернутыми комментариями из всего проекта Frame.io.