|
1 | 1 | import logging |
2 | | -import uuid |
3 | 2 | from typing import Annotated, List |
4 | 3 |
|
5 | | -from fastapi import APIRouter, HTTPException, Query, Security, Depends |
6 | | -from fastapi.responses import FileResponse |
7 | | -from sqlalchemy.exc import NoResultFound |
| 4 | +from fastapi import APIRouter, Security, Depends |
8 | 5 | from sqlalchemy import select |
9 | 6 |
|
10 | | -from core.types import ImagePreviewSize |
11 | 7 | from papermerge.core.config import get_settings |
12 | 8 | from papermerge.core import db, utils, schema, orm |
13 | | -from papermerge.core import pathlib as core_pathlib |
14 | 9 | from papermerge.core.features.auth import get_current_user |
15 | 10 | from papermerge.core.features.auth import scopes |
16 | | -from papermerge.core.features.document.db import api as doc_dbapi |
17 | 11 | from papermerge.core.features.page_mngm.db.api import apply_pages_op |
18 | 12 | from papermerge.core.features.page_mngm.db.api import \ |
19 | 13 | extract_pages as api_extract_pages |
20 | 14 | from papermerge.core.features.page_mngm.db.api import \ |
21 | 15 | move_pages as api_move_pages |
22 | | -from papermerge.core.db import common as dbapi_common |
23 | | -from papermerge.core.utils import image |
24 | 16 |
|
25 | 17 | logger = logging.getLogger(__name__) |
26 | 18 | config = get_settings() |
|
31 | 23 | tags=["pages"], |
32 | 24 | ) |
33 | 25 |
|
34 | | - |
35 | | -class SVGFileResponse(FileResponse): |
36 | | - media_type = "application/svg" |
37 | | - |
38 | | - |
39 | | -class JPEGFileResponse(FileResponse): |
40 | | - media_type = "application/jpeg" |
41 | | - |
42 | | - |
43 | | -@router.get("/{page_id}/svg", response_class=SVGFileResponse) |
44 | | -@utils.docstring_parameter(scope=scopes.PAGE_VIEW) |
45 | | -def get_page_svg_url( |
46 | | - page_id: uuid.UUID, |
47 | | - user: Annotated[schema.User, Security(get_current_user, scopes=[scopes.PAGE_VIEW])], |
48 | | - db_session=Depends(db.get_db), |
49 | | -): |
50 | | - """View page as SVG |
51 | | -
|
52 | | - Required scope: `{scope}` |
53 | | - """ |
54 | | - |
55 | | - try: |
56 | | - page = db.get_page(db_session, page_id=page_id, user_id=user.id) |
57 | | - except NoResultFound: |
58 | | - raise HTTPException(status_code=404, detail="Page not found") |
59 | | - |
60 | | - svg_abs_path = core_pathlib.abs_page_svg_path(str(page.id)) |
61 | | - logger.debug(f"page UUID={page_id} svg abs path={svg_abs_path}") |
62 | | - |
63 | | - if not svg_abs_path.exists(): |
64 | | - raise HTTPException(status_code=404, detail="File not found") |
65 | | - |
66 | | - return SVGFileResponse(svg_abs_path) |
67 | | - |
68 | | - |
69 | | -@router.get("/{page_id}/jpg", response_class=JPEGFileResponse) |
70 | | -@utils.docstring_parameter(scope=scopes.NODE_VIEW) |
71 | | -def get_page_jpg_url( |
72 | | - page_id: uuid.UUID, |
73 | | - user: Annotated[schema.User, Security(get_current_user, scopes=[scopes.NODE_VIEW])], |
74 | | - size: ImagePreviewSize = Query( |
75 | | - ImagePreviewSize.xl, description="jpg image width in pixels" |
76 | | - ), |
77 | | - db_session=Depends(db.get_db), |
78 | | -): |
79 | | - """Returns jpg preview image of the page. |
80 | | -
|
81 | | - Required scope: `{scope}` |
82 | | -
|
83 | | - Returned jpg image's width is `size` pixels. |
84 | | - """ |
85 | | - try: |
86 | | - document_id = doc_dbapi.get_page_document_id(db_session, page_id=page_id) |
87 | | - ok = dbapi_common.has_node_perm( |
88 | | - db_session, |
89 | | - user_id=user.id, |
90 | | - node_id=document_id, |
91 | | - codename=scopes.NODE_VIEW, |
92 | | - ) |
93 | | - if not ok: |
94 | | - raise HTTPException(status_code=403, detail="Access Forbidden") |
95 | | - |
96 | | - page = doc_dbapi.get_page(db_session, page_id=page_id) |
97 | | - doc_ver = doc_dbapi.get_doc_ver( |
98 | | - db_session, |
99 | | - document_version_id=page.document_version_id, |
100 | | - ) |
101 | | - except NoResultFound: |
102 | | - raise HTTPException(status_code=404, detail="Page does not exist") |
103 | | - |
104 | | - logger.debug( |
105 | | - f"Generating page preview for page.number={page.number}" f" page.id={page.id}" |
106 | | - ) |
107 | | - |
108 | | - jpeg_abs_path = core_pathlib.rel2abs( |
109 | | - core_pathlib.page_preview_jpg_path(page.id, size=size) |
110 | | - ) |
111 | | - |
112 | | - if not jpeg_abs_path.exists(): |
113 | | - # generate preview only for this page |
114 | | - image.gen_page_preview( |
115 | | - page_id=page.id, |
116 | | - doc_ver_id=doc_ver.id, |
117 | | - page_number=page.number, |
118 | | - file_name=doc_ver.file_name, |
119 | | - size=size, |
120 | | - ) |
121 | | - |
122 | | - logger.debug(f"jpeg_abs_path={jpeg_abs_path}") |
123 | | - |
124 | | - return JPEGFileResponse(jpeg_abs_path) |
125 | | - |
126 | | - |
127 | 26 | @router.post("/") |
128 | 27 | @utils.docstring_parameter(scope=scopes.PAGE_UPDATE) |
129 | 28 | def apply_page_operations( |
|
0 commit comments