Skip to content

Commit b6af3c7

Browse files
authored
Remove obsolete code, bump version, update changelog
1 parent 03a7693 commit b6af3c7

File tree

15 files changed

+21
-1682
lines changed

15 files changed

+21
-1682
lines changed

changelog.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Changelog
22

3-
## [3.5.2] - not yet released
3+
## [3.5.2] - 2025-07-23
44

5-
- Fix [A 50-page pdf file is very slow to open](https://github.com/papermerge/papermerge-core/issues/55)
5+
-
6+
Fix [A 50-page pdf file is very slow to open](https://github.com/papermerge/papermerge-core/issues/55)
67
- Document previews (thumbnails as well as pages) rendered in frontend
78
- Frontend refactoring - use monorepo structure
89
- Frontend dependencies updates

papermerge/core/config.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from enum import Enum
2-
32
from pathlib import Path
43

54
from pydantic_settings import BaseSettings
65

6+
77
class FileServer(str, Enum):
88
LOCAL = 'local'
99
S3 = 's3'
@@ -23,10 +23,6 @@ class Settings(BaseSettings):
2323
papermerge__redis__url: str | None = None
2424
papermerge__ocr__default_lang_code: str = 'deu'
2525
papermerge__preview__page_size_sm: int = 200 # pixels
26-
papermerge__preview__page_size_md: int = 600 # pixels
27-
papermerge__preview__page_size_lg: int = 900 # pixels
28-
papermerge__preview__page_size_xl: int = 1600 # pixels
29-
papermerge__thumbnail__size: int = 100 # pixels
3026
# When is OCR triggered ?
3127
# `ocr__automatic` = True means that OCR will be performed without
3228
# end user intervention i.e. via background scheduler like celery scheduler

papermerge/core/features/document/router_pages.py

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,18 @@
11
import logging
2-
import uuid
32
from typing import Annotated, List
43

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
85
from sqlalchemy import select
96

10-
from core.types import ImagePreviewSize
117
from papermerge.core.config import get_settings
128
from papermerge.core import db, utils, schema, orm
13-
from papermerge.core import pathlib as core_pathlib
149
from papermerge.core.features.auth import get_current_user
1510
from papermerge.core.features.auth import scopes
16-
from papermerge.core.features.document.db import api as doc_dbapi
1711
from papermerge.core.features.page_mngm.db.api import apply_pages_op
1812
from papermerge.core.features.page_mngm.db.api import \
1913
extract_pages as api_extract_pages
2014
from papermerge.core.features.page_mngm.db.api import \
2115
move_pages as api_move_pages
22-
from papermerge.core.db import common as dbapi_common
23-
from papermerge.core.utils import image
2416

2517
logger = logging.getLogger(__name__)
2618
config = get_settings()
@@ -31,99 +23,6 @@
3123
tags=["pages"],
3224
)
3325

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-
12726
@router.post("/")
12827
@utils.docstring_parameter(scope=scopes.PAGE_UPDATE)
12928
def apply_page_operations(

papermerge/core/features/document/schema.py

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
ImagePreviewSize,
1616
)
1717
from papermerge.core.features.nodes.schema import Node
18-
from papermerge.core import pathlib as plib
1918
from papermerge.core.types import OCRStatusEnum
2019
from papermerge.core import config
2120
from papermerge.core.features.document import s3
@@ -294,38 +293,6 @@ class Thumbnail(BaseModel):
294293
size: int
295294

296295

297-
def _s3_page_svg_url(uid: UUID) -> str:
298-
from papermerge.core.cloudfront import sign_url
299-
300-
resource_path = plib.page_svg_path(uid)
301-
prefix = settings.papermerge__main__prefix
302-
if prefix:
303-
url = f"https://{settings.papermerge__main__cf_domain}/{prefix}/{resource_path}"
304-
else:
305-
url = f"https://{settings.papermerge__main__cf_domain}/{resource_path}"
306-
307-
return sign_url(
308-
url,
309-
valid_for=600, # valid for 600 seconds
310-
)
311-
312-
313-
def _s3_docver_download_url(uid: UUID, file_name: str) -> str:
314-
from papermerge.core.cloudfront import sign_url
315-
316-
resource_path = plib.docver_path(uid, file_name)
317-
prefix = settings.papermerge__main__cf_domain
318-
if prefix:
319-
url = f"https://{settings.papermerge__main__cf_domain}/{prefix}/{resource_path}"
320-
else:
321-
url = f"https://{settings.papermerge__main__cf_domain}/{resource_path}"
322-
323-
return sign_url(
324-
url,
325-
valid_for=600, # valid for 600 seconds
326-
)
327-
328-
329296
class MovePage(BaseModel):
330297
id: UUID
331298
number: int

papermerge/core/features/document/tests/test_pages_router.py

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,7 @@
1-
from sqlalchemy import select
2-
3-
from papermerge.core import orm, schema, dbapi
1+
from papermerge.core import schema, dbapi
42
from papermerge.core.tests.resource_file import ResourceFile
53

64

7-
def test_get_document_details(
8-
auth_api_client, make_document_from_resource, user, db_session
9-
):
10-
doc = make_document_from_resource(
11-
resource=ResourceFile.THREE_PAGES, user=user, parent=user.home_folder
12-
)
13-
14-
stmt = (
15-
select(orm.Page)
16-
.join(orm.DocumentVersion)
17-
.join(orm.Document)
18-
.where(orm.Document.id == doc.id)
19-
)
20-
pages = db_session.execute(stmt).scalars().all()
21-
22-
response = auth_api_client.get(f"/pages/{pages[0].id}/jpg")
23-
assert response.status_code == 200, response.json()
24-
25-
response = auth_api_client.get(f"/pages/{pages[1].id}/jpg")
26-
assert response.status_code == 200, response.json()
27-
28-
response = auth_api_client.get(f"/pages/{pages[2].id}/jpg")
29-
assert response.status_code == 200, response.json()
30-
31-
325
def test_router_move_pages_endpoint_one_single_page_mix(
336
auth_api_client, user, db_session, make_document_from_resource
347
):

papermerge/core/features/nodes/router_thumbnails.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from fastapi.responses import FileResponse
99
from pydantic import BaseModel
1010

11-
from papermerge.core.db.engine import Session
1211
from papermerge.core import utils, db
1312
from papermerge.core.features.users import schema as usr_schema
1413
from papermerge.core.features.auth import get_current_user
@@ -18,8 +17,6 @@
1817
from papermerge.core.utils import image
1918
from papermerge.core.db.common import has_node_perm
2019
from papermerge.core.exceptions import HTTP403Forbidden, HTTP404NotFound
21-
22-
2320
from papermerge.core.routers.common import OPEN_API_GENERIC_JSON_DETAIL
2421

2522
router = APIRouter(

papermerge/core/models/__init__.py

Lines changed: 0 additions & 90 deletions
This file was deleted.

0 commit comments

Comments
 (0)