Пользовательские вкладки, поля и фильтры в карточке

См.также

Для создания пользовательских полей в базе данных векторов признаков см. Пользовательские метаданные в Tarantool.

Для добавления пользовательских вкладок и полей в карточки людей и транспортных средств выполните следующие действия:

  1. Подготовьте список пользовательских вкладок и полей для добавления в карточки.

  2. Откройте файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    
  3. Настройте карточки людей. Для этого раскомментируйте секцию FFSECURITYCUSTOM_FIELDShuman_card и измените ее примерное содержимое с учетом следующих правил:

    • 'items': список полей в карточке. Опишите каждое поле следующими параметрами:

      • 'name': внутреннее имя поля, string.

      • default: значение по умолчанию. Если значение по умолчанию больше 1e14 1, то его следует записывать в виде строки, т. е. “123123..” вместо 123123...

      • 'label': название поля в веб-интерфейсе (в карточке), string.

      • 'tab': вкладка, на которой располагается поле. Преднастраивается отдельно.

      • 'display': формат отображения (form или list). Может содержать в себе string или array:

        • list - отображать в списке карточек (строчный вид).

        • form - отображать в форме редактирования.

      • 'description': описание поля, string.

      • 'editable': редактируемость поля, boolean.

      • 'type': тип данных поля, string. Возможные значения:

        • list: принимает itemsData, ожидая список значений или список словарей со значениями. Пример: ['value1', 'value2', 'value3'] или [{id:'1', label: 'value1'}, {'id': '2', 'label': 'value2'}].

        • datetime: примитивный тип данных, отображаемый как список datetime.

        • date: примитивный тип данных, отображаемый как выбор даты.

        • boolean: примитивный тип данных, отображаемый как флажок.

        • string: примитивный тип данных string.

        • multiple: возможность выбора нескольких элементов в списке, boolean.

    • 'filters': список фильтров для поиска по пользовательским полям. Параметры:

      • 'name': внутреннее имя фильтра,

      • 'label': название фильтра в веб-интерфейсе,

      • 'field': связанное поле в формате [имя поля].

    • 'tabs': список полей в карточке.

    Общий пример со всеми вариантами метаполей:

    # -- Custom model fields --
    # Edit CUSTOM_FIELDS -> `human_card` section to customize human card fields.
    # Edit CUSTOM_FIELDS -> `car_card` section to customize car card fields.
    ...
    # Below is an example with every field type possible.
    
    'CUSTOM_FIELDS': {
        'human_card': {
            'tabs': [{'name': 'new_tab_1', 'label': 'NewTab_1'}],
            'options': {
                'list': {
                    'name': True
                }
            },
            'items': [
                {
                    'name': 'string_ed',
                    'default': '',
                    'label': 'String_Editable',
                    'display': ['list', 'form'],
                    'description': 'String_editable',
                    'editable': True
                },
                {
                    'name': 'string_display_form',
                    'default': 'Only_Form',
                    'label': 'String_Display_Only_form',
                    'display': 'form',
                    'description': 'String_display_form',
                    'editable': False
                },
                {
                    'name': 'string_another_tab',
                    'default': '',
                    'label': 'String_Another_Tab',
                    'display': ['list', 'form'],
                    'tab': 'new_tab_1',
                    'description': 'String_editable_another_tab'
                },
                {
                    'name': 'string_ned',
                    'default': '2.3',
                    'label': 'String_Not_Editable',
                    'display': ['list', 'form'],
                    'description': 'String_not_editable',
                    'editable': False
                },
                {
                    'name': 'date',
                    'default': '',
                    'label': 'Date',
                    'display': 'form',
                    'description': 'Date_field',
                    'type': 'date',
                    'editable': True
                },
                {
                    'name': 'datetime',
                    'default': '',
                    'label': 'Datetime',
                    'display': 'form',
                    'description': 'Datetime_field',
                    'type': 'datetime',
                    'editable': True
                },
                {
                    'name': 'list_dict',
                    'default': '',
                    'label': 'List_Dict_display',
                    'display': ['form', 'list'],
                    'description': 'list_dict',
                    'type': 'list',
                    'multiple': False,
                    'itemsData': [
                        {'id': 'id1_text', 'label': 'label1_text'},
                        {'id': 'id2_text', 'label': 'label2_text'}
                    ]
                },
                {
                    'name': 'list',
                    'default': '',
                    'label': 'List_Values',
                    'display': 'form',
                    'description': 'List_Values',
                    'type': 'list',
                    'multiple': False,
                    'itemsData': ['value1', 'value2', 'value3']
                },
                {
                    'name': 'list_mult',
                    'default': '',
                    'label': 'list_Multiple',
                    'display': 'form',
                    'description': 'List_Multiple',
                    'type': 'valuelist',
                    'multiple': True,
                    'itemsData': ['value1', 'value2', 'value3']
                },
                {
                    'name': 'checkbox',
                    'default': '',
                    'label': 'Checkbox',
                    'display': 'form',
                    'description': 'Checkbox',
                    'type': 'boolean'
                }
            ],
            'filters': [
                {
                    'name': 'filter_contains',
                    'label': 'Filter_Icontains',
                    'field': 'string_ed__icontains'
                },
                {
                    'name': 'filter_exact_match',
                    'label': 'Filter_Exact_match',
                    'field': 'string_ed'
                },
                {
                    'name': 'filter_values',
                    'label': 'ValuesList_filter',
                    'field': 'list',
                    'type': 'valuelist',
                    'itemsData': ['value1', 'value2', 'value3']
                },
                {
                    'name': 'filter_values_multiple',
                    'label': 'ValuesList_filter_Multiple',
                    'field': 'list_mult',
                    'type': 'valuelist',
                    'multiple': True,
                    'itemsData': ['value1', 'value2', 'value3']
                }
            ]
        },
        'car_card': {}  # same fields are available
    },
    'camera_meta': {
        'items': [
            {
                'name': 'camera_id',
                'default': None,
                'label': 'Camera id',
                'display': ['list', 'form'],
                'description': 'Camera id in custom system'
            }
        ],
        'filters': [
            {
                'name': 'camera_id_filter',
                'label': 'Camera id filter',
                'field': 'camera_id'
            }
        ]
    },
    'face_object': {
        'items': [
            {
                'field_name': 'tag_name_1',
                'type': 'string',
                'default': 'change_me'
            },
            {
                'field_name': 'tag_name_2',
                'type': 'uint',
                'default': 123
            },
            {
                'field_name': 'tag_name_3',
                'type': 'bool',
                'default': True
            }
        ]
    }
    

    Важно

    Редактируемость пользовательского поля также зависит от прав доступа роли пользователя. Прежде чем сделать пользовательское поле редактируемым, указав 'editable': True в файле конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py, убедитесь, что у роли пользователя включены следующие права доступа:

    • humancard (или carcard) → Просмотр, Изменить

    • связанный список наблюдения → Изменить

    При отключении данных прав все поля карточек, стандартные и пользовательские, останутся недоступными для редактирования. Подробнее читайте в разделе Управление ролями и пользователями.

    Пример: Настройка вкладок (tabs).

    'CUSTOM_FIELDS': {
        'human_card': {
            'options': {
                'list': {
                    'name': True
                }
             'tabs': [ {'name': 'new_tab_1', label: 'NewTab_1' }
            },
            'items': [......]
    

    Пример: Добавить пользовательское поле gender с предопределенным списком значений (male и female) и включить фильтрацию по нему.

    FFSECURITY = {
            'CUSTOM_FIELDS': {
                'human_card': {
                    'items': [
                        { # Select only one of the suggested options from the drop-down menu. You cannot add new options using the user int>
                            'type': 'valuelist',
                            'name': 'gender',
                            'label': 'gender',  # for ui
                            'default': '',
                            'display': ['list', 'form'],
                            'multiple': False,
                            'itemsData': ['male', 'female'],
                        }
                    ],
                    'filters': [
                        {
                            'name': 'gender-filter',
                            'label': 'Card gender filter',  # for ui
                            'field': 'gender',
                            'type': 'valuelist',
                            'itemsData': ['male', 'female']
                        }
                    ]
                },
                'car_card': {} # same fields structure
            }
    }
    
  4. Настройте карточки транспортных средств. Для этого продублируйте содержимое секции human_card в секцию car_card и измените его по аналогии.

  5. Выполните перезапуск контейнеров FindFace Multi.

    cd /opt/findface-multi/
    
    sudo docker-compose restart
    

    Вы увидите, что в карточках появилось новое содержимое.