fix items_per_page problem

main^2
MrWaradana 3 days ago
parent 33e85cface
commit fca4d18d2b

@ -18,9 +18,11 @@ QueryStr = constr(pattern=r"^[ -~]+$", min_length=1)
def common_parameters( def common_parameters(
db_session: DbSession, # type: ignore db_session: DbSession, # type: ignore
current_user: QueryStr = Query(None, alias="currentUser"), # type: ignore current_user: Optional[str] = Query(None, alias="currentUser"), # type: ignore
current_user_snake: Optional[str] = Query(None, alias="current_user"), # type: ignore
page: int = Query(1, gt=0, lt=2147483647), page: int = Query(1, gt=0, lt=2147483647),
items_per_page: int = Query(5, alias="itemsPerPage", gt=-2, lt=2147483647), items_per_page: Optional[int] = Query(None, alias="items_per_page", gt=-2, lt=2147483647),
items_per_page_camel: Optional[int] = Query(None, alias="itemsPerPage", gt=-2, lt=2147483647),
query_str: QueryStr = Query(None, alias="q"), # type: ignore query_str: QueryStr = Query(None, alias="q"), # type: ignore
filter_spec: QueryStr = Query(None, alias="filter"), # type: ignore filter_spec: QueryStr = Query(None, alias="filter"), # type: ignore
sort_by: List[str] = Query([], alias="sortBy[]"), sort_by: List[str] = Query([], alias="sortBy[]"),
@ -28,15 +30,23 @@ def common_parameters(
all: int = Query(0), all: int = Query(0),
# role: QueryStr = Depends(get_current_role), # role: QueryStr = Depends(get_current_role),
): ):
# Support both snake_case and camelCase for pagination size
final_items_per_page = items_per_page_camel if items_per_page_camel is not None else (
items_per_page if items_per_page is not None else 5
)
# Support both snake_case and camelCase for current user
final_current_user = current_user or current_user_snake
return { return {
"db_session": db_session, "db_session": db_session,
"page": page, "page": page,
"items_per_page": items_per_page, "items_per_page": final_items_per_page,
"query_str": query_str, "query_str": query_str,
"filter_spec": filter_spec, "filter_spec": filter_spec,
"sort_by": sort_by, "sort_by": sort_by,
"descending": descending, "descending": descending,
"current_user": current_user, "current_user": final_current_user,
# "role": role, # "role": role,
"all": bool(all), "all": bool(all),
} }

@ -46,5 +46,4 @@ class EquipmentMasterPaginated(Pagination):
class EquipmentMasterQuery(CommonParams): class EquipmentMasterQuery(CommonParams):
parent_id : Optional[str] = None parent_id : Optional[str] = None
items_per_page : Optional[int] = 5
search : Optional[str] = None search : Optional[str] = None

@ -33,5 +33,4 @@ class ManpowerCostPagination(Pagination):
items: List[ManpowerCostRead] = [] items: List[ManpowerCostRead] = []
class QueryParams(CommonParams): class QueryParams(CommonParams):
items_per_page: Optional[int] = Field(5)
search: Optional[str] = Field(None) search: Optional[str] = Field(None)

@ -2,7 +2,7 @@ from datetime import datetime
from typing import List, Optional from typing import List, Optional
from uuid import UUID from uuid import UUID
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, model_validator
from src.models import DefaultBase, Pagination from src.models import DefaultBase, Pagination
from src.auth.service import CurrentUser from src.auth.service import CurrentUser
@ -53,13 +53,26 @@ class MasterDataPagination(Pagination):
class QueryParams(DefaultBase): class QueryParams(DefaultBase):
items_per_page: Optional[int] = Field( items_per_page: int = Field(
5, 5,
ge=1, ge=1,
alias="itemsPerPage", alias="items_per_page",
description="Items per page" description="Items per page"
) )
itemsPerPage: Optional[int] = Field(
None,
ge=1,
description="Alias for items_per_page"
)
search: Optional[str] = Field( search: Optional[str] = Field(
None, None,
description="Search keyword" description="Search keyword"
) )
@model_validator(mode="before")
@classmethod
def resolve_aliases(cls, data: any) -> any:
if isinstance(data, dict):
if "itemsPerPage" in data and data["itemsPerPage"] is not None:
data.setdefault("items_per_page", data["itemsPerPage"])
return data

@ -2,7 +2,7 @@
from datetime import datetime from datetime import datetime
from typing import Generic, List, Optional, TypeVar from typing import Generic, List, Optional, TypeVar
import uuid import uuid
from pydantic import BaseModel, Field, SecretStr, ConfigDict from pydantic import BaseModel, Field, SecretStr, ConfigDict, model_validator
from sqlalchemy import Column, DateTime, String, func, event from sqlalchemy import Column, DateTime, String, func, event
from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
@ -100,9 +100,11 @@ class StandardResponse(BaseModel, Generic[T]):
class CommonParams(DefaultBase): class CommonParams(DefaultBase):
# This ensures no extra query params are allowed # This ensures no extra query params are allowed
current_user: Optional[str] = Field(None, alias="currentUser") current_user: Optional[str] = Field(None, alias="current_user")
currentUser: Optional[str] = Field(None, description="Alias for current_user")
page: int = Field(1, gt=0, lt=2147483647) page: int = Field(1, gt=0, lt=2147483647)
items_per_page: int = Field(5, gt=-2, lt=2147483647, alias="itemsPerPage") items_per_page: int = Field(5, gt=-2, lt=2147483647, alias="items_per_page")
itemsPerPage: Optional[int] = Field(None, description="Alias for items_per_page")
query_str: Optional[str] = Field(None, alias="q") query_str: Optional[str] = Field(None, alias="q")
filter_spec: Optional[str] = Field(None, alias="filter") filter_spec: Optional[str] = Field(None, alias="filter")
sort_by: List[str] = Field(default_factory=list, alias="sortBy[]") sort_by: List[str] = Field(default_factory=list, alias="sortBy[]")
@ -110,6 +112,16 @@ class CommonParams(DefaultBase):
exclude: List[str] = Field(default_factory=list, alias="exclude[]") exclude: List[str] = Field(default_factory=list, alias="exclude[]")
all_params: int = Field(0, alias="all") all_params: int = Field(0, alias="all")
@model_validator(mode="before")
@classmethod
def resolve_aliases(cls, data: any) -> any:
if isinstance(data, dict):
if "itemsPerPage" in data and data["itemsPerPage"] is not None:
data.setdefault("items_per_page", data["itemsPerPage"])
if "currentUser" in data and data["currentUser"] is not None:
data.setdefault("current_user", data["currentUser"])
return data
# Property to mirror your original return dict's bool conversion # Property to mirror your original return dict's bool conversion
@property @property
def is_all(self) -> bool: def is_all(self) -> bool:

@ -102,13 +102,6 @@ class PlantFSChartData(DefaultBase):
class ListQueryParams(CommonParams): class ListQueryParams(CommonParams):
items_per_page: Optional[int] = Field(
default=5,
ge=1,
le=1000,
description="Number of items per page",
alias="itemsPerPage",
)
search: Optional[str] = Field( search: Optional[str] = Field(
default=None, default=None,
description="Search keyword", description="Search keyword",

@ -88,13 +88,6 @@ class PlantMasterDataPagination(Pagination):
class ListQueryParams(CommonParams): class ListQueryParams(CommonParams):
items_per_page: Optional[int] = Field(
default=5,
ge=1,
le=1000,
description="Number of items per page",
alias="itemsPerPage",
)
search: Optional[str] = Field( search: Optional[str] = Field(
default=None, default=None,
description="Search keyword", description="Search keyword",

@ -54,13 +54,6 @@ class SimulationRunPayload(DefaultBase):
class ListQueryParams(CommonParams): class ListQueryParams(CommonParams):
items_per_page: Optional[int] = Field(
default=5,
ge=1,
le=1000,
description="Number of items per page",
alias="itemsPerPage",
)
search: Optional[str] = Field( search: Optional[str] = Field(
default=None, default=None,
description="Search keyword", description="Search keyword",

Loading…
Cancel
Save