Fixed wrong remaining weight and length spool sort
This commit is contained in:
@@ -9,6 +9,7 @@ from sqlalchemy import case, func
|
|||||||
from sqlalchemy.exc import NoResultFound
|
from sqlalchemy.exc import NoResultFound
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.orm import contains_eager, joinedload
|
from sqlalchemy.orm import contains_eager, joinedload
|
||||||
|
from sqlalchemy.sql.functions import coalesce
|
||||||
|
|
||||||
from spoolman.api.v1.models import EventType, Spool, SpoolEvent
|
from spoolman.api.v1.models import EventType, Spool, SpoolEvent
|
||||||
from spoolman.database import filament, models
|
from spoolman.database import filament, models
|
||||||
@@ -108,7 +109,7 @@ async def get_by_id(db: AsyncSession, spool_id: int) -> models.Spool:
|
|||||||
return spool
|
return spool
|
||||||
|
|
||||||
|
|
||||||
async def find(
|
async def find( # noqa: C901
|
||||||
*,
|
*,
|
||||||
db: AsyncSession,
|
db: AsyncSession,
|
||||||
filament_name: Optional[str] = None,
|
filament_name: Optional[str] = None,
|
||||||
@@ -165,8 +166,16 @@ async def find(
|
|||||||
if sort_by is not None:
|
if sort_by is not None:
|
||||||
for fieldstr, order in sort_by.items():
|
for fieldstr, order in sort_by.items():
|
||||||
sorts = []
|
sorts = []
|
||||||
if fieldstr in {"remaining_weight", "remaining_length"}:
|
if fieldstr == "remaining_weight":
|
||||||
sorts.append(models.Spool.initial_weight - models.Spool.spool_weight - models.Spool.used_weight)
|
sorts.append(coalesce(models.Spool.initial_weight, models.Filament.weight) - models.Spool.used_weight)
|
||||||
|
elif fieldstr == "remaining_length":
|
||||||
|
# Simplified weight -> length formula. Absolute value is not correct but the proportionality is still
|
||||||
|
# kept, which means the sort order is correct.
|
||||||
|
sorts.append(
|
||||||
|
(coalesce(models.Spool.initial_weight, models.Filament.weight) - models.Spool.used_weight)
|
||||||
|
/ models.Filament.density
|
||||||
|
/ (models.Filament.diameter * models.Filament.diameter),
|
||||||
|
)
|
||||||
elif fieldstr == "filament.combined_name":
|
elif fieldstr == "filament.combined_name":
|
||||||
sorts.append(models.Vendor.name)
|
sorts.append(models.Vendor.name)
|
||||||
sorts.append(models.Filament.name)
|
sorts.append(models.Filament.name)
|
||||||
|
|||||||
Reference in New Issue
Block a user