Объекты в шаблонах
Объекты — элементы данных проекта с атрибутами. Объект может содержать другие объекты или сам входить в состав другого объекта.
Отображение атрибутов объекта
Атрибут объекта выводится через точку:
{{ object.attribute }}
У самого объекта нет кода, как у переменной, поэтому к конкретному объекту обращаются через специальные конструкции (см. ниже).
Обращение к объектам
Простое обращение
Чтобы обратиться к конкретному объекту, пройдите циклом по объектам его типа и добавьте условие на уникальный атрибут (например, название):
{% for comp in component %}
{% if comp.name == "Подсистема управления данными" %}
{{ comp.description }}
{% endif %}
{% endfor %}
Такая конструкция выведет описание объекта типа «component» с названием «Подсистема управления данными».
Обращение к подчиненным объектам
Для объектов, вложенных в другие объекты, используются вложенные циклы. Например, в проекте есть структура «страна» -> «регион»:
{% for cou in country %} - начинает цикл, проходящий по странам
Страна:{{ cou.name }} - выводит название страны
Список регионов:
{% for reg in cou.region %} - начинает цикл, проходящий по регионам в рамках текущей страны
1. {{ reg.name }} - отображает название региона
{% endfor %} - завершает цикл по регионам
{% endfor %} - завершает цикл по странам
Результат:
Страна: Австралия
Список регионов:
- Австралийская столичная территория
- Виктория
- Западная Австралия
- Квинсленд
- Новый Южный Уэльс
- Тасмания
- Южная Австралия
Страна: Австрия
Список регионов:
...
Встроенные объекты
В ГОСТ-ОН есть встроенные объекты: их нет в данных проекта, а набор атрибутов у них фиксированный.
Текущий документ
Объект, представляющий текущий документ
Название - «current_doc»
Атрибуты:
- «name» - название документа
- «stage» - стадия документа (например, «ТЗ»)
- «status» - статус документа
- «full_code» - полный код документа
- «short_code» - короткий код (тип) документа
- «code», «type» - синонимы «full_code» и «short_code» соответственно
- «folder» - название папки, в которой находится документ
- «pages» - количество страниц
- «attachments» - список приложений документа
Атрибуты приложений: - «kind» - тип приложения (document или file)
- «name» - название документа/файла
- «full_code» - полный код документа
- «short_code» - короткий код документа
- «code», «type» - синонимы «full_code» и «short_code»
- «pages» - количество страниц документа
Документы
Объект, содержащий все документы текущего проекта
Название - «documents»
Проход цикла
Объект, представляющий текущий проход цикла
Название - «loop»
Атрибуты:
- «index» - порядковый номер прохода
- «index0» - порядковый номер прохода, если считать с 0
- «length» - общее количество проходов цикла
- «first» - атрибут заполнен, если loop.index = 1
- «last» - атрибут заполнен, если loop.index = loop.length
Вспомогательные объекты
Вспомогательный объект внутри документа создается командой «set» и функцией «namespace»: после «set» указывается имя объекта, а в скобках после «namespace» — атрибуты и их значения через запятую:
{% set triangle = namespace(name = "Египетский треугольник", A = 3, B = 4, C = 5) %}
Длина гипотенузы: {{ triangle.C }}
Результат:
Длина гипотенузы: 5
В отличие от обычных переменных, изменения атрибутов такого объекта внутри цикла сохраняются и после него:
{% set n = namespace(counter=0) %} - создается объект "n" с атрибутом "counter" (значение атрибута - 0)
{% for cou in country %}
{% if cou.name | first == "А" %}
{% set n.counter = n.counter + 1 %} - значение атрибута "counter" увеличивается на один и сохраняется
{% endif %}
{% endfor %}
Кол-во стран, начинающихся на "А" - {{ n.counter }}
Результат:
Кол-во стран, начинающихся на «А» - 12
Фильтры над объектами
- «max» («min») - выбирает объект с наибольшим (наименьшим) значением атрибута. Атрибут для сравнения указывается после «attribute=». Чтобы вывести атрибут найденного объекта, выражение с фильтром берется в скобки:
country - тип объекта
max(attribute="land_area") - фильтр поиска объекта с наибольшим значением атрибута "land_area"
(country | max(attribute="land_area")) - объект типа "country" с наибольшим значением "land_area"
Название наибольшей страны: {{ (country | max(attribute="land_area")).name }}
Площадь наименьшей страны: {{ (country | min(attribute="land_area")).land_area }} кв. км
Результат:
Название наибольшей страны: Российская Федерация
Площадь наименьшей страны: 0,44 кв. км
Так можно создать переменную-объект для дальнейшего использования в документе:
{% set smallest_country = country | min(attribute="land_area") %}
{{ smallest_country.name }}
Результат:
Ватикан
- «map» - собирает значения выбранного атрибута
{{ country | map(attribute="name") | join(", ") }}
Результат:
Австралия, Австрия, ...
- «sort» - сортирует объекты по значениям выбранного атрибута (строки сортируются по алфавиту, а числа по возрастанию)
{% for cou in country | sort(attribute="land_area") %}
1. {{ cou.name }}
{% endfor %}
Результат:
- Ватикан
- Монако
...
Для формирования обратного порядка используется «reverse=true»:
{% for cou in country | sort(attribute="name", reverse=true) %}
1. {{ cou.name }}
{% endfor %}
Результат:
-
Япония
-
Ямайка
... -
«unique» - оставляет по одному объекту на каждое значение атрибута:
{% for cou in country | unique(attribute="government_type") %}
1. {{ cou.name }} - пример формы правления "{{ cou.government_type }}"
{% endfor %}
Результат:
-
Австралия - пример формы правления «Монархия»
-
Австрия - пример формы правления «Республика»
-
«selectattr»(«rejectattr») - обрабатывает только объекты, выбранный атрибут которых (не) соответствует условию
{% for obj in object_type | selectattr(attribute_condition) %}
(Содержание)
{% endfor %}
Эквивалентно
{% for obj in object_type %}
{% if attribute_condition %}
(Содержание)
{% endif %}
{% endfor %}
{% for obj in object_type | rejectattr(attribute_condition) %}
(Содержание)
{% endfor %}
Эквивалентно
{% for obj in object_type %}
{% if attribute_condition %}
{% else %}
(Содержание)
{% endif %}
{% endfor %}
Условие сравнения в этих фильтрах записывается иначе: атрибут, знак сравнения и значение указываются в кавычках через запятую (числовое значение — без кавычек):
{% if attribute == value %} эквивалентно | selectattr("attribute", "equalto", "value")
Сравнивающие знаки заменяются на команды:
| Знак в условии | Команда для фильтра |
|---|---|
| == | equalto |
| != | ne |
| > | gt |
| < | lt |
| >= | ge |
| <= | le |
- «groupby» - создает группы объектов с одинаковым значением выбранного атрибута (при этом группы сортируются по значению группирующего атрибута)
{% for group in country | groupby("continent") %} - формируются группы по значению атрибута "continent"; запускается цикл по этим группам
Континент: {{ group.grouper }} - атрибут группы "grouper" эквивалентен группирующему атрибуту (в данном случае "continent")
{% for cou in group.list %} - запускается цикл по объектам внутри текущей группы
1. {{ cou.name }}
{% endfor %}
{% endfor %}
Результат:
Континент: Азия
- Азербайджан
- Армения
...
Континент: Европа - Австрия
...
Создание списка объектов
Фильтры «map», «sort», «unique», «selectattr» и «rejectattr» возвращают не настоящий список. Чтобы получить список, добавьте фильтр «list»:
{{ country | map(attribute="name") | list | as_bullet_list }}
Результат:
- Австралия
- Австрия
...
{% set countries_by_size = country | sort(attribute="land_area", reverse=true) | list %}
{{ countries_by_size[1].name }}
Результат:
Канада