]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Chore: upgrade to DRF 3.15 (#7134)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Tue, 9 Jul 2024 16:57:53 +0000 (09:57 -0700)
committerGitHub <noreply@github.com>
Tue, 9 Jul 2024 16:57:53 +0000 (16:57 +0000)
.github/dependabot.yml
Pipfile
Pipfile.lock
src/documents/migrations/1051_alter_correspondent_owner_alter_document_owner_and_more.py [new file with mode: 0644]
src/documents/models.py
src/documents/serialisers.py
src/documents/tests/test_migration_workflows.py
src/paperless_mail/migrations/0025_alter_mailaccount_owner_alter_mailrule_owner_and_more.py [new file with mode: 0644]

index d6f6b4efdf59236ed504446679ec0e164c865756..1ed22b439d8b9afa398ed1b3207e2ae96c89e350 100644 (file)
@@ -49,11 +49,6 @@ updates:
       - "paperless-ngx/backend"
     ignore:
       - dependency-name: "uvicorn"
-      - dependency-name: "djangorestframework"
-        versions:
-          - "3.15.0"
-          - "3.15.1"
-          - "3.15.2"
     groups:
       development:
         patterns:
diff --git a/Pipfile b/Pipfile
index 77bb99bcf338091a2189d321a6617d9bede0b469..43f6bb6005e96acd0c82051992e0195c123b09a4 100644 (file)
--- a/Pipfile
+++ b/Pipfile
@@ -18,7 +18,7 @@ django-filter = "~=24.2"
 django-guardian = "*"
 django-multiselectfield = "*"
 django-soft-delete = "*"
-djangorestframework = "==3.14.0"
+djangorestframework = "==3.15.2"
 djangorestframework-guardian = "*"
 drf-writable-nested = "*"
 bleach = "*"
index cda0f7681068039c291c06fb9b3ef48d97849229..41b105e3c642a8ca7dd0afb4c8368bfc544aa3cf 100644 (file)
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "272a69e9011a60f2d326b77d99d261425b66ebcc8ae929372213700ae47de0f5"
+            "sha256": "dfe78ffea6031e95e8e1ba35b668dacb08a4383b80d3d51d9fca239c4317d194"
         },
         "pipfile-spec": 6,
         "requires": {},
         },
         "djangorestframework": {
             "hashes": [
-                "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8",
-                "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"
+                "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20",
+                "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"
             ],
             "index": "pypi",
-            "markers": "python_version >= '3.6'",
-            "version": "==3.14.0"
+            "markers": "python_version >= '3.8'",
+            "version": "==3.15.2"
         },
         "djangorestframework-guardian": {
             "hashes": [
diff --git a/src/documents/migrations/1051_alter_correspondent_owner_alter_document_owner_and_more.py b/src/documents/migrations/1051_alter_correspondent_owner_alter_document_owner_and_more.py
new file mode 100644 (file)
index 0000000..e8f0bb9
--- /dev/null
@@ -0,0 +1,88 @@
+# Generated by Django 4.2.13 on 2024-07-09 16:39
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations
+from django.db import models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ("documents", "1050_customfield_extra_data_and_more"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="correspondent",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="document",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="documenttype",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="savedview",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="storagepath",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="tag",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+    ]
index 0e6de5360cf336c1bf39826f5d85c9250123cb2b..2fc9a5774785062f9243dd6bf226c94415bc91a7 100644 (file)
@@ -34,6 +34,7 @@ class ModelWithOwner(models.Model):
         User,
         blank=True,
         null=True,
+        default=None,
         on_delete=models.SET_NULL,
         verbose_name=_("owner"),
     )
index 2f6a19f49183da0e61239eec7bbbc4eba3b65626..38f6cc4f9d953be4fe71648c4c2db31e57e1dd4f 100644 (file)
@@ -261,13 +261,36 @@ class OwnedObjectSerializer(
     )
     # other methods in mixin
 
+    def validate_unique_together(self, validated_data, instance=None):
+        # workaround for https://github.com/encode/django-rest-framework/issues/9358
+        if "owner" in validated_data and "name" in self.Meta.fields:
+            name = validated_data.get("name", instance.name if instance else None)
+            objects = (
+                self.Meta.model.objects.exclude(pk=instance.pk)
+                if instance
+                else self.Meta.model.objects.all()
+            )
+            not_unique = objects.filter(
+                owner=validated_data["owner"],
+                name=name,
+            ).exists()
+            if not_unique:
+                raise serializers.ValidationError(
+                    {"error": "Object violates owner / name unique constraint"},
+                )
+
     def create(self, validated_data):
         # default to current user if not set
-        if "owner" not in validated_data and self.user:
+        request = self.context.get("request")
+        if (
+            "owner" not in validated_data
+            or (request is not None and "owner" not in request.data)
+        ) and self.user:
             validated_data["owner"] = self.user
         permissions = None
         if "set_permissions" in validated_data:
             permissions = validated_data.pop("set_permissions")
+        self.validate_unique_together(validated_data)
         instance = super().create(validated_data)
         if permissions is not None:
             self._set_permissions(permissions, instance)
@@ -276,17 +299,7 @@ class OwnedObjectSerializer(
     def update(self, instance, validated_data):
         if "set_permissions" in validated_data:
             self._set_permissions(validated_data["set_permissions"], instance)
-        if "owner" in validated_data and "name" in self.Meta.fields:
-            name = validated_data.get("name", instance.name)
-            not_unique = (
-                self.Meta.model.objects.exclude(pk=instance.pk)
-                .filter(owner=validated_data["owner"], name=name)
-                .exists()
-            )
-            if not_unique:
-                raise serializers.ValidationError(
-                    {"error": "Object violates owner / name unique constraint"},
-                )
+        self.validate_unique_together(validated_data, instance)
         return super().update(instance, validated_data)
 
 
index 507cb0c18b5e0e5909cd9ca198a023ff6e3af3e5..403067ca6c73afa7ffe634e84c425d82e19037de 100644 (file)
@@ -5,7 +5,12 @@ from documents.tests.utils import TestMigrations
 class TestMigrateWorkflow(TestMigrations):
     migrate_from = "1043_alter_savedviewfilterrule_rule_type"
     migrate_to = "1044_workflow_workflowaction_workflowtrigger_and_more"
-    dependencies = (("paperless_mail", "0024_alter_mailrule_name_and_more"),)
+    dependencies = (
+        (
+            "paperless_mail",
+            "0025_alter_mailaccount_owner_alter_mailrule_owner_and_more",
+        ),
+    )
 
     def setUpBeforeMigration(self, apps):
         User = apps.get_model("auth", "User")
diff --git a/src/paperless_mail/migrations/0025_alter_mailaccount_owner_alter_mailrule_owner_and_more.py b/src/paperless_mail/migrations/0025_alter_mailaccount_owner_alter_mailrule_owner_and_more.py
new file mode 100644 (file)
index 0000000..308ebdf
--- /dev/null
@@ -0,0 +1,52 @@
+# Generated by Django 4.2.13 on 2024-07-09 16:39
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations
+from django.db import models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ("paperless_mail", "0024_alter_mailrule_name_and_more"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="mailaccount",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="mailrule",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="processedmail",
+            name="owner",
+            field=models.ForeignKey(
+                blank=True,
+                default=None,
+                null=True,
+                on_delete=django.db.models.deletion.SET_NULL,
+                to=settings.AUTH_USER_MODEL,
+                verbose_name="owner",
+            ),
+        ),
+    ]