]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: Don't require the JSON user arguments field (#5320)
authorTrenton H <797416+stumpylog@users.noreply.github.com>
Mon, 8 Jan 2024 21:14:36 +0000 (13:14 -0800)
committerGitHub <noreply@github.com>
Mon, 8 Jan 2024 21:14:36 +0000 (13:14 -0800)
* Allows new user args field to be null

* Coerce empty string to None for user_args JSONField

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
src/documents/tests/test_api_app_config.py [new file with mode: 0644]
src/paperless/serialisers.py

diff --git a/src/documents/tests/test_api_app_config.py b/src/documents/tests/test_api_app_config.py
new file mode 100644 (file)
index 0000000..ed3a4b1
--- /dev/null
@@ -0,0 +1,100 @@
+import json
+
+from django.contrib.auth.models import User
+from rest_framework import status
+from rest_framework.test import APITestCase
+
+from documents.tests.utils import DirectoriesMixin
+from paperless.models import ApplicationConfiguration
+from paperless.models import ColorConvertChoices
+
+
+class TestApiAppConfig(DirectoriesMixin, APITestCase):
+    ENDPOINT = "/api/config/"
+
+    def setUp(self) -> None:
+        super().setUp()
+
+        user = User.objects.create_superuser(username="temp_admin")
+        self.client.force_authenticate(user=user)
+
+    def test_api_get_config(self):
+        """
+        GIVEN:
+            - API request to get app config
+        WHEN:
+            - API is called
+        THEN:
+            - Existing config
+        """
+        response = self.client.get(self.ENDPOINT, format="json")
+
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+        self.assertEqual(
+            json.dumps(response.data[0]),
+            json.dumps(
+                {
+                    "id": 1,
+                    "user_args": None,
+                    "output_type": None,
+                    "pages": None,
+                    "language": None,
+                    "mode": None,
+                    "skip_archive_file": None,
+                    "image_dpi": None,
+                    "unpaper_clean": None,
+                    "deskew": None,
+                    "rotate_pages": None,
+                    "rotate_pages_threshold": None,
+                    "max_image_pixels": None,
+                    "color_conversion_strategy": None,
+                },
+            ),
+        )
+
+    def test_api_update_config(self):
+        """
+        GIVEN:
+            - API request to update app config
+        WHEN:
+            - API is called
+        THEN:
+            - Correct HTTP response
+            - Config is updated
+        """
+        response = self.client.patch(
+            f"{self.ENDPOINT}1/",
+            json.dumps(
+                {
+                    "color_conversion_strategy": ColorConvertChoices.RGB,
+                },
+            ),
+            content_type="application/json",
+        )
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        config = ApplicationConfiguration.objects.first()
+        self.assertEqual(config.color_conversion_strategy, ColorConvertChoices.RGB)
+
+    def test_api_update_config_empty_json_field(self):
+        """
+        GIVEN:
+            - API request to update app config with empty string for user_args JSONField
+        WHEN:
+            - API is called
+        THEN:
+            - Correct HTTP response
+            - user_args is set to None
+        """
+        response = self.client.patch(
+            f"{self.ENDPOINT}1/",
+            json.dumps(
+                {
+                    "user_args": "",
+                },
+            ),
+            content_type="application/json",
+        )
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        config = ApplicationConfiguration.objects.first()
+        self.assertEqual(config.user_args, None)
index db7ca21f7a0d470bb53b72a4b925cd3778945da5..50407564b22390cb735a28c5b9248da061df537b 100644 (file)
@@ -122,7 +122,12 @@ class ProfileSerializer(serializers.ModelSerializer):
 
 
 class ApplicationConfigurationSerializer(serializers.ModelSerializer):
-    user_args = serializers.JSONField(binary=True)
+    user_args = serializers.JSONField(binary=True, allow_null=True)
+
+    def run_validation(self, data):
+        if "user_args" in data and data["user_args"] == "":
+            data["user_args"] = None
+        return super().run_validation(data)
 
     class Meta:
         model = ApplicationConfiguration