mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Add "all" property to results
This commit is contained in:
		@@ -2,4 +2,6 @@ export interface Results<T> {
 | 
			
		||||
  count: number
 | 
			
		||||
 | 
			
		||||
  results: T[]
 | 
			
		||||
 | 
			
		||||
  all: number[]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -230,21 +230,14 @@ export class DocumentListViewService {
 | 
			
		||||
          activeListViewState.documents = result.results
 | 
			
		||||
 | 
			
		||||
          this.documentService
 | 
			
		||||
            .listAllFilteredIds(activeListViewState.filterRules)
 | 
			
		||||
            .getSelectionData(result.all)
 | 
			
		||||
            .pipe(first())
 | 
			
		||||
            .subscribe({
 | 
			
		||||
              next: (ids: number[]) => {
 | 
			
		||||
                this.documentService
 | 
			
		||||
                  .getSelectionData(ids)
 | 
			
		||||
                  .pipe(first())
 | 
			
		||||
                  .subscribe({
 | 
			
		||||
                    next: (selectionData) => {
 | 
			
		||||
                      this.selectionData = selectionData
 | 
			
		||||
                    },
 | 
			
		||||
                    error: () => {
 | 
			
		||||
                      this.selectionData = null
 | 
			
		||||
                    },
 | 
			
		||||
                  })
 | 
			
		||||
              next: (selectionData) => {
 | 
			
		||||
                this.selectionData = selectionData
 | 
			
		||||
              },
 | 
			
		||||
              error: () => {
 | 
			
		||||
                this.selectionData = null
 | 
			
		||||
              },
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -499,21 +499,25 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
 | 
			
		||||
        results = response.data["results"]
 | 
			
		||||
        self.assertEqual(response.data["count"], 3)
 | 
			
		||||
        self.assertEqual(len(results), 3)
 | 
			
		||||
        self.assertCountEqual(response.data["all"], [d1.id, d2.id, d3.id])
 | 
			
		||||
 | 
			
		||||
        response = self.client.get("/api/documents/?query=september")
 | 
			
		||||
        results = response.data["results"]
 | 
			
		||||
        self.assertEqual(response.data["count"], 1)
 | 
			
		||||
        self.assertEqual(len(results), 1)
 | 
			
		||||
        self.assertCountEqual(response.data["all"], [d3.id])
 | 
			
		||||
 | 
			
		||||
        response = self.client.get("/api/documents/?query=statement")
 | 
			
		||||
        results = response.data["results"]
 | 
			
		||||
        self.assertEqual(response.data["count"], 2)
 | 
			
		||||
        self.assertEqual(len(results), 2)
 | 
			
		||||
        self.assertCountEqual(response.data["all"], [d2.id, d3.id])
 | 
			
		||||
 | 
			
		||||
        response = self.client.get("/api/documents/?query=sfegdfg")
 | 
			
		||||
        results = response.data["results"]
 | 
			
		||||
        self.assertEqual(response.data["count"], 0)
 | 
			
		||||
        self.assertEqual(len(results), 0)
 | 
			
		||||
        self.assertCountEqual(response.data["all"], [])
 | 
			
		||||
 | 
			
		||||
    def test_search_multi_page(self):
 | 
			
		||||
        with AsyncWriter(index.open_index()) as writer:
 | 
			
		||||
@@ -1230,6 +1234,31 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
 | 
			
		||||
            [d1.id, d3.id, d2.id],
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def test_pagination_all(self):
 | 
			
		||||
        """
 | 
			
		||||
        GIVEN:
 | 
			
		||||
            - A set of 50 documents
 | 
			
		||||
        WHEN:
 | 
			
		||||
            - API reuqest for document filtering
 | 
			
		||||
        THEN:
 | 
			
		||||
            - Results are paginated (25 items) and response["all"] returns all ids (50 items)
 | 
			
		||||
        """
 | 
			
		||||
        t = Tag.objects.create(name="tag")
 | 
			
		||||
        docs = []
 | 
			
		||||
        for i in range(50):
 | 
			
		||||
            d = Document.objects.create(checksum=i, content=f"test{i}")
 | 
			
		||||
            d.tags.add(t)
 | 
			
		||||
            docs.append(d)
 | 
			
		||||
 | 
			
		||||
        response = self.client.get(
 | 
			
		||||
            f"/api/documents/?tags__id__in={t.id}",
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(response.status_code, status.HTTP_200_OK)
 | 
			
		||||
        results = response.data["results"]
 | 
			
		||||
        self.assertEqual(len(results), 25)
 | 
			
		||||
        self.assertEqual(len(response.data["all"]), 50)
 | 
			
		||||
        self.assertCountEqual(response.data["all"], [d.id for d in docs])
 | 
			
		||||
 | 
			
		||||
    def test_statistics(self):
 | 
			
		||||
        doc1 = Document.objects.create(
 | 
			
		||||
            title="none1",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
import os
 | 
			
		||||
from collections import OrderedDict
 | 
			
		||||
 | 
			
		||||
from django.contrib.auth.models import Group
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
@@ -9,6 +10,7 @@ from django_filters.rest_framework import DjangoFilterBackend
 | 
			
		||||
from rest_framework.filters import OrderingFilter
 | 
			
		||||
from rest_framework.pagination import PageNumberPagination
 | 
			
		||||
from rest_framework.permissions import IsAuthenticated
 | 
			
		||||
from rest_framework.response import Response
 | 
			
		||||
from rest_framework.viewsets import ModelViewSet
 | 
			
		||||
 | 
			
		||||
from documents.permissions import PaperlessObjectPermissions
 | 
			
		||||
@@ -23,6 +25,47 @@ class StandardPagination(PageNumberPagination):
 | 
			
		||||
    page_size_query_param = "page_size"
 | 
			
		||||
    max_page_size = 100000
 | 
			
		||||
 | 
			
		||||
    def get_paginated_response(self, data):
 | 
			
		||||
        return Response(
 | 
			
		||||
            OrderedDict(
 | 
			
		||||
                [
 | 
			
		||||
                    ("count", self.page.paginator.count),
 | 
			
		||||
                    ("next", self.get_next_link()),
 | 
			
		||||
                    ("previous", self.get_previous_link()),
 | 
			
		||||
                    ("all", self.get_all_result_ids()),
 | 
			
		||||
                    ("results", data),
 | 
			
		||||
                ],
 | 
			
		||||
            ),
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def get_all_result_ids(self):
 | 
			
		||||
        ids = []
 | 
			
		||||
        if hasattr(self.page.paginator.object_list, "saved_results"):
 | 
			
		||||
            results_page = self.page.paginator.object_list.saved_results[0]
 | 
			
		||||
            if results_page is not None:
 | 
			
		||||
                for i in range(0, len(results_page.results.docs())):
 | 
			
		||||
                    try:
 | 
			
		||||
                        fields = results_page.results.fields(i)
 | 
			
		||||
                        if "id" in fields:
 | 
			
		||||
                            ids.append(fields["id"])
 | 
			
		||||
                    except Exception:
 | 
			
		||||
                        pass
 | 
			
		||||
        else:
 | 
			
		||||
            for obj in self.page.paginator.object_list:
 | 
			
		||||
                if hasattr(obj, "id"):
 | 
			
		||||
                    ids.append(obj.id)
 | 
			
		||||
                elif hasattr(obj, "fields"):
 | 
			
		||||
                    ids.append(obj.fields()["id"])
 | 
			
		||||
        return ids
 | 
			
		||||
 | 
			
		||||
    def get_paginated_response_schema(self, schema):
 | 
			
		||||
        response_schema = super().get_paginated_response_schema(schema)
 | 
			
		||||
        response_schema["properties"]["all"] = {
 | 
			
		||||
            "type": "array",
 | 
			
		||||
            "example": "[1, 2, 3]",
 | 
			
		||||
        }
 | 
			
		||||
        return response_schema
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FaviconView(View):
 | 
			
		||||
    def get(self, request, *args, **kwargs):  # pragma: nocover
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user