Commit 2281d461 authored by Mickaël Desfrênes's avatar Mickaël Desfrênes
Browse files

limit resources by tag

parent 434d3f85
Loading
Loading
Loading
Loading
+23 −27
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ from resources.models import (
)
from django.contrib.auth.models import User
from django.db.models import QuerySet
from typing import List, Dict, Iterator, Union
from typing import List, Dict, Iterator, Union, Tuple
from rpc import serializers
from jama import settings
import os
@@ -40,6 +40,17 @@ class ServiceException(Exception):
    pass


def _validate_limits(limit_from: int, limit_to: int) -> Tuple[int, int]:
    try:
        limit_from = int(limit_from)
        limit_to = int(limit_to)
        if limit_to < limit_from:
            raise ServiceException(WRONG_ARGUMENT)
    except ValueError:
        raise ServiceException(WRONG_ARGUMENT)
    return limit_from, limit_to


def _require_superuser(func):
    """
    (Decorator)
@@ -305,13 +316,7 @@ def collections(
        only_published = True
        if not parent.public_access and parent_id:
            raise ServiceException(CAN_ONLY_SHOW_PUBLIC_COLLECTIONS_CONTENT)
    try:
        limit_from = int(limit_from)
        limit_to = int(limit_to)
        if limit_to < limit_from:
            raise ServiceException(WRONG_ARGUMENT)
    except ValueError:
        raise ServiceException(WRONG_ARGUMENT)
    limit_from, limit_to = _validate_limits(limit_from, limit_to)
    data = []
    if flat_list:
        query_set: Union[Iterator[Collection], QuerySet] = Collection.objects.filter(
@@ -667,6 +672,7 @@ def resources(
    limit_to: int = 2000,
    order_by: str = "title",
    only_deleted_items: bool = False,
    only_tags: list = None,
) -> List[Dict]:
    """
    Get all resources from a collection.
@@ -721,16 +727,18 @@ def resources(
    except Collection.DoesNotExist:
        raise ServiceException(NO_SUCH_COLLECTION)
    data = []
    limit_from = int(limit_from)
    limit_to = int(limit_to)
    if limit_to < limit_from:
        return []
    limit_from, limit_to = _validate_limits(limit_from, limit_to)
    query_set: Union[Iterator[Resource], QuerySet] = Resource.objects.filter(
        collections__id=collection_id,
        deleted_at__isnull=not only_deleted_items,
        ptr_project__projectaccess__user=user,
        ptr_project__projectaccess__role__permissions__label=PERM_RESOURCE_READ,
    ).order_by(order_by)
    )

    if only_tags:
        query_set = query_set.filter(tags__uid__in=only_tags)

    query_set = query_set.order_by(order_by)

    for item in query_set[limit_from:limit_to]:
        data.append(serializers.resource(item, include_metas=bool(include_metas)))
@@ -894,13 +902,7 @@ def simple_search(
    }
    ```
    """
    try:
        limit_from = int(limit_from)
        limit_to = int(limit_to)
        if limit_to < limit_from:
            raise ServiceException(WRONG_ARGUMENT)
    except ValueError:
        raise ServiceException(WRONG_ARGUMENT)
    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)
    _check_project_permission(user, project, PERM_RESOURCE_READ)
@@ -986,13 +988,7 @@ def advanced_search(
    }
    ```
    """
    try:
        limit_from = int(limit_from)
        limit_to = int(limit_to)
        if limit_to < limit_from:
            raise ServiceException(WRONG_ARGUMENT)
    except ValueError:
        raise ServiceException(WRONG_ARGUMENT)
    limit_from, limit_to = _validate_limits(limit_from, limit_to)
    if len(search_terms) > SEARCH_TERMS_LIMIT:
        raise ServiceException(TOO_MANY_SEARCH_TERMS)
    project = Project.objects.filter(pk=project_id).first()