Эта функция предназначена для обработки содержимого объекта класса Change внутри объекта класса WebHook и формирования текстового сообщения о произошедших изменениях.
Параметры функции:
change: объект классаChange, передаваемый для формирования сообщения, содержащего информацию о изменениях,lang: объект типаstring- строка, содержащая “ключ” языка для выбора соответствующего шаблона при подготовке строки.
Результат работы функции:
- объект типа
string, содержащий информацию, извлеченную из переданного объекта
Алгоритм работы функции:
При изменениях объекта в Taiga, формируется WebHook со значением атрибута action = change. В этом случае в WebHook появляется дополнительный вложенный объект класса Change.
Объект Change всегда содержит атрибуты связанные с действиями с комментариями и, вложенный объект класса Diff.
Действия связанный с комментариями формируют отдельный WebHook на каждое единичное действие: создание, изменение, удаление комментария. При этом в данном WebHook гарантировано не содержится информация о иных изменениях объекта. Если действий с комментариями не выполнялось, то в WebHook все атрибуты, связанные с комментариями будут иметь значения null или "". Таким образом наличие информации в любом из атрибутов, связанных с комментариями (подробнее см. здесь), означает действие с комментариями и приводит к выполнению функции get_comment_string с возвратом полученного значения в функцию, вызвавшую get_string.
Все остальные обрабатываемые изменения имеют следующий вид в WebHook:
"change": {
"comment": "",
"comment_html": "",
"delete_comment_date": null,
"comment_versions": null,
"edit_comment_date": null,
"diff": {
"milestone": {
"from": "Test sprint",
"to": null
},
}
}В объекте класса Diff имеются атрибуты с именем изменяемого атрибута (milestone (в примере выше)), а в нем атрибуты from, to, содержащие значения данного атрибута до и после изменения.
Исключение, составляют изменения, связанные с вложениями файлов. На каждое событие, связанное с вложениями файлов формируется отдельный WebHook. В данном WebHook гарантировано не содержится информация о иных (не связанных с вложениями) изменениях объекта. При этом в объекте Diff формируется вложенный объект Attachments, структура которого отличается от приведенной выше. Данный объект передается для обработки в функцию get_attachment_string, и результат ее выполнения возвращается в функцию, вызвавшую get_string.
По всем остальным видам изменений может быть сформирован как отдельный WebHook содержащий один атрибут (одно событие) в Diff, так и групповой с информацией о нескольких изменениях.
В этом случае производится перебор всех атрибутов в Diff и формирование общего текстового сообщения об изменениях из нескольких строк.
При изменении очков и метки “заблокировано” - формируются вложенные объекты points и is_blocked. Их структура отличается от приведенной выше. В связи с этим они обрабатываются отдельными блоками, в том числе points с вызовом функции get_change_points_string.
Все остальные вложенные объекты имеют одинаковую структуру и обрабатываются в одном блоке, последовательным перебором.
Атрибуты from, to в отдельных случая могут иметь значения null или пустой строки.
Из-за особенностей используемого языка, не всегда есть возможность построить универсальные фразы для случаев когда from, to имеют значения null. В словаре строк подготовлены различные шаблоны, имеющие имена вида:
change_{event}_{from_to_key}_stringгде event - имя обрабатываемого вложенного в Diff объекта, from_to_key - специальный текстовый ключ, определяемый функцией get_from_to_key для выбора правильного шаблона из словаря.
Пример вызова функции:
change_string = get_changes(change=payload.change, lang="en")