We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Configuration: User-Arguments are mandatory
### Description

See the following Screenshot. 

![image](https://github.com/paperless-ngx/paperless-ngx/assets/88422038/b2bc5f45-b45d-43c5-99f7-076ae4c6764d)

I don't think, user args should be mandatory, since the documentation says "additionally specify arguments".

### Steps to reproduce

1. Click on "Configuration"
2. Fill in some Values
3. Click "Save"
4. User-Args are mandatory

In order to save a Configuration, the user now has to enter an empty json which is not very user-friendly.

### Webserver logs

```bash
not applicable
```


### Browser logs

_No response_

### Paperless-ngx version

2.3.2

### Host OS

Synology DSM 6.2.X

### Installation method

Docker - official image

### Browser

Chrome

### Configuration changes

none of interest

### Other

_No response_

### Please confirm the following

- [X] I believe this issue is a bug that affects all users of Paperless-ngx, not something specific to my installation.
- [X] I have already searched for relevant existing issues and discussions before opening this report.
- [X] I have updated the title field above with a concise description.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/paperless/serialisers.py`
Content:
```
1 import logging
2 
3 from django.contrib.auth.models import Group
4 from django.contrib.auth.models import Permission
5 from django.contrib.auth.models import User
6 from rest_framework import serializers
7 
8 from paperless.models import ApplicationConfiguration
9 
10 logger = logging.getLogger("paperless.settings")
11 
12 
13 class ObfuscatedUserPasswordField(serializers.Field):
14     """
15     Sends *** string instead of password in the clear
16     """
17 
18     def to_representation(self, value):
19         return "**********" if len(value) > 0 else ""
20 
21     def to_internal_value(self, data):
22         return data
23 
24 
25 class UserSerializer(serializers.ModelSerializer):
26     password = ObfuscatedUserPasswordField(required=False)
27     user_permissions = serializers.SlugRelatedField(
28         many=True,
29         queryset=Permission.objects.all(),
30         slug_field="codename",
31         required=False,
32     )
33     inherited_permissions = serializers.SerializerMethodField()
34 
35     class Meta:
36         model = User
37         fields = (
38             "id",
39             "username",
40             "email",
41             "password",
42             "first_name",
43             "last_name",
44             "date_joined",
45             "is_staff",
46             "is_active",
47             "is_superuser",
48             "groups",
49             "user_permissions",
50             "inherited_permissions",
51         )
52 
53     def get_inherited_permissions(self, obj):
54         return obj.get_group_permissions()
55 
56     def update(self, instance, validated_data):
57         if "password" in validated_data:
58             if len(validated_data.get("password").replace("*", "")) > 0:
59                 instance.set_password(validated_data.get("password"))
60                 instance.save()
61             validated_data.pop("password")
62         super().update(instance, validated_data)
63         return instance
64 
65     def create(self, validated_data):
66         groups = None
67         if "groups" in validated_data:
68             groups = validated_data.pop("groups")
69         user_permissions = None
70         if "user_permissions" in validated_data:
71             user_permissions = validated_data.pop("user_permissions")
72         password = None
73         if (
74             "password" in validated_data
75             and len(validated_data.get("password").replace("*", "")) > 0
76         ):
77             password = validated_data.pop("password")
78         user = User.objects.create(**validated_data)
79         # set groups
80         if groups:
81             user.groups.set(groups)
82         # set permissions
83         if user_permissions:
84             user.user_permissions.set(user_permissions)
85         # set password
86         if password:
87             user.set_password(password)
88         user.save()
89         return user
90 
91 
92 class GroupSerializer(serializers.ModelSerializer):
93     permissions = serializers.SlugRelatedField(
94         many=True,
95         queryset=Permission.objects.all(),
96         slug_field="codename",
97     )
98 
99     class Meta:
100         model = Group
101         fields = (
102             "id",
103             "name",
104             "permissions",
105         )
106 
107 
108 class ProfileSerializer(serializers.ModelSerializer):
109     email = serializers.EmailField(allow_null=False)
110     password = ObfuscatedUserPasswordField(required=False, allow_null=False)
111     auth_token = serializers.SlugRelatedField(read_only=True, slug_field="key")
112 
113     class Meta:
114         model = User
115         fields = (
116             "email",
117             "password",
118             "first_name",
119             "last_name",
120             "auth_token",
121         )
122 
123 
124 class ApplicationConfigurationSerializer(serializers.ModelSerializer):
125     user_args = serializers.JSONField(binary=True)
126 
127     class Meta:
128         model = ApplicationConfiguration
129         fields = "__all__"
130
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py
--- a/src/paperless/serialisers.py
+++ b/src/paperless/serialisers.py
@@ -122,7 +122,12 @@
 
 
 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

{"golden_diff": "diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py\n--- a/src/paperless/serialisers.py\n+++ b/src/paperless/serialisers.py\n@@ -122,7 +122,12 @@\n \n \n class ApplicationConfigurationSerializer(serializers.ModelSerializer):\n-    user_args = serializers.JSONField(binary=True)\n+    user_args = serializers.JSONField(binary=True, allow_null=True)\n+\n+    def run_validation(self, data):\n+        if \"user_args\" in data and data[\"user_args\"] == \"\":\n+            data[\"user_args\"] = None\n+        return super().run_validation(data)\n \n     class Meta:\n         model = ApplicationConfiguration\n", "issue": "Configuration: User-Arguments are mandatory\n### Description\r\n\r\nSee the following Screenshot. \r\n\r\n![image](https://github.com/paperless-ngx/paperless-ngx/assets/88422038/b2bc5f45-b45d-43c5-99f7-076ae4c6764d)\r\n\r\nI don't think, user args should be mandatory, since the documentation says \"additionally specify arguments\".\r\n\r\n### Steps to reproduce\r\n\r\n1. Click on \"Configuration\"\r\n2. Fill in some Values\r\n3. Click \"Save\"\r\n4. User-Args are mandatory\r\n\r\nIn order to save a Configuration, the user now has to enter an empty json which is not very user-friendly.\r\n\r\n### Webserver logs\r\n\r\n```bash\r\nnot applicable\r\n```\r\n\r\n\r\n### Browser logs\r\n\r\n_No response_\r\n\r\n### Paperless-ngx version\r\n\r\n2.3.2\r\n\r\n### Host OS\r\n\r\nSynology DSM 6.2.X\r\n\r\n### Installation method\r\n\r\nDocker - official image\r\n\r\n### Browser\r\n\r\nChrome\r\n\r\n### Configuration changes\r\n\r\nnone of interest\r\n\r\n### Other\r\n\r\n_No response_\r\n\r\n### Please confirm the following\r\n\r\n- [X] I believe this issue is a bug that affects all users of Paperless-ngx, not something specific to my installation.\r\n- [X] I have already searched for relevant existing issues and discussions before opening this report.\r\n- [X] I have updated the title field above with a concise description.\n", "before_files": [{"content": "import logging\n\nfrom django.contrib.auth.models import Group\nfrom django.contrib.auth.models import Permission\nfrom django.contrib.auth.models import User\nfrom rest_framework import serializers\n\nfrom paperless.models import ApplicationConfiguration\n\nlogger = logging.getLogger(\"paperless.settings\")\n\n\nclass ObfuscatedUserPasswordField(serializers.Field):\n    \"\"\"\n    Sends *** string instead of password in the clear\n    \"\"\"\n\n    def to_representation(self, value):\n        return \"**********\" if len(value) > 0 else \"\"\n\n    def to_internal_value(self, data):\n        return data\n\n\nclass UserSerializer(serializers.ModelSerializer):\n    password = ObfuscatedUserPasswordField(required=False)\n    user_permissions = serializers.SlugRelatedField(\n        many=True,\n        queryset=Permission.objects.all(),\n        slug_field=\"codename\",\n        required=False,\n    )\n    inherited_permissions = serializers.SerializerMethodField()\n\n    class Meta:\n        model = User\n        fields = (\n            \"id\",\n            \"username\",\n            \"email\",\n            \"password\",\n            \"first_name\",\n            \"last_name\",\n            \"date_joined\",\n            \"is_staff\",\n            \"is_active\",\n            \"is_superuser\",\n            \"groups\",\n            \"user_permissions\",\n            \"inherited_permissions\",\n        )\n\n    def get_inherited_permissions(self, obj):\n        return obj.get_group_permissions()\n\n    def update(self, instance, validated_data):\n        if \"password\" in validated_data:\n            if len(validated_data.get(\"password\").replace(\"*\", \"\")) > 0:\n                instance.set_password(validated_data.get(\"password\"))\n                instance.save()\n            validated_data.pop(\"password\")\n        super().update(instance, validated_data)\n        return instance\n\n    def create(self, validated_data):\n        groups = None\n        if \"groups\" in validated_data:\n            groups = validated_data.pop(\"groups\")\n        user_permissions = None\n        if \"user_permissions\" in validated_data:\n            user_permissions = validated_data.pop(\"user_permissions\")\n        password = None\n        if (\n            \"password\" in validated_data\n            and len(validated_data.get(\"password\").replace(\"*\", \"\")) > 0\n        ):\n            password = validated_data.pop(\"password\")\n        user = User.objects.create(**validated_data)\n        # set groups\n        if groups:\n            user.groups.set(groups)\n        # set permissions\n        if user_permissions:\n            user.user_permissions.set(user_permissions)\n        # set password\n        if password:\n            user.set_password(password)\n        user.save()\n        return user\n\n\nclass GroupSerializer(serializers.ModelSerializer):\n    permissions = serializers.SlugRelatedField(\n        many=True,\n        queryset=Permission.objects.all(),\n        slug_field=\"codename\",\n    )\n\n    class Meta:\n        model = Group\n        fields = (\n            \"id\",\n            \"name\",\n            \"permissions\",\n        )\n\n\nclass ProfileSerializer(serializers.ModelSerializer):\n    email = serializers.EmailField(allow_null=False)\n    password = ObfuscatedUserPasswordField(required=False, allow_null=False)\n    auth_token = serializers.SlugRelatedField(read_only=True, slug_field=\"key\")\n\n    class Meta:\n        model = User\n        fields = (\n            \"email\",\n            \"password\",\n            \"first_name\",\n            \"last_name\",\n            \"auth_token\",\n        )\n\n\nclass ApplicationConfigurationSerializer(serializers.ModelSerializer):\n    user_args = serializers.JSONField(binary=True)\n\n    class Meta:\n        model = ApplicationConfiguration\n        fields = \"__all__\"\n", "path": "src/paperless/serialisers.py"}], "after_files": [{"content": "import logging\n\nfrom django.contrib.auth.models import Group\nfrom django.contrib.auth.models import Permission\nfrom django.contrib.auth.models import User\nfrom rest_framework import serializers\n\nfrom paperless.models import ApplicationConfiguration\n\nlogger = logging.getLogger(\"paperless.settings\")\n\n\nclass ObfuscatedUserPasswordField(serializers.Field):\n    \"\"\"\n    Sends *** string instead of password in the clear\n    \"\"\"\n\n    def to_representation(self, value):\n        return \"**********\" if len(value) > 0 else \"\"\n\n    def to_internal_value(self, data):\n        return data\n\n\nclass UserSerializer(serializers.ModelSerializer):\n    password = ObfuscatedUserPasswordField(required=False)\n    user_permissions = serializers.SlugRelatedField(\n        many=True,\n        queryset=Permission.objects.all(),\n        slug_field=\"codename\",\n        required=False,\n    )\n    inherited_permissions = serializers.SerializerMethodField()\n\n    class Meta:\n        model = User\n        fields = (\n            \"id\",\n            \"username\",\n            \"email\",\n            \"password\",\n            \"first_name\",\n            \"last_name\",\n            \"date_joined\",\n            \"is_staff\",\n            \"is_active\",\n            \"is_superuser\",\n            \"groups\",\n            \"user_permissions\",\n            \"inherited_permissions\",\n        )\n\n    def get_inherited_permissions(self, obj):\n        return obj.get_group_permissions()\n\n    def update(self, instance, validated_data):\n        if \"password\" in validated_data:\n            if len(validated_data.get(\"password\").replace(\"*\", \"\")) > 0:\n                instance.set_password(validated_data.get(\"password\"))\n                instance.save()\n            validated_data.pop(\"password\")\n        super().update(instance, validated_data)\n        return instance\n\n    def create(self, validated_data):\n        groups = None\n        if \"groups\" in validated_data:\n            groups = validated_data.pop(\"groups\")\n        user_permissions = None\n        if \"user_permissions\" in validated_data:\n            user_permissions = validated_data.pop(\"user_permissions\")\n        password = None\n        if (\n            \"password\" in validated_data\n            and len(validated_data.get(\"password\").replace(\"*\", \"\")) > 0\n        ):\n            password = validated_data.pop(\"password\")\n        user = User.objects.create(**validated_data)\n        # set groups\n        if groups:\n            user.groups.set(groups)\n        # set permissions\n        if user_permissions:\n            user.user_permissions.set(user_permissions)\n        # set password\n        if password:\n            user.set_password(password)\n        user.save()\n        return user\n\n\nclass GroupSerializer(serializers.ModelSerializer):\n    permissions = serializers.SlugRelatedField(\n        many=True,\n        queryset=Permission.objects.all(),\n        slug_field=\"codename\",\n    )\n\n    class Meta:\n        model = Group\n        fields = (\n            \"id\",\n            \"name\",\n            \"permissions\",\n        )\n\n\nclass ProfileSerializer(serializers.ModelSerializer):\n    email = serializers.EmailField(allow_null=False)\n    password = ObfuscatedUserPasswordField(required=False, allow_null=False)\n    auth_token = serializers.SlugRelatedField(read_only=True, slug_field=\"key\")\n\n    class Meta:\n        model = User\n        fields = (\n            \"email\",\n            \"password\",\n            \"first_name\",\n            \"last_name\",\n            \"auth_token\",\n        )\n\n\nclass ApplicationConfigurationSerializer(serializers.ModelSerializer):\n    user_args = serializers.JSONField(binary=True, allow_null=True)\n\n    def run_validation(self, data):\n        if \"user_args\" in data and data[\"user_args\"] == \"\":\n            data[\"user_args\"] = None\n        return super().run_validation(data)\n\n    class Meta:\n        model = ApplicationConfiguration\n        fields = \"__all__\"\n", "path": "src/paperless/serialisers.py"}]}