mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Enhancement: support custom fields in post_document endpoint (#6222)
This commit is contained in:
		@@ -288,6 +288,8 @@ The endpoint supports the following optional form fields:
 | 
			
		||||
- `tags`: Similar to correspondent. Specify this multiple times to
 | 
			
		||||
  have multiple tags added to the document.
 | 
			
		||||
- `archive_serial_number`: An optional archive serial number to set.
 | 
			
		||||
- `custom_fields`: An array of custom field ids to assign (with an empty
 | 
			
		||||
  value) to the document.
 | 
			
		||||
 | 
			
		||||
The endpoint will immediately return HTTP 200 if the document consumption
 | 
			
		||||
process was started successfully, with the UUID of the consumption task
 | 
			
		||||
 
 | 
			
		||||
@@ -1113,6 +1113,14 @@ class PostDocumentSerializer(serializers.Serializer):
 | 
			
		||||
        max_value=Document.ARCHIVE_SERIAL_NUMBER_MAX,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    custom_fields = serializers.PrimaryKeyRelatedField(
 | 
			
		||||
        many=True,
 | 
			
		||||
        queryset=CustomField.objects.all(),
 | 
			
		||||
        label="Custom fields",
 | 
			
		||||
        write_only=True,
 | 
			
		||||
        required=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def validate_document(self, document):
 | 
			
		||||
        document_data = document.file.read()
 | 
			
		||||
        mime_type = magic.from_buffer(document_data, mime=True)
 | 
			
		||||
@@ -1148,6 +1156,12 @@ class PostDocumentSerializer(serializers.Serializer):
 | 
			
		||||
        else:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
    def validate_custom_fields(self, custom_fields):
 | 
			
		||||
        if custom_fields:
 | 
			
		||||
            return [custom_field.id for custom_field in custom_fields]
 | 
			
		||||
        else:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BulkDownloadSerializer(DocumentListSerializer):
 | 
			
		||||
    content = serializers.ChoiceField(
 | 
			
		||||
 
 | 
			
		||||
@@ -1134,6 +1134,38 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
 | 
			
		||||
        self.assertIsNone(overrides.tag_ids)
 | 
			
		||||
        self.assertEqual(500, overrides.asn)
 | 
			
		||||
 | 
			
		||||
    def test_upload_with_custom_fields(self):
 | 
			
		||||
        self.consume_file_mock.return_value = celery.result.AsyncResult(
 | 
			
		||||
            id=str(uuid.uuid4()),
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        custom_field = CustomField.objects.create(
 | 
			
		||||
            name="stringfield",
 | 
			
		||||
            data_type=CustomField.FieldDataType.STRING,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        with open(
 | 
			
		||||
            os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"),
 | 
			
		||||
            "rb",
 | 
			
		||||
        ) as f:
 | 
			
		||||
            response = self.client.post(
 | 
			
		||||
                "/api/documents/post_document/",
 | 
			
		||||
                {
 | 
			
		||||
                    "document": f,
 | 
			
		||||
                    "custom_fields": [custom_field.id],
 | 
			
		||||
                },
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(response.status_code, status.HTTP_200_OK)
 | 
			
		||||
 | 
			
		||||
        self.consume_file_mock.assert_called_once()
 | 
			
		||||
 | 
			
		||||
        input_doc, overrides = self.get_last_consume_delay_call_args()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(input_doc.original_file.name, "simple.pdf")
 | 
			
		||||
        self.assertEqual(overrides.filename, "simple.pdf")
 | 
			
		||||
        self.assertEqual(overrides.custom_field_ids, [custom_field.id])
 | 
			
		||||
 | 
			
		||||
    def test_get_metadata(self):
 | 
			
		||||
        doc = Document.objects.create(
 | 
			
		||||
            title="test",
 | 
			
		||||
 
 | 
			
		||||
@@ -930,6 +930,7 @@ class PostDocumentView(GenericAPIView):
 | 
			
		||||
        title = serializer.validated_data.get("title")
 | 
			
		||||
        created = serializer.validated_data.get("created")
 | 
			
		||||
        archive_serial_number = serializer.validated_data.get("archive_serial_number")
 | 
			
		||||
        custom_field_ids = serializer.validated_data.get("custom_fields")
 | 
			
		||||
 | 
			
		||||
        t = int(mktime(datetime.now().timetuple()))
 | 
			
		||||
 | 
			
		||||
@@ -957,6 +958,7 @@ class PostDocumentView(GenericAPIView):
 | 
			
		||||
            created=created,
 | 
			
		||||
            asn=archive_serial_number,
 | 
			
		||||
            owner_id=request.user.id,
 | 
			
		||||
            custom_field_ids=custom_field_ids,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        async_task = consume_file.delay(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user