Esempio n. 1
0
def search_tags(
    search_query: str = "",
    search_options: dict = {},
    only_namespace: bool = False,
    only_tag: bool = False,
    sort_by: enums.ItemSort = None,
    sort_desc: bool = False,
    limit: int = 100,
    offset: int = None,
):
    """
    Search for tags

    Args:
        search_query: search string
        search_options: options to apply when filtering, see :ref:`Settings` for available search options
        only_namespace: only search for matching namespace <not implemented yet>
        only_tag: only search for matching tag <not implemented yet>
        sort_by: either a :py:class:`.ItemSort` or a sort index
        sort_desc: order descending (default is ascending)
        limit: limit the amount of items returned
        offset: offset the results by n items

    Returns:
        .. code-block:: guess

            {
                namespace : [ tag message object, ...],
                ...
            }
    """
    if search_options:
        search_option_names = [
            x.name for x in search_cmd._get_search_options()
        ]
        for n in search_options:
            if n not in search_option_names:
                raise exceptions.APIError(
                    utils.this_function(),
                    "Invalid search option name '{}'".format(n))

    db_model = db.NamespaceTags
    model_ids = search_cmd.ModelFilter().run(db_model, search_query,
                                             search_options)

    order_exp, group_exp, join_exp = helpers._sort_helper(
        sort_by, sort_desc, db_model)

    items = database_cmd.GetModelItems().run(db_model,
                                             model_ids,
                                             limit=limit,
                                             offset=offset,
                                             join=join_exp,
                                             order_by=order_exp,
                                             group_by=group_exp)

    msg = _contruct_tags_msg(items)

    return message.Identity('tags', msg)
Esempio n. 2
0
def library_view(item_type: enums.ItemType = enums.ItemType.Gallery,
                 item_id: int = None,
                 related_type: enums.ItemType = None,
                 page: int = 0,
                 limit: int = 100,
                 sort_by: enums.ItemSort = None,
                 sort_desc: bool=False,
                 search_query: str = "",
                 search_options: dict = {},
                 filter_id: int = None,
                 view_filter: enums.ViewType = enums.ViewType.Library):
    """
    Fetch items from the database.
    Provides pagination.

    Args:
        item_type: possible items are :py:attr:`.ItemType.Gallery`, :py:attr:`.ItemType.Collection`, :py:attr:`.ItemType.Grouping`
        page: current page (zero-indexed)
        sort_by: either a :py:class:`.ItemSort` or a sort index
        sort_desc: order descending (default is ascending)
        limit: amount of items per page
        search_query: filter item by search terms
        search_options: options to apply when filtering, see :ref:`Settings` for available search options
        filter_id: current :py:attr:`.ItemType.GalleryFilter` item id
        view_filter: type of view, set ``None`` to not apply any filter
        related_type: child item
        item_id: id of parent item

    Returns:
        .. code-block:: guess

            [
                item message object,
                ...
            ]

    .. seealso::

        :func:`.get_sort_indexes`
    """
    view_filter, item_type, db_msg, db_model, model_ids, filter_op, join_exp, metatag_name = _view_helper(
        item_type, search_query, filter_id, view_filter, item_id, related_type, search_options)

    items = message.List(db_model.__name__.lower(), db_msg)

    order_exp, group_exp, sort_joins = helpers._sort_helper(sort_by, sort_desc, db_model)

    if sort_joins:
        join_exp.extend(sort_joins)
        # need unique but ordered results, cannot use set so we make use with this
        join_exp = tuple(OrderedDict([(x, None) for x in join_exp]).keys())

    [items.append(db_msg(x)) for x in database_cmd.GetModelItems().run(
        db_model, model_ids, limit=limit, offset=page * limit,
        filter=filter_op, join=join_exp, order_by=order_exp, group_by=group_exp)]

    return items
Esempio n. 3
0
def search_item(
    item_type: enums.ItemType = enums.ItemType.Gallery,
    search_query: str = "",
    search_options: dict = {},
    sort_by: enums.ItemSort = None,
    sort_desc: bool = False,
    full_search: bool = True,
    limit: int = 100,
    offset: int = None,
):
    """
    Search for item

    Args:
        item_type: all of :py:attr:`.ItemType` except :py:attr:`.ItemType.Page` and :py:attr:`.ItemType.GalleryFilter`
        search_query: filter item by search terms
        search_options: options to apply when filtering, see :ref:`Settings` for available search options
        sort_by: either a :py:class:`.ItemSort` or a sort index
        sort_desc: order descending (default is ascending)
        limit: amount of items
        offset: offset the results by n items

    Returns:
        .. code-block:: guess

            [
                item message object,
                ...
            ]

    .. seealso::

        :func:`.get_sort_indexes`
    """
    item_type = enums.ItemType.get(item_type)

    if search_options:
        search_option_names = [
            x.name for x in search_cmd._get_search_options()
        ]
        for n in search_options:
            if n not in search_option_names:
                raise exceptions.APIError(
                    utils.this_function(),
                    "Invalid search option name '{}'".format(n))

    if item_type in (enums.ItemType.Page, enums.ItemType.GalleryFilter):
        raise exceptions.APIError(utils.this_function(),
                                  "Unsupported itemtype {}".format(item_type))
    db_msg, db_model = item_type._msg_and_model()

    model_ids = set()
    if full_search:
        model_ids = search_cmd.ModelFilter().run(db_model, search_query,
                                                 search_options)

    items = message.List("items", db_msg)

    order_exp, group_exp, join_exp = helpers._sort_helper(
        sort_by, sort_desc, db_model)

    [
        items.append(db_msg(x))
        for x in database_cmd.GetModelItems().run(db_model,
                                                  model_ids,
                                                  limit=limit,
                                                  offset=offset,
                                                  join=join_exp,
                                                  order_by=order_exp,
                                                  group_by=group_exp)
    ]

    return items