Для подключения процессоров необходимо в конфигурационном файле (см. раздел Настройка конфигурации) добавить раздел processors.
Структура элемента processors:
{
"soft_name":
{
"open_pre":
{
"script_path": "path/to/script.py",
"function": "open_pre"
},
"open_replace":
{
"script_path": "path/to/script.py",
"function": "open_replace"
},
"open_post":
{
"script_path": "path/to/script.py",
"function": "open_post"
},
"new_pre":
{
"script_path": "path/to/script.py",
"function": "new_pre"
},
"new_replace":
{
"script_path": "path/to/script.py",
"function": "new_replace"
},
"new_post":
{
"script_path": "path/to/script.py",
"function": "new_post"
},
"link_pre":
{
"script_path": "path/to/script.py",
"function": "link_pre"
},
"link_replace":
{
"script_path": "path/to/script.py",
"function": "link_replace"
},
"link_post":
{
"script_path": "path/to/script.py",
"function": "link_post"
},
"embed_pre":
{
"script_path": "path/to/script.py",
"function": "embed_pre"
},
"embed_replace":
{
"script_path": "path/to/script.py",
"function": "embed_replace"
},
"embed_post":
{
"script_path": "path/to/script.py",
"function": "embed_post"
},
"check_reference_pre":
{
"script_path": "path/to/script.py",
"function": "check_reference_pre"
},
"check_reference_replace":
{
"script_path": "path/to/script.py",
"function": "check_reference_replace"
},
"check_reference_post":
{
"script_path": "path/to/script.py",
"function": "check_reference_post"
},
"reload_reference_pre":
{
"script_path": "path/to/script.py",
"function": "reload_reference_pre"
},
"reload_reference_replace":
{
"script_path": "path/to/script.py",
"function": "reload_reference_replace"
},
"reload_reference_post":
{
"script_path": "path/to/script.py",
"function": "reload_reference_post"
},
"version_pre":
{
"script_path": "path/to/script.py",
"function": "version_pre"
},
"version_replace":
{
"script_path": "path/to/script.py",
"function": "version_post"
},
"publish_pre":
{
"script_path": "path/to/script.py",
"function": "publish_pre"
},
"publish_replace":
{
"script_path": "path/to/script.py",
"function": "publish_replace"
},
"publish_post":
{
"script_path": "path/to/script.py",
"function": "publish_post"
},
"link_pre":
{
"script_path": "path/to/script.py",
"function": "link_pre"
},
"link_replace":
{
"script_path": "path/to/script.py",
"function": "link_replace"
},
"link_post":
{
"script_path": "path/to/script.py",
"function": "link_post"
},
"embed_pre":
{
"script_path": "path/to/script.py",
"function": "embed_pre"
},
"embed_replace":
{
"script_path": "path/to/script.py",
"function": "embed_replace"
},
"embed_post":
{
"script_path": "path/to/script.py",
"function": "embed_post"
},
"indicator_task":
{
"script_path": "path/to/script.py",
"function": "indicator_task"
},
"menu_task":
{
"script_path": "path/to/script.py",
"function": "menu_task"
},
"menu_file":
{
"script_path": "path/to/script.py",
"function": "menu_file"
}
"search_task":
{
"script_path": "path/to/script.py",
"function": "search_task"
},
"screenshot_pre":
{
"script_path": "path/to/script.py",
"function": "screenshot_pre"
},
"screenshot_replace":
{
"script_path": "path/to/script.py",
"function": "screenshot_replace"
},
"screenshot_post":
{
"script_path": "path/to/script.py",
"function": "screenshot_post"
}
}
}
Ключ soft_name
Внутреннее название одного из поддерживаемых приложений, например maya, nuke, houdini, blender, cinema4d, 3dsmax и тп.
Переменная script_path
Задает полный путь до Python-скрипта. Переменная пути может содержать переменные окружения, а также специфическую переменную $(cerebro_plugins).
$(cerebro_plugins) - определяет путь до папки плагинов Cerebro, которые поставляются с помощью встроенной системы распространения плагинов. Таким образом вы можете загружать процессоры в качестве плагинов Cerebro и они будут использоваться в Tentaculo.
Переменная function
Название вызываемой функции. Вызываемая функция должна принимать в качестве аргументов два параметра-словаря и возвращать второй из них, при необходимости модифицированный.
Первый аргумент - словарь, является общим для всех процессоров, и содержит следующие ключи:
task_id - ID задачи;
task_name - Название задачи;
task_parent_id - ID родительской задачи;
task_parent_path - Путь родительской задачи в Cerebro;
task_status_id - ID текущего статуса задачи;
task_status_name - Название текущего статуса задачи;
task_activity_id - ID вида деятельности задачи;
task_activity_name - Название вида деятельности задачи;
task_unid - ID вселенной задачи;
current_user_id - ID текущего пользователя;
current_user_name - Отображаемое имя текущего пользователя.
Второй аргумент зависит от конкретного процессора.
Создание нового файла
Процессоры на создание нового файла вызываются при начале работы с задачей, в которой еще нет ни одной версии, то есть создается пустой файл.
new_pre
- Вызывается непосредственно перед созданием файла;
new_replace
- Вызывается вместо штатной процедуры создания файла;
new_post
- Вызывается сразу после процедуры создания файла.
{
"local_file_path": "", # полный путь до рабочей версии файла
"original_file_path": "" # полный путь до исходной версии файла
}
Открытие файла
Процессоры на открытие файла вызываются на открытие уже существующей версии в задаче, через пункты меню Start working и Open to review (safe mode). Пункт Open to view процессоры не вызывает.
open_pre
- Вызывается непосредственно перед открытием файла;
open_replace
- Вызывается вместо штатной процедуры открытия файла;
open_post
- Вызывается сразу после процедуры открытия файла.
{
"local_file_path": "", # полный путь до рабочей версии файла
"original_file_path": "" # полный путь до исходной версии файла
"review": false # переменная, означающая, для чего открывается файл. false - взятие в работу, true - просмотр(ревью)
}
Если вам требуется изменить какой-либо либо ключ, вы должны заменить значение этого ключа(ей) и вернуть аргумент.
Например вы хотите заменить исходную версию для задачи с именем test каким-то другим файлом, чтобы открыть его вместо выбранной пользователем.
Для этого вам нужно написать процессор open_pre:
def open_pre(task_info, arg):
if task_info['name'] == 'test':
arg['original_file_path'] = 'C:/test_file.ma'
return arg
Сохранение версии
Сохранение нумерованной версии файла.Процессоры на сохранение версии вызываются на сохранение версии с публикацией отчета.
version_pre
- Вызывается непосредственно перед сохранением версии;
version_replace
- Вызывается вместо штатной процедуры сохранения версии и публикации отчета;
version_post
- Вызывается сразу после процедуры сохранения версии и публикации отчета.
{
"local_file_path": "", # полный путь до рабочей версии файла
"version_file_path": "", # полный путь до сохраняемой версии файла
"report": # полный путь до сохраняемой версии файла
{
"plain_text": "", # текст отчёта
"hashtags": [], # список хештегов отчёта
"work_time": "" # время работы в минутах
},
"attachments": # набор файлов, прикрепляемых к отчету через Cargador
{
"file_path": [ paths to file thumbnails ], # file_path - путь до файла
...
},
"links": # набор файлов, прикрепляемых к отчету по ссылке
{
"file_path": [ paths to file thumbnails ],
...
},
"new_status_id" : "", # ID нового статуса задачи, Значение None означает не переключать статус задачи)
"screenshot": "", # путь до тамбнейла версии
"send_version": True # определяет нужно ли прикреплять файл версии к отчёту в Cerebro)
}
Примечание:
В тентакуло предусмотрено сохранение версии без публикации отчета, в этом случае значение ключей "report": {}, "attachments": {}, "links": {} будет пустым.
Если вам требуется изменить какой-либо либо ключ, вы должны заменить значение этого ключа(ей) и вернуть аргумент.
(вставить как код)
arg['report']['plain_text'] += ' Path to file ' + arg['version_file_path']
arg['report']['hashtags'] = ['version']
return arg
Публикация файла
Сохранение основной версии файла. При публикации, обычно, создаются: версия файла с номером и основная версия без номера.
Процессоры вызываются на публикацию файла с отчётом.
publish_pre
- Вызывается непосредственно перед публикацией файла.
publish_replace
- Вызывается вместо штатной процедуры публикации файла и публикации отчета.
publish_post
- Вызывается сразу после процедуры публикации файла и публикации отчета.
{
"local_file_path": "", # полный путь до рабочей версии файла
"version_file_path": "", # полный путь до сохраняемой версии файла
"publish_file_path": "", # полный путь до публикуемого финального (основного) файла
"report":
{
"plain_text": "", # текст отчёта
"hashtags": [], # список хештегов отчёта
"work_time": "" # время работы в минутах
},
"attachments": # набор файлов, прикрепляемых к отчету через Cargador
{
"file_path": [ paths to file thumbnails ], # file_path - путь до файла
...
},
"links": # набор файлов, прикрепляемых к отчету по ссылке
{
"file_path": [ paths to file thumbnails ],
...
}
}
Если вам требуется изменить какой-либо либо ключ, вы должны заменить значение этого ключа(ей) и вернуть аргумент.
arg['attachments'].setdefault("c:\image.png", [])
arg['report']['hashtags'] = ['publish', 'version']
return arg
Расширение меню задачи
Процессор вызывается при открытии пользователем контекстного меню задачи в ToDo листе и позволяет добавить свои пункты в данное меню.
menu_task
- Вызывается перед показом пользователю контекстного меню задачи. Второй аргумент для процессора - словарь:
{
"option_list":
[
{"text": "Open in Cerebro...", "index": 0},
{"text": None, "index": 1},
{"text": "Copy local path to Clipboard", "index": 2},
{"text": "Show in Explorer...", "index": 3}
]
}
'option_list' содержит список штатных пунктов меню задачи, с индексами их позиций в меню. 'text' - название пункта. Если названия нет, пункт считается сепаратором(разделителем в меню).
Возвращаемое значение для данного процессора должно содержать список словарей встраиваемых пунктов меню:
[
{
"text": "", # название пункта меню
"index": 0, # индекс позиции в меню
"script_path": "", # путь до Python-скрипта
"function": "" # название вызываемой функции на срабатывание пункта меню
},
...
]
Указанная в "function" функция принимает два аргумента.
Первый аргумент - словарь с информацией по выбранной задаче, такой же как в процессоре.
Второй аргумент - словарь:
{
'option_list':
[
# полный список пунктов меню
]
, 'option': "" # название выбранного пункта меню
}
Например, вам нужен пункт меню, который выводит полный путь до задачи.
def menu_task(task_info, arg):
my_action = {}
my_action.setdefault('text', 'My Action - print task path')
my_action.setdefault('index', len(arg['option_list']))
my_action.setdefault('script_path', os.path.abspath(__file__.replace('.pyc', '.py')))
my_action.setdefault('function', 'my_action')
return [my_action,]
# функция вызываемая, при нажатии на пункт меню "My Action - print task path"
def my_action(task_info, arg):
print('Task Path {0}/{1}'.format(task_info['task_parent_path'], task_info['task_name']))
Расширение меню файла
Процессор вызывается при открытии пользователем контекстного меню файла в выбранной задачи и позволяет добавить свои пункты в данное меню.
menu_file - Вызывается перед показом пользователю контекстного меню файла.
Первый аргумент - словарь с информацией по выбранной задаче.
{
"file_path" "", # полный путь до выбранного файла
"option_list":
[
{"text": "Start working on this file", "index": 0},
{"text": "Open without Starting the Task", "index": 1},
{"text": None, "index": 2},
{"text": "Link", "index": 3},
{"text": "Embed", "index": 4},
{"text": None, "index": 5},
{"text": "Show in Explorer...", "index": 6},
{"text": "Copy file path to Clipboard", "index": 7}
],
}
'option_list' содержит список штатных пунктов меню файла, с индексами их позиций в меню. 'text' - название пункта. Если названия нет, пункт считается сепаратором(разделителем в меню).
Возвращаемое значение для данного процессора должно содержать список словарей встраиваемых пунктов меню:
[
{
"text": "", # название пункта меню
"index": 0, # индекс позиции в меню
"script_path": "", # путь до Python-скрипта
"function": "" # название вызываемой функции на срабатывание пункта меню
},
...
]
Указанная в "function" функция принимает два аргумента.
Первый аргумент - словарь с информацией по выбранной задаче, такой же, как в процессоре.
Второй аргумент - словарь:
{
'option_list':
[
# полный список пунктов меню
]
, 'option': "" # название выбранного пункта меню
, 'file_path': "" # полный путь до выбранного файла
}
Например, вам нужен пункт меню, который выводит полный путь до файла.
def menu_file(task_info, arg):
my_action = {}
my_action.setdefault('text', 'My Action - print file path')
my_action.setdefault('index', len(arg['option_list']))
my_action.setdefault('script_path', os.path.abspath(__file__))
my_action.setdefault(function, 'my_action_file')
return [my_action,]
# функция вызываемая, при нажатии на пункт меню "My Action - print file path"
def my_action_file(task_info, arg):
print('File Path {0}'.format(arg['file_path']))
Цветовая индикация задач
Процессор вызывается при отображении каждой из задач в ToDo листе и позволяет назначить цвет ей цвет.
indicator_task
- Вызывается на отрисовку задачи в интерфейсе.
Второй аргумент - строка:
task_hex - цвет задачи в формате HEX
task_hex всегда приходит значением None. Чтобы задать цветовой индикатор, нужно указать цвет в формате HEX в качестве возвращаемого значения.
def indicator_task(task_info, arg):
return "white" if task_info["task_name"] == "animation" else "green"
Поиск задач
Процессор вызывается при вводе текста в строку поиска браузера задач и нажатию на клавишу Enter.
Второй аргумент - словарь:
{
'projects_set':
{
# набор идентификаторов проектов, по которым будет производиться поиск
}
, 'query': "" # Строка, по которой и будет производиться поиск
}
В процессоре вы можете заменить текст, который ввел пользователь или изменить набор проектов в которых будет вестись поиск задач.
Например, для ускорения поиска сцен по номеру, вы можете условится с пользователем о том, что для поиска сцены, ему достаточно ввести номер сцены. А в процессоре будет добавляться остальная часть имени.
def search_task(task_info, arg):
if arg["query"].isdigit():
arg["query"] = "scene_" + arg["query"]
return arg
Примечание: поиск ведется по всему пути задачи.
Снимок экрана для публикации версии
Снимок экрана прилагается к файлу в качестве тамбнейла при публикации версии в Cerebro.
Процессоры:
screenshot_pre
- Вызывается непосредственно перед снимком экрана;
screenshot_replace
- Вызывается вместо снимка экрана;
screenshot_post
- Вызывается сразу после процедуры снимка экрана для публикации версии.