]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: support multiple inbox tags from stats widget (#7281)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Mon, 22 Jul 2024 17:07:51 +0000 (10:07 -0700)
committerGitHub <noreply@github.com>
Mon, 22 Jul 2024 17:07:51 +0000 (10:07 -0700)
src-ui/e2e/dashboard/dashboard.spec.ts
src-ui/e2e/dashboard/requests/api-dashboard1.har
src-ui/e2e/dashboard/requests/api-dashboard2.har
src-ui/e2e/dashboard/requests/api-dashboard3.har
src-ui/e2e/dashboard/requests/api-dashboard4.har
src-ui/src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.spec.ts
src-ui/src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts
src/documents/tests/test_api_documents.py
src/documents/views.py

index 6a06eaceeb9d61f069a957b3babfab42e6dda897..7d397c459031fe8f27a9f0b4c2e12efaaef392a1 100644 (file)
@@ -9,7 +9,7 @@ test('dashboard inbox link', async ({ page }) => {
   await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' })
   await page.goto('/dashboard')
   await page.getByRole('link', { name: 'Documents in inbox' }).click()
-  await expect(page).toHaveURL(/tags__id__all=9/)
+  await expect(page).toHaveURL(/tags__id__in=9/)
   await expect(page.locator('pngx-document-list')).toHaveText(/8 documents/)
 })
 
index 9758236d14f6d18facec68b63e678f089cb84137..a9c2380f245f068b5bbbcc17ba7023cc7c954dff 100644 (file)
           "content": {
             "size": -1,
             "mimeType": "application/json",
-            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tag\":9,\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
+            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tags\":[9],\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
           },
           "headersSize": -1,
           "bodySize": -1,
         "time": 0.609,
         "request": {
           "method": "GET",
-          "url": "http://localhost:8000/api/documents/?page=1&page_size=10&ordering=-created&truncate_content=true&tags__id__all=9",
+          "url": "http://localhost:8000/api/documents/?page=1&page_size=10&ordering=-created&truncate_content=true&tags__id__in=9",
           "httpVersion": "HTTP/1.1",
           "cookies": [],
           "headers": [
               "value": "true"
             },
             {
-              "name": "tags__id__all",
+              "name": "tags__id__in",
               "value": "9"
             }
           ],
         "time": 0.951,
         "request": {
           "method": "GET",
-          "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9",
+          "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=9",
           "httpVersion": "HTTP/1.1",
           "cookies": [],
           "headers": [
               "value": "true"
             },
             {
-              "name": "tags__id__all",
+              "name": "tags__id__in",
               "value": "9"
             }
           ],
index 952387f5648ec7cc15d282806e392878388bd7f3..eac0bb6eec8931865bc02f8b9bad71325f73e6c4 100644 (file)
           "content": {
             "size": -1,
             "mimeType": "application/json",
-            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tag\":9,\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
+            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tags\":[9],\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
           },
           "headersSize": -1,
           "bodySize": -1,
         "time": 0.622,
         "request": {
           "method": "GET",
-          "url": "http://localhost:8000/api/documents/?page=1&page_size=10&ordering=-created&truncate_content=true&tags__id__all=9",
+          "url": "http://localhost:8000/api/documents/?page=1&page_size=10&ordering=-created&truncate_content=true&tags__id__in=9",
           "httpVersion": "HTTP/1.1",
           "cookies": [],
           "headers": [
               "value": "true"
             },
             {
-              "name": "tags__id__all",
+              "name": "tags__id__in",
               "value": "9"
             }
           ],
index 4fc9d62d67e3fd84b93b5264fd117aaf99d2f4d4..cb1ce67b9f9539ca0fdd482f8df557196accfe85 100644 (file)
           "content": {
             "size": -1,
             "mimeType": "application/json",
-            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tag\":9,\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
+            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tags\":[9],\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
           },
           "headersSize": -1,
           "bodySize": -1,
index ecd539fdd515c4f3b624e2249125dd6ed013ff3f..3353ea45934d6a3413aba2800c086978614cc281 100644 (file)
           "content": {
             "size": -1,
             "mimeType": "application/json",
-            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tag\":9,\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
+            "text": "{\"documents_total\":61,\"documents_inbox\":8,\"inbox_tags\":[9],\"document_file_type_counts\":[{\"mime_type\":\"application/pdf\",\"mime_type_count\":57},{\"mime_type\":\"text/plain\",\"mime_type_count\":3},{\"mime_type\":\"text/csv\",\"mime_type_count\":1}],\"character_count\":2407053}"
           },
           "headersSize": -1,
           "bodySize": -1,
index 95d1a226517d86a80c2dc0988b803174e1315486..93a8c1e0f0c8ceb65ed0adf3153196fb9d919833 100644 (file)
@@ -75,7 +75,7 @@ describe('StatisticsWidgetComponent', () => {
     const mockStats = {
       documents_total: 200,
       documents_inbox: 18,
-      inbox_tag: 10,
+      inbox_tags: [10],
     }
 
     const req = httpTestingController.expectOne(
@@ -100,7 +100,7 @@ describe('StatisticsWidgetComponent', () => {
     const mockStats = {
       documents_total: 200,
       documents_inbox: 18,
-      inbox_tag: 10,
+      inbox_tags: [10],
       document_file_type_counts: [
         {
           mime_type: 'application/pdf',
index e52a9b69c7b435784c2dabc9384824d1a2d9a81f..1e309aa1afc31be068702016464ad07e7825fbab 100644 (file)
@@ -1,7 +1,7 @@
 import { HttpClient } from '@angular/common/http'
 import { Component, OnDestroy, OnInit } from '@angular/core'
 import { Observable, Subscription } from 'rxjs'
-import { FILTER_HAS_TAGS_ALL } from 'src/app/data/filter-rule-type'
+import { FILTER_HAS_TAGS_ANY } from 'src/app/data/filter-rule-type'
 import { ConsumerStatusService } from 'src/app/services/consumer-status.service'
 import { DocumentListViewService } from 'src/app/services/document-list-view.service'
 import { environment } from 'src/environments/environment'
@@ -11,7 +11,7 @@ import { ComponentWithPermissions } from 'src/app/components/with-permissions/wi
 export interface Statistics {
   documents_total?: number
   documents_inbox?: number
-  inbox_tag?: number
+  inbox_tags?: number[]
   document_file_type_counts?: DocumentFileType[]
   character_count?: number
   tag_count?: number
@@ -110,8 +110,10 @@ export class StatisticsWidgetComponent
   goToInbox() {
     this.documentListViewService.quickFilter([
       {
-        rule_type: FILTER_HAS_TAGS_ALL,
-        value: this.statistics.inbox_tag.toString(),
+        rule_type: FILTER_HAS_TAGS_ANY,
+        value: this.statistics.inbox_tags
+          .map((tagID) => tagID.toString())
+          .join(','),
       },
     ])
   }
index 5a8169d1d1034b96145bdd4cd6eaf11fdd922138..ee2e8ee1ee6d4353f902f71c5f50bdcd28a7189e 100644 (file)
@@ -954,7 +954,7 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.assertEqual(response.data["documents_total"], 3)
         self.assertEqual(response.data["documents_inbox"], 1)
-        self.assertEqual(response.data["inbox_tag"], tag_inbox.pk)
+        self.assertEqual(response.data["inbox_tags"], [tag_inbox.pk])
         self.assertEqual(
             response.data["document_file_type_counts"][0]["mime_type_count"],
             2,
@@ -975,7 +975,7 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
         response = self.client.get("/api/statistics/")
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.assertEqual(response.data["documents_inbox"], None)
-        self.assertEqual(response.data["inbox_tag"], None)
+        self.assertEqual(response.data["inbox_tags"], None)
 
     def test_statistics_multiple_users(self):
         """
index 575b1666b3f21e44138ff33993826c0ffa3a148e..df54546e198986061d2edaa25f4f5267560d6910 100644 (file)
@@ -1418,13 +1418,11 @@ class StatisticsView(APIView):
 
         documents_total = documents.count()
 
-        inbox_tag = tags.filter(is_inbox_tag=True)
+        inbox_tags = tags.filter(is_inbox_tag=True)
 
         documents_inbox = (
-            documents.filter(tags__is_inbox_tag=True, tags__id__in=tags)
-            .distinct()
-            .count()
-            if inbox_tag.exists()
+            documents.filter(tags__id__in=inbox_tags).distinct().count()
+            if inbox_tags.exists()
             else None
         )
 
@@ -1454,7 +1452,12 @@ class StatisticsView(APIView):
             {
                 "documents_total": documents_total,
                 "documents_inbox": documents_inbox,
-                "inbox_tag": inbox_tag.first().pk if inbox_tag.exists() else None,
+                "inbox_tag": inbox_tags.first().pk
+                if inbox_tags.exists()
+                else None,  # backwards compatibility
+                "inbox_tags": [tag.pk for tag in inbox_tags]
+                if inbox_tags.exists()
+                else None,
                 "document_file_type_counts": document_file_type_counts,
                 "character_count": character_count,
                 "tag_count": len(tags),