Объекты в шаблонах

Объекты — элементы данных проекта с атрибутами. Объект может содержать другие объекты или сам входить в состав другого объекта.

Отображение атрибутов объекта

Атрибут объекта выводится через точку:

{{ 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 %}                   - завершает цикл по странам

Результат:
Страна: Австралия
Список регионов:

  1. Австралийская столичная территория
  2. Виктория
  3. Западная Австралия
  4. Квинсленд
  5. Новый Южный Уэльс
  6. Тасмания
  7. Южная Австралия

Страна: Австрия
Список регионов:
...

Встроенные объекты

В ГОСТ-ОН есть встроенные объекты: их нет в данных проекта, а набор атрибутов у них фиксированный.

Текущий документ

Объект, представляющий текущий документ
Название - «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

Фильтры над объектами

  1. «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 }}

Результат:
Ватикан

  1. «map» - собирает значения выбранного атрибута
{{ country | map(attribute="name") | join(", ") }}

Результат:
Австралия, Австрия, ...

  1. «sort» - сортирует объекты по значениям выбранного атрибута (строки сортируются по алфавиту, а числа по возрастанию)
{% for cou in country | sort(attribute="land_area") %}
1. {{ cou.name }}
{% endfor %}

Результат:

  1. Ватикан
  2. Монако
    ...

Для формирования обратного порядка используется «reverse=true»:

{% for cou in country | sort(attribute="name", reverse=true) %}
1. {{ cou.name }}
{% endfor %}

Результат:

  1. Япония

  2. Ямайка
    ...

  3. «unique» - оставляет по одному объекту на каждое значение атрибута:

{% for cou in country | unique(attribute="government_type") %}
1. {{ cou.name }} - пример формы правления "{{ cou.government_type }}"
{% endfor %}

Результат:

  1. Австралия - пример формы правления «Монархия»

  2. Австрия - пример формы правления «Республика»

  3. «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
  1. «groupby» - создает группы объектов с одинаковым значением выбранного атрибута (при этом группы сортируются по значению группирующего атрибута)
{% for group in country | groupby("continent") %} - формируются группы по значению атрибута "continent"; запускается цикл по этим группам
Континент: {{ group.grouper }} - атрибут группы "grouper" эквивалентен группирующему атрибуту (в данном случае "continent")
{% for cou in group.list %} - запускается цикл по объектам внутри текущей группы
1. {{ cou.name }}
{% endfor %}
{% endfor %}

Результат:
Континент: Азия

  1. Азербайджан
  2. Армения
    ...
    Континент: Европа
  3. Австрия
    ...

Создание списка объектов

Фильтры «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 }}

Результат:
Канада

Предыдущая