Simplify BrickRecord based lists to deduplicate code

This commit is contained in:
Gregoo 2025-02-03 22:20:43 +01:00
parent 8ad525926a
commit 8e40b1fd7e
3 changed files with 117 additions and 193 deletions

View File

@ -38,13 +38,7 @@ class BrickMinifigureList(BrickRecordList[BrickMinifigure]):
# Load all minifigures
def all(self, /) -> Self:
for record in self.select(
override_query=self.all_query,
order=self.order
):
minifigure = BrickMinifigure(record=record)
self.records.append(minifigure)
self.list(override_query=self.all_query)
return self
@ -55,13 +49,7 @@ class BrickMinifigureList(BrickRecordList[BrickMinifigure]):
self.fields.color = color
# Load the minifigures from the database
for record in self.select(
override_query=self.damaged_part_query,
order=self.order
):
minifigure = BrickMinifigure(record=record)
self.records.append(minifigure)
self.list(override_query=self.damaged_part_query)
return self
@ -73,27 +61,45 @@ class BrickMinifigureList(BrickRecordList[BrickMinifigure]):
else:
order = '"bricktracker_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)
self.list(override_query=self.last_query, order=order, limit=limit)
return self
# Base minifigure list
def list(
self,
/,
*,
override_query: str | None = None,
order: str | None = None,
limit: int | None = None,
**context: Any,
) -> None:
if order is None:
order = self.order
if hasattr(self, 'brickset'):
brickset = self.brickset
else:
brickset = None
# Load the sets from the database
for record in super().select(
override_query=override_query,
order=order,
limit=limit,
):
minifigure = BrickMinifigure(brickset=brickset, record=record)
self.records.append(minifigure)
# Load minifigures from a brickset
def from_set(self, brickset: 'BrickSet', /) -> Self:
# Save the brickset
self.brickset = brickset
# Load the minifigures from the database
for record in self.select(order=self.order):
minifigure = BrickMinifigure(brickset=self.brickset, record=record)
self.records.append(minifigure)
self.list()
return self
@ -104,13 +110,7 @@ class BrickMinifigureList(BrickRecordList[BrickMinifigure]):
self.fields.color = color
# Load the minifigures from the database
for record in self.select(
override_query=self.missing_part_query,
order=self.order
):
minifigure = BrickMinifigure(record=record)
self.records.append(minifigure)
self.list(override_query=self.missing_part_query)
return self
@ -121,13 +121,7 @@ class BrickMinifigureList(BrickRecordList[BrickMinifigure]):
self.fields.color = color
# Load the minifigures from the database
for record in self.select(
override_query=self.using_part_query,
order=self.order
):
minifigure = BrickMinifigure(record=record)
self.records.append(minifigure)
self.list(override_query=self.using_part_query)
return self

View File

@ -42,16 +42,50 @@ class BrickPartList(BrickRecordList[BrickPart]):
# 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)
self.list(override_query=self.all_query)
return self
# Base part list
def list(
self,
/,
*,
override_query: str | None = None,
order: str | None = None,
limit: int | None = None,
**context: Any,
) -> None:
if order is None:
order = self.order
if hasattr(self, 'brickset'):
brickset = self.brickset
else:
brickset = None
if hasattr(self, 'minifigure'):
minifigure = self.minifigure
else:
minifigure = None
# Load the sets from the database
for record in super().select(
override_query=override_query,
order=order,
limit=limit,
):
part = BrickPart(
brickset=brickset,
minifigure=minifigure,
record=record,
)
if current_app.config['SKIP_SPARE_PARTS'] and part.fields.spare:
continue
self.records.append(part)
# List specific parts from a brickset or minifigure
def list_specific(
self,
@ -65,17 +99,7 @@ class BrickPartList(BrickRecordList[BrickPart]):
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'] and part.fields.spare:
continue
self.records.append(part)
self.list()
return self
@ -89,19 +113,7 @@ class BrickPartList(BrickRecordList[BrickPart]):
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'] and part.fields.spare:
continue
self.records.append(part)
self.list(override_query=self.minifigure_query)
return self
@ -121,33 +133,13 @@ class BrickPartList(BrickRecordList[BrickPart]):
self.fields.color = brickpart.fields.color
# Load the parts from the database
for record in self.select(
override_query=self.print_query,
order=self.order
):
part = BrickPart(
record=record,
)
if (
current_app.config['SKIP_SPARE_PARTS'] and
part.fields.spare
):
continue
self.records.append(part)
self.list(override_query=self.print_query)
return self
# Load problematic parts
def problem(self, /) -> Self:
for record in self.select(
override_query=self.problem_query,
order=self.order
):
part = BrickPart(record=record)
self.records.append(part)
self.list(override_query=self.problem_query)
return self
@ -178,21 +170,7 @@ class BrickPartList(BrickRecordList[BrickPart]):
self.fields.color = brickpart.fields.color
# Load the parts from the database
for record in self.select(
override_query=self.different_color_query,
order=self.order
):
part = BrickPart(
record=record,
)
if (
current_app.config['SKIP_SPARE_PARTS'] and
part.fields.spare
):
continue
self.records.append(part)
self.list(override_query=self.different_color_query)
return self

View File

@ -1,4 +1,4 @@
from typing import Self
from typing import Any, Self
from flask import current_app
@ -36,23 +36,8 @@ class BrickSetList(BrickRecordList[BrickSet]):
# All the sets
def all(self, /) -> Self:
themes = set()
# Load the sets from the database
for record in self.select(
order=self.order,
owners=BrickSetOwnerList.as_columns(),
statuses=BrickSetStatusList.as_columns(),
tags=BrickSetTagList.as_columns(),
):
brickset = BrickSet(record=record)
self.records.append(brickset)
themes.add(brickset.theme.name)
# Convert the set into a list and sort it
self.themes = list(themes)
self.themes.sort()
self.list(do_theme=True)
return self
@ -62,13 +47,7 @@ class BrickSetList(BrickRecordList[BrickSet]):
self.fields.figure = figure
# Load the sets from the database
for record in self.select(
override_query=self.damaged_minifigure_query,
order=self.order
):
brickset = BrickSet(record=record)
self.records.append(brickset)
self.list(override_query=self.damaged_minifigure_query)
return self
@ -79,25 +58,7 @@ class BrickSetList(BrickRecordList[BrickSet]):
self.fields.color = color
# Load the sets from the database
for record in self.select(
override_query=self.damaged_part_query,
order=self.order
):
brickset = BrickSet(record=record)
self.records.append(brickset)
return self
# A generic list of the different sets
def generic(self, /) -> Self:
for record in self.select(
override_query=self.generic_query,
order=self.order
):
brickset = BrickSet(record=record)
self.records.append(brickset)
self.list(override_query=self.damaged_part_query)
return self
@ -109,7 +70,29 @@ class BrickSetList(BrickRecordList[BrickSet]):
else:
order = '"bricktracker_sets"."rowid" DESC'
for record in self.select(
self.list(order=order, limit=limit)
return self
# Base set list
def list(
self,
/,
*,
override_query: str | None = None,
order: str | None = None,
limit: int | None = None,
do_theme: bool = False,
**context: Any,
) -> None:
themes = set()
if order is None:
order = self.order
# Load the sets from the database
for record in super().select(
override_query=override_query,
order=order,
limit=limit,
owners=BrickSetOwnerList.as_columns(),
@ -119,8 +102,13 @@ class BrickSetList(BrickRecordList[BrickSet]):
brickset = BrickSet(record=record)
self.records.append(brickset)
if do_theme:
themes.add(brickset.theme.name)
return self
# Convert the set into a list and sort it
if do_theme:
self.themes = list(themes)
self.themes.sort()
# Sets missing a minifigure part
def missing_minifigure(self, figure: str, /) -> Self:
@ -128,16 +116,7 @@ class BrickSetList(BrickRecordList[BrickSet]):
self.fields.figure = figure
# Load the sets from the database
for record in self.select(
override_query=self.missing_minifigure_query,
order=self.order,
owners=BrickSetOwnerList.as_columns(),
statuses=BrickSetStatusList.as_columns(),
tags=BrickSetTagList.as_columns(),
):
brickset = BrickSet(record=record)
self.records.append(brickset)
self.list(override_query=self.missing_minifigure_query)
return self
@ -148,16 +127,7 @@ class BrickSetList(BrickRecordList[BrickSet]):
self.fields.color = color
# Load the sets from the database
for record in self.select(
override_query=self.missing_part_query,
order=self.order,
owners=BrickSetOwnerList.as_columns(),
statuses=BrickSetStatusList.as_columns(),
tags=BrickSetTagList.as_columns(),
):
brickset = BrickSet(record=record)
self.records.append(brickset)
self.list(override_query=self.missing_part_query)
return self
@ -167,16 +137,7 @@ class BrickSetList(BrickRecordList[BrickSet]):
self.fields.figure = figure
# Load the sets from the database
for record in self.select(
override_query=self.using_minifigure_query,
order=self.order,
owners=BrickSetOwnerList.as_columns(),
statuses=BrickSetStatusList.as_columns(),
tags=BrickSetTagList.as_columns(),
):
brickset = BrickSet(record=record)
self.records.append(brickset)
self.list(override_query=self.using_minifigure_query)
return self
@ -187,15 +148,6 @@ class BrickSetList(BrickRecordList[BrickSet]):
self.fields.color = color
# Load the sets from the database
for record in self.select(
override_query=self.using_part_query,
order=self.order,
owners=BrickSetOwnerList.as_columns(),
statuses=BrickSetStatusList.as_columns(),
tags=BrickSetTagList.as_columns(),
):
brickset = BrickSet(record=record)
self.records.append(brickset)
self.list(override_query=self.using_part_query)
return self