Commit 7c9345f3 authored by Mickaël Desfrênes's avatar Mickaël Desfrênes
Browse files

add order_by to search

parent c2669de3
Loading
Loading
Loading
Loading
+50 −5
Original line number Diff line number Diff line
@@ -863,7 +863,12 @@ def delete_resource(user: User, resource_id: int) -> bool:

@_rpc_groups(["Search"])
def simple_search(
    user: User, query: str, project_id: int, limit_from: int = 0, limit_to: int = 2000
    user: User,
    query: str,
    project_id: int,
    limit_from: int = 0,
    limit_to: int = 2000,
    order_by: str = "title",
) -> Dict[str, List]:
    """
    Performs a simple search on resources and collections, based on their titles.
@@ -902,6 +907,22 @@ def simple_search(
    }
    ```
    """
    available_order_by = [
        "title",
        "-title",
        "updated_at",
        "-updated_at",
        "created_at",
        "-created_at",
    ]
    try:
        assert order_by in available_order_by
    except AssertionError:
        raise ServiceException(
            WRONG_ARGUMENT
            + ": order_by must be one of {}".format(", ".join(available_order_by))
        )

    limit_from, limit_to = _validate_limits(limit_from, limit_to)
    project = Project.objects.filter(pk=project_id).first()
    _check_project_permission(user, project, PERM_COLLECTION_READ)
@@ -913,14 +934,18 @@ def simple_search(
    )
    if public_only:
        collections_set = collections_set.filter(public_access=True)
    for collection_instance in collections_set.distinct():
    for collection_instance in collections_set.distinct().order_by(order_by)[
        limit_from:limit_to
    ]:
        results["collections"].append(serializers.collection(collection_instance))
    resources_set: Union[Iterator[Resource], QuerySet] = Resource.objects.filter(
        title__icontains=query, deleted_at__isnull=True, ptr_project=project
    )
    if public_only:
        resources_set = resources_set.filter(collection__public_access=True)
    for resource_instance in resources_set.distinct()[limit_from:limit_to]:
    for resource_instance in resources_set.distinct().order_by(order_by)[
        limit_from:limit_to
    ]:
        results["resources"].append(
            serializers.resource(resource_instance, include_metas=False)
        )
@@ -955,6 +980,7 @@ def advanced_search(
    collection_id: int = None,
    limit_from: int = 0,
    limit_to: int = 2000,
    order_by: str = "title",
) -> Dict[str, List]:
    """
    Performs a complex search using terms such as 'contains', 'is', 'does_not_contain'.
@@ -993,6 +1019,21 @@ def advanced_search(
    }
    ```
    """
    available_order_by = [
        "title",
        "-title",
        "updated_at",
        "-updated_at",
        "created_at",
        "-created_at",
    ]
    try:
        assert order_by in available_order_by
    except AssertionError:
        raise ServiceException(
            WRONG_ARGUMENT
            + ": order_by must be one of {}".format(", ".join(available_order_by))
        )
    limit_from, limit_to = _validate_limits(limit_from, limit_to)
    if len(search_terms) > SEARCH_TERMS_LIMIT:
        raise ServiceException(TOO_MANY_SEARCH_TERMS)
@@ -1061,7 +1102,9 @@ def advanced_search(
            resources_set = resources_set.exclude(
                tags__uid__in=search_term["exclude_tags"]
            )
    for resource_instance in resources_set.distinct()[limit_from:limit_to]:
    for resource_instance in resources_set.distinct().order_by(order_by)[
        limit_from:limit_to
    ]:
        results["resources"].append(
            serializers.resource(resource_instance, include_metas=include_metas)
        )
@@ -1120,7 +1163,9 @@ def advanced_search(
            collections_set = collections_set.exclude(
                tags__uid__in=search_term["exclude_tags"]
            )
    for collection_instance in collections_set.distinct()[limit_from:limit_to]:
    for collection_instance in collections_set.distinct().order_by(order_by)[
        limit_from:limit_to
    ]:
        results["collections"].append(serializers.collection(collection_instance))

    return results
+1 −0
Original line number Diff line number Diff line
@@ -141,3 +141,4 @@ class ServiceTestCase(TestCase):
            limit_from=0,
            limit_to=2000,
        )
        methods.simple_search(self.public_user, "pouet", self.test_project.pk)