forked from FrederikBaerentsen/BrickTracker
125 lines
3.5 KiB
Python
125 lines
3.5 KiB
Python
from typing import Any, Self, TYPE_CHECKING
|
|
|
|
from flask import current_app
|
|
|
|
from .minifigure import BrickMinifigure
|
|
from .record_list import BrickRecordList
|
|
if TYPE_CHECKING:
|
|
from .set import BrickSet
|
|
|
|
|
|
# Lego minifigures
|
|
class BrickMinifigureList(BrickRecordList[BrickMinifigure]):
|
|
brickset: 'BrickSet | None'
|
|
|
|
# Queries
|
|
all_query: str = 'minifigure/list/all'
|
|
last_query: str = 'minifigure/list/last'
|
|
select_query: str = 'minifigure/list/from_set'
|
|
using_part_query: str = 'minifigure/list/using_part'
|
|
missing_part_query: str = 'minifigure/list/missing_part'
|
|
|
|
def __init__(self, /):
|
|
super().__init__()
|
|
|
|
# Placeholders
|
|
self.brickset = None
|
|
|
|
# Load all minifigures
|
|
def all(self, /) -> Self:
|
|
for record in self.select(
|
|
override_query=self.all_query,
|
|
order=current_app.config['MINIFIGURES_DEFAULT_ORDER'].value
|
|
):
|
|
minifigure = BrickMinifigure(record=record)
|
|
|
|
self.records.append(minifigure)
|
|
|
|
return self
|
|
|
|
# Last added minifigure
|
|
def last(self, /, limit: int = 6) -> Self:
|
|
# Randomize
|
|
if current_app.config['RANDOM'].value:
|
|
order = 'RANDOM()'
|
|
else:
|
|
order = 'minifigures.rowid DESC'
|
|
|
|
for record in self.select(
|
|
override_query=self.last_query,
|
|
order=order,
|
|
limit=limit
|
|
):
|
|
minifigure = BrickMinifigure(record=record)
|
|
|
|
self.records.append(minifigure)
|
|
|
|
return self
|
|
|
|
# Load minifigures from a brickset
|
|
def load(self, brickset: 'BrickSet', /) -> Self:
|
|
# Save the brickset
|
|
self.brickset = brickset
|
|
|
|
# Load the minifigures from the database
|
|
for record in self.select(
|
|
order=current_app.config['MINIFIGURES_DEFAULT_ORDER'].value
|
|
):
|
|
minifigure = BrickMinifigure(brickset=self.brickset, record=record)
|
|
|
|
self.records.append(minifigure)
|
|
|
|
return self
|
|
|
|
# Return a dict with common SQL parameters for a minifigures list
|
|
def sql_parameters(self, /) -> dict[str, Any]:
|
|
parameters: dict[str, Any] = super().sql_parameters()
|
|
|
|
if self.brickset is not None:
|
|
parameters['u_id'] = self.brickset.fields.u_id
|
|
parameters['set_num'] = self.brickset.fields.set_num
|
|
|
|
return parameters
|
|
|
|
# Minifigures missing a part
|
|
def missing_part(
|
|
self,
|
|
part_num: str,
|
|
color_id: int,
|
|
/,
|
|
element_id: int | None = None,
|
|
) -> Self:
|
|
# Save the parameters to the fields
|
|
self.fields.part_num = part_num
|
|
self.fields.color_id = color_id
|
|
self.fields.element_id = element_id
|
|
|
|
# Load the sets from the database
|
|
for record in self.select(override_query=self.missing_part_query):
|
|
minifigure = BrickMinifigure(record=record)
|
|
|
|
self.records.append(minifigure)
|
|
|
|
return self
|
|
|
|
# Minifigure using a part
|
|
def using_part(
|
|
self,
|
|
part_num: str,
|
|
color_id: int,
|
|
/,
|
|
element_id: int | None = None,
|
|
) -> Self:
|
|
# Save the parameters to the fields
|
|
self.fields.part_num = part_num
|
|
self.fields.color_id = color_id
|
|
self.fields.element_id = element_id
|
|
|
|
# Load the sets from the database
|
|
for record in self.select(override_query=self.using_part_query):
|
|
minifigure = BrickMinifigure(record=record)
|
|
|
|
self.records.append(minifigure)
|
|
|
|
return self
|