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
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-20 13:17 -0400
1"""
2----------------------------------------------------------------------------
4 METADATA:
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
14----------------------------------------------------------------------------
16 LAST MODIFIED:
18 2025-03-04 By Jess Mann
20"""
22from __future__ import annotations
24from datetime import datetime
25from typing import Any, Iterator, Optional, override
27from typing_extensions import TypeVar
29from paperap.exceptions import APIError, BadResponseError, ResourceNotFoundError
30from paperap.models.document import Document, DocumentNote, DocumentNoteQuerySet, DocumentQuerySet
31from paperap.resources.base import BaseResource, StandardResource
34class DocumentResource(StandardResource[Document, DocumentQuerySet]):
35 """Resource for managing documents."""
37 model_class = Document
38 queryset_class = DocumentQuerySet
39 name = "documents"
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")
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)
58class DocumentNoteResource(StandardResource[DocumentNote, DocumentNoteQuerySet]):
59 """Resource for managing document notes."""
61 model_class = DocumentNote
62 queryset_class = DocumentNoteQuerySet
63 name = "document_notes"