Source code for tenable.tenableone.tags.api

"""
Tags
=====

The following methods allow for interaction with the Tenable One
Tags APIs.

Methods available on ``TenableOne.tags``:

.. rst-class:: hide-signature
.. autoclass:: TagsAPI
    :members:
"""

from typing import Optional

from tenable.base.endpoint import APIEndpoint
from tenable.tenableone.inventory.schema import (
    Field,
    Properties,
    PropertyFilter,
    QueryMode,
    SortDirection,
)
from tenable.tenableone.tags.schema import Tags


[docs] class TagsAPI(APIEndpoint):
[docs] def list_properties(self) -> list[Field]: """ Retrieve tags properties Returns: The tags properties. Examples: >>> tenable_inventory_tags_properties = tenable_inventory.tags.list_properties() >>> for tag_property in tenable_inventory_tags_properties: ... pprint(tag_property) """ tag_properties_response: dict[str, list[dict]] = self._get( path='api/v1/t1/tags/properties' ) return Properties(**tag_properties_response).data
[docs] def list( self, query_text: Optional[str] = None, query_mode: Optional[QueryMode] = None, filters: Optional[list[PropertyFilter]] = None, extra_properties: Optional[list[str]] = None, offset: Optional[int] = None, limit: Optional[int] = None, sort_by: Optional[str] = None, sort_direction: Optional[SortDirection] = None, ) -> Tags: """ Retrieve tags Args: query_text (str, optional): The text to search for. query_mode (QueryMode, optional): The search mode. Defaults to QueryMode.SIMPLE. filters (list, optional): A list of filters to apply. Defaults to None. extra_properties (list, optional): Additional properties to include in the response. Defaults to None. offset (int, optional): Number of records to skip. Defaults to 0. limit (int, optional): Maximum number of records per page. Defaults to 1000. sort_by (str, optional): Field to sort by. sort_direction (SortDirection, optional): Sorting direction, either SortDirection.ASC or SortDirection.DESC. Returns: The request tags. Examples: >>> tags = tenable_inventory.tags.list() >>> for tag in tags: ... pprint(tag) """ # Build query parameters params = {} if extra_properties is not None: params['extra_properties'] = ','.join(extra_properties) if offset is not None: params['offset'] = offset if limit is not None: params['limit'] = limit if sort_by is not None and sort_direction is not None: params['sort'] = f"{sort_by}:{sort_direction.value}" # Build request body with flattened search/query params payload = {} if query_text is not None or query_mode is not None: payload['query'] = {} if query_text is not None: payload['query']['text'] = query_text if query_mode is not None: payload['query']['mode'] = query_mode.value if filters is not None: payload['filters'] = [filter.model_dump(mode='json') for filter in filters] tags_response: dict = self._post('api/v1/t1/tags/search', json=payload, params=params) return Tags(**tags_response)