mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-09 09:58:20 -05:00
Add "all" property to results
This commit is contained in:
parent
c59420581c
commit
f124e2a889
@ -2,4 +2,6 @@ export interface Results<T> {
|
|||||||
count: number
|
count: number
|
||||||
|
|
||||||
results: T[]
|
results: T[]
|
||||||
|
|
||||||
|
all: number[]
|
||||||
}
|
}
|
||||||
|
@ -230,21 +230,14 @@ export class DocumentListViewService {
|
|||||||
activeListViewState.documents = result.results
|
activeListViewState.documents = result.results
|
||||||
|
|
||||||
this.documentService
|
this.documentService
|
||||||
.listAllFilteredIds(activeListViewState.filterRules)
|
.getSelectionData(result.all)
|
||||||
.pipe(first())
|
.pipe(first())
|
||||||
.subscribe({
|
.subscribe({
|
||||||
next: (ids: number[]) => {
|
next: (selectionData) => {
|
||||||
this.documentService
|
this.selectionData = selectionData
|
||||||
.getSelectionData(ids)
|
},
|
||||||
.pipe(first())
|
error: () => {
|
||||||
.subscribe({
|
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"]
|
results = response.data["results"]
|
||||||
self.assertEqual(response.data["count"], 3)
|
self.assertEqual(response.data["count"], 3)
|
||||||
self.assertEqual(len(results), 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")
|
response = self.client.get("/api/documents/?query=september")
|
||||||
results = response.data["results"]
|
results = response.data["results"]
|
||||||
self.assertEqual(response.data["count"], 1)
|
self.assertEqual(response.data["count"], 1)
|
||||||
self.assertEqual(len(results), 1)
|
self.assertEqual(len(results), 1)
|
||||||
|
self.assertCountEqual(response.data["all"], [d3.id])
|
||||||
|
|
||||||
response = self.client.get("/api/documents/?query=statement")
|
response = self.client.get("/api/documents/?query=statement")
|
||||||
results = response.data["results"]
|
results = response.data["results"]
|
||||||
self.assertEqual(response.data["count"], 2)
|
self.assertEqual(response.data["count"], 2)
|
||||||
self.assertEqual(len(results), 2)
|
self.assertEqual(len(results), 2)
|
||||||
|
self.assertCountEqual(response.data["all"], [d2.id, d3.id])
|
||||||
|
|
||||||
response = self.client.get("/api/documents/?query=sfegdfg")
|
response = self.client.get("/api/documents/?query=sfegdfg")
|
||||||
results = response.data["results"]
|
results = response.data["results"]
|
||||||
self.assertEqual(response.data["count"], 0)
|
self.assertEqual(response.data["count"], 0)
|
||||||
self.assertEqual(len(results), 0)
|
self.assertEqual(len(results), 0)
|
||||||
|
self.assertCountEqual(response.data["all"], [])
|
||||||
|
|
||||||
def test_search_multi_page(self):
|
def test_search_multi_page(self):
|
||||||
with AsyncWriter(index.open_index()) as writer:
|
with AsyncWriter(index.open_index()) as writer:
|
||||||
@ -1230,6 +1234,31 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
|
|||||||
[d1.id, d3.id, d2.id],
|
[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):
|
def test_statistics(self):
|
||||||
doc1 = Document.objects.create(
|
doc1 = Document.objects.create(
|
||||||
title="none1",
|
title="none1",
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
from django.contrib.auth.models import User
|
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.filters import OrderingFilter
|
||||||
from rest_framework.pagination import PageNumberPagination
|
from rest_framework.pagination import PageNumberPagination
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
from rest_framework.response import Response
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
|
|
||||||
from documents.permissions import PaperlessObjectPermissions
|
from documents.permissions import PaperlessObjectPermissions
|
||||||
@ -23,6 +25,47 @@ class StandardPagination(PageNumberPagination):
|
|||||||
page_size_query_param = "page_size"
|
page_size_query_param = "page_size"
|
||||||
max_page_size = 100000
|
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):
|
class FaviconView(View):
|
||||||
def get(self, request, *args, **kwargs): # pragma: nocover
|
def get(self, request, *args, **kwargs): # pragma: nocover
|
||||||
|
Loading…
x
Reference in New Issue
Block a user