Coverage for src/paperap/resources/documents.py: 61%

28 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-20 13:17 -0400

1""" 

2---------------------------------------------------------------------------- 

3 

4 METADATA: 

5 

6 File: documents.py 

7 Project: paperap 

8 Created: 2025-03-04 

9 Version: 0.0.8 

10 Author: Jess Mann 

11 Email: jess@jmann.me 

12 Copyright (c) 2025 Jess Mann 

13 

14---------------------------------------------------------------------------- 

15 

16 LAST MODIFIED: 

17 

18 2025-03-04 By Jess Mann 

19 

20""" 

21 

22from __future__ import annotations 

23 

24from datetime import datetime 

25from typing import Any, Iterator, Optional, override 

26 

27from typing_extensions import TypeVar 

28 

29from paperap.exceptions import APIError, BadResponseError, ResourceNotFoundError 

30from paperap.models.document import Document, DocumentNote, DocumentNoteQuerySet, DocumentQuerySet 

31from paperap.resources.base import BaseResource, StandardResource 

32 

33 

34class DocumentResource(StandardResource[Document, DocumentQuerySet]): 

35 """Resource for managing documents.""" 

36 

37 model_class = Document 

38 queryset_class = DocumentQuerySet 

39 name = "documents" 

40 

41 def download(self, document_id: int, *, original: bool = False) -> bytes | None: 

42 url = f"documents/{document_id}/download" 

43 params = {"original": str(original).lower()} 

44 response = self.client.request("GET", url, params=params) 

45 if not response: 

46 raise ResourceNotFoundError(f"Document {document_id} download failed", self.name) 

47 return response.get("content") 

48 

49 def upload(self, file_content: bytes, filename: str, **metadata) -> Document: 

50 """Upload a document with optional metadata.""" 

51 data = {"document": (filename, file_content), **metadata} 

52 response = self.client.request("POST", "documents/post_document/", data=data) 

53 if not response: 

54 raise ResourceNotFoundError("Document upload failed") 

55 return self.parse_to_model(response) 

56 

57 

58class DocumentNoteResource(StandardResource[DocumentNote, DocumentNoteQuerySet]): 

59 """Resource for managing document notes.""" 

60 

61 model_class = DocumentNote 

62 queryset_class = DocumentNoteQuerySet 

63 name = "document_notes"