mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Enhancement: support custom fields in post_document endpoint (#6222)
This commit is contained in:
		| @@ -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
	 shamoon
					shamoon