BrickTracker/bricktracker/part_list.py

133 lines
3.5 KiB
Python

from typing import Any, Self, TYPE_CHECKING
from flask import current_app
from .part import BrickPart
from .record_list import BrickRecordList
if TYPE_CHECKING:
from .minifigure import BrickMinifigure
from .set import BrickSet
# Lego set or minifig parts
class BrickPartList(BrickRecordList[BrickPart]):
brickset: 'BrickSet | None'
minifigure: 'BrickMinifigure | None'
order: str
# Queries
all_query: str = 'part/list/all'
last_query: str = 'part/list/last'
minifigure_query: str = 'part/list/from_minifigure'
missing_query: str = 'part/list/missing'
select_query: str = 'part/list/from_set'
def __init__(self, /):
super().__init__()
# Placeholders
self.brickset = None
self.minifigure = None
# Store the order for this list
self.order = current_app.config['PARTS_DEFAULT_ORDER'].value
# Load all parts
def all(self, /) -> Self:
for record in self.select(
override_query=self.all_query,
order=self.order
):
part = BrickPart(record=record)
self.records.append(part)
return self
# Load parts from a brickset or minifigure
def load(
self,
brickset: 'BrickSet',
/,
minifigure: 'BrickMinifigure | None' = None,
) -> Self:
# Save the brickset and minifigure
self.brickset = brickset
self.minifigure = minifigure
# Load the parts from the database
for record in self.select(order=self.order):
part = BrickPart(
brickset=self.brickset,
minifigure=minifigure,
record=record,
)
if (
current_app.config['SKIP_SPARE_PARTS'].value and
part.fields.is_spare
):
continue
self.records.append(part)
return self
# Load generic parts from a minifigure
def from_minifigure(
self,
minifigure: 'BrickMinifigure',
/,
) -> Self:
# Save the minifigure
self.minifigure = minifigure
# Load the parts from the database
for record in self.select(
override_query=self.minifigure_query,
order=self.order
):
part = BrickPart(
minifigure=minifigure,
record=record,
)
if (
current_app.config['SKIP_SPARE_PARTS'].value and
part.fields.is_spare
):
continue
self.records.append(part)
return self
# Load missing parts
def missing(self, /) -> Self:
for record in self.select(
override_query=self.missing_query,
order=self.order
):
part = BrickPart(record=record)
self.records.append(part)
return self
# Return a dict with common SQL parameters for a parts list
def sql_parameters(self, /) -> dict[str, Any]:
parameters: dict[str, Any] = {}
# Set id
if self.brickset is not None:
parameters['u_id'] = self.brickset.fields.u_id
# Use the minifigure number if present,
# otherwise use the set number
if self.minifigure is not None:
parameters['set_num'] = self.minifigure.fields.fig_num
elif self.brickset is not None:
parameters['set_num'] = self.brickset.fields.set_num
return parameters