Skip to content

Commit 60e8a01

Browse files
authored
Upgrade to poetry 2.0 (#580)
1 parent 99fa8a4 commit 60e8a01

File tree

30 files changed

+1651
-999
lines changed

30 files changed

+1651
-999
lines changed

.github/workflows/tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
- name: Install python dependencies
2727
run: |
2828
python -m pip install --upgrade pip
29-
pip install poetry==1.8.2
29+
pip install poetry==2.0.1
3030
poetry install --with test && poetry run pytest papermerge/
3131
env:
3232
PAPERMERGE__DATABASE__URL: 'sqlite:///test.sqlite'
@@ -59,7 +59,7 @@ jobs:
5959
- name: Install python dependencies
6060
run: |
6161
python -m pip install --upgrade pip
62-
pip install poetry==1.8.2
62+
pip install poetry==2.0.1
6363
poetry install --with test -E pg && poetry run pytest papermerge/
6464
env:
6565
PAPERMERGE__DATABASE__URL: 'postgresql://pmguser:pmgpass@localhost:5432/test_pmgdb'

changelog.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
<!-- towncrier release notes start -->
44

5+
## [3.4] - Soon
6+
7+
### Changes
8+
9+
- pyproject.toml upgraded for poetry 2.0
10+
11+
### Adds
12+
13+
- Column sorting and filtering in Document Type list view
14+
- Column sorting and filtering in Custom Field list view
15+
16+
517
## [3.3.1] - 2025-01-19
618

719
### Changes

docker/standard/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ RUN apk update && apk add linux-headers python3-dev \
2929
libpq-dev \
3030
poppler-utils
3131

32-
RUN pip install --upgrade poetry==1.8.2 roco==0.4.2
32+
RUN pip install --upgrade poetry==2.0.1 roco==0.4.2
3333
RUN curl -L -o /bin/env2js https://github.com/papermerge/env2js/releases/download/0.2/env2js.amd64
3434
RUN chmod +x /bin/env2js
3535

papermerge/core/features/custom_fields/db/api.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,64 @@
22
import logging
33
import uuid
44

5-
from sqlalchemy import select, func
5+
from sqlalchemy import select, func, or_
66
from sqlalchemy.orm import Session
77

8+
89
from papermerge.core import schema, orm
910

1011

1112
logger = logging.getLogger(__name__)
1213

1314

15+
ORDER_BY_MAP = {
16+
"type": orm.CustomField.type.asc(),
17+
"-type": orm.CustomField.type.desc(),
18+
"name": orm.CustomField.name.asc(),
19+
"-name": orm.CustomField.name.desc(),
20+
}
21+
22+
1423
def get_custom_fields(
15-
db_session: Session, *, user_id: uuid.UUID, page_size: int, page_number: int
24+
db_session: Session,
25+
*,
26+
user_id: uuid.UUID,
27+
page_size: int,
28+
page_number: int,
29+
filter: str,
30+
order_by: str = "name",
1631
) -> schema.PaginatedResponse[schema.CustomField]:
1732
stmt_total_cf = select(func.count(orm.CustomField.id)).where(
1833
orm.CustomField.user_id == user_id
1934
)
35+
if filter:
36+
stmt_total_cf = stmt_total_cf.where(
37+
or_(
38+
orm.CustomField.name.icontains(filter),
39+
orm.CustomField.type.icontains(filter),
40+
)
41+
)
42+
2043
total_cf = db_session.execute(stmt_total_cf).scalar()
44+
order_by_value = ORDER_BY_MAP.get(order_by, orm.CustomField.name.asc())
2145

2246
offset = page_size * (page_number - 1)
2347
stmt = (
2448
select(orm.CustomField)
2549
.where(orm.CustomField.user_id == user_id)
2650
.limit(page_size)
2751
.offset(offset)
52+
.order_by(order_by_value)
2853
)
2954

55+
if filter:
56+
stmt = stmt.where(
57+
or_(
58+
orm.CustomField.name.icontains(filter),
59+
orm.CustomField.type.icontains(filter),
60+
)
61+
)
62+
3063
db_cfs = db_session.scalars(stmt).all()
3164
items = [schema.CustomField.model_validate(db_cf) for db_cf in db_cfs]
3265

papermerge/core/features/custom_fields/router.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
from papermerge.core.features.custom_fields import schema as cf_schema
1313
from papermerge.core.features.custom_fields.db import api as dbapi
1414
from papermerge.core.routers.common import OPEN_API_GENERIC_JSON_DETAIL
15-
from papermerge.core.routers.params import CommonQueryParams
1615
from papermerge.core.features.users.schema import User
1716

17+
from .types import PaginatedQueryParams
18+
1819
router = APIRouter(
1920
prefix="/custom-fields",
2021
tags=["custom-fields"],
@@ -46,9 +47,9 @@ def get_custom_fields(
4647
user: Annotated[
4748
User, Security(get_current_user, scopes=[scopes.CUSTOM_FIELD_VIEW])
4849
],
49-
params: CommonQueryParams = Depends(),
50+
params: PaginatedQueryParams = Depends(),
5051
):
51-
"""Get all (paginated) custom fields
52+
"""Get paginated list of custom fields
5253
5354
Required scope: `{scope}`
5455
"""
@@ -58,6 +59,8 @@ def get_custom_fields(
5859
user_id=user.id,
5960
page_size=params.page_size,
6061
page_number=params.page_number,
62+
order_by=params.order_by,
63+
filter=params.filter,
6164
)
6265

6366
return result
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from enum import Enum
2+
3+
from papermerge.core.types import PaginatedQueryParams as BaseParams
4+
5+
6+
class OrderBy(str, Enum):
7+
name_asc = "name"
8+
name_desc = "-name"
9+
type_asc = "type"
10+
type_desc = "-type"
11+
12+
13+
class PaginatedQueryParams(BaseParams):
14+
order_by: OrderBy | None = None

papermerge/core/features/document_types/db/api.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,43 @@ def get_document_types_without_pagination(
3030
return items
3131

3232

33+
ORDER_BY_MAP = {
34+
"name": orm.DocumentType.name.asc(),
35+
"-name": orm.DocumentType.name.desc(),
36+
}
37+
38+
3339
def get_document_types(
34-
session: Session, user_id: uuid.UUID, page_size: int, page_number: int
40+
session: Session,
41+
user_id: uuid.UUID,
42+
page_size: int,
43+
page_number: int,
44+
filter: str | None = None,
45+
order_by: str = "name",
3546
) -> schema.PaginatedResponse[schema.DocumentType]:
3647

3748
stmt_total_doc_types = select(func.count(DocumentType.id)).where(
3849
DocumentType.user_id == user_id
3950
)
51+
if filter:
52+
stmt_total_doc_types = stmt_total_doc_types.where(
53+
orm.DocumentType.name.icontains(filter)
54+
)
4055
total_doc_types = session.execute(stmt_total_doc_types).scalar()
56+
order_by_value = ORDER_BY_MAP.get(order_by, orm.DocumentType.name.asc())
4157

4258
offset = page_size * (page_number - 1)
59+
4360
stmt = (
4461
select(DocumentType)
4562
.where(DocumentType.user_id == user_id)
4663
.limit(page_size)
4764
.offset(offset)
65+
.order_by(order_by_value)
4866
)
67+
if filter:
68+
stmt = stmt.where(orm.DocumentType.name.icontains(filter))
69+
4970
db_items = session.scalars(stmt).all()
5071
items = [schema.DocumentType.model_validate(db_item) for db_item in db_items]
5172

papermerge/core/features/document_types/router.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from papermerge.core.features.auth import get_current_user
1010
from papermerge.core.features.auth import scopes
1111
from papermerge.core.routers.common import OPEN_API_GENERIC_JSON_DETAIL
12-
from papermerge.core.routers.params import CommonQueryParams
1312
from papermerge.core.features.users import schema as users_schema
13+
from .types import PaginatedQueryParams
1414

1515
router = APIRouter(
1616
prefix="/document-types",
@@ -46,7 +46,7 @@ def get_document_types(
4646
user: Annotated[
4747
users_schema.User, Security(get_current_user, scopes=[scopes.CUSTOM_FIELD_VIEW])
4848
],
49-
params: CommonQueryParams = Depends(),
49+
params: PaginatedQueryParams = Depends(),
5050
) -> schema.PaginatedResponse[schema.DocumentType]:
5151
"""Get all (paginated) document types
5252
@@ -58,6 +58,8 @@ def get_document_types(
5858
user_id=user.id,
5959
page_size=params.page_size,
6060
page_number=params.page_number,
61+
order_by=params.order_by,
62+
filter=params.filter,
6163
)
6264

6365
return paginated_response
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from enum import Enum
2+
3+
from papermerge.core.types import PaginatedQueryParams as BaseParams
4+
5+
6+
class OrderBy(str, Enum):
7+
name_asc = "name"
8+
name_desc = "-name"
9+
10+
11+
class PaginatedQueryParams(BaseParams):
12+
order_by: OrderBy | None = None

papermerge/core/types.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from datetime import date
33
from enum import Enum
44
from typing import Generic, Literal, TypeAlias, TypeVar
5+
from fastapi import Query
56

67
from pydantic import BaseModel, ConfigDict
78

@@ -53,3 +54,11 @@ class CFVValueColumn(str, Enum):
5354
MONETARY = 'value_monetary'
5455
BOOLEAN = 'value_boolean'
5556
YEARMONTH = 'value_yearmonth'
57+
58+
59+
class PaginatedQueryParams(BaseModel):
60+
page_size: int = Query(5, ge=1, description="Number of items per page")
61+
page_number: int = Query(
62+
1, ge=1, description="Page number. It is first, second etc. page?"
63+
)
64+
filter: str | None = None

0 commit comments

Comments
 (0)