Files
bricktracker
migrations
sql
views
__init__.py
app.py
config.py
configuration.py
configuration_list.py
exceptions.py
fields.py
instructions.py
instructions_list.py
login.py
metadata.py
metadata_list.py
minifigure.py
minifigure_list.py
navbar.py
parser.py
part.py
part_list.py
rebrickable.py
rebrickable_image.py
rebrickable_minifigure.py
rebrickable_part.py
rebrickable_set.py
rebrickable_set_list.py
record.py
record_list.py
reload.py
retired.py
retired_list.py
set.py
set_list.py
set_status.py
set_status_list.py
socket.py
socket_decorator.py
sql.py
sql_counter.py
sql_migration.py
sql_migration_list.py
sql_stats.py
theme.py
theme_list.py
version.py
wish.py
wish_list.py
docs
static
templates
.dockerignore
.env.sample
.gitignore
CHANGELOG.md
Dockerfile
LICENSE
README.md
__init__.py
app.py
compose.legacy.yml
compose.local.yaml
compose.yaml
entrypoint.sh
requirements.txt
test-server.sh
BrickTracker/bricktracker/record_list.py

81 lines
1.9 KiB
Python

from sqlite3 import Row
from typing import Any, Generator, Generic, ItemsView, TypeVar, TYPE_CHECKING
from .fields import BrickRecordFields
from .sql import BrickSQL
if TYPE_CHECKING:
from .minifigure import BrickMinifigure
from .part import BrickPart
from .rebrickable_set import RebrickableSet
from .set import BrickSet
from .set_status import BrickSetStatus
from .wish import BrickWish
T = TypeVar(
'T',
'BrickSet',
'BrickSetStatus',
'BrickPart',
'BrickMinifigure',
'BrickWish',
'RebrickableSet'
)
# SQLite records
class BrickRecordList(Generic[T]):
select_query: str
records: list[T]
# Fields
fields: BrickRecordFields
def __init__(self, /):
self.fields = BrickRecordFields()
self.records = []
# Shorthand to field items
def items(self, /) -> ItemsView[str, Any]:
return self.fields.__dict__.items()
# Get all from the database
def select(
self,
/,
*,
override_query: str | None = None,
order: str | None = None,
limit: int | None = None,
**context: Any,
) -> list[Row]:
# Select the query
if override_query:
query = override_query
else:
query = self.select_query
return BrickSQL().fetchall(
query,
parameters=self.sql_parameters(),
order=order,
limit=limit,
**context
)
# Generic SQL parameters from fields
def sql_parameters(self, /) -> dict[str, Any]:
parameters: dict[str, Any] = {}
for name, value in self.items():
parameters[name] = value
return parameters
# Make the list iterable
def __iter__(self, /) -> Generator[T, Any, Any]:
for record in self.records:
yield record
# Make the list measurable
def __len__(self, /) -> int:
return len(self.records)