BrickTracker/bricktracker/set_status_list.py

75 lines
2.2 KiB
Python
Raw Normal View History

import logging
from .exceptions import NotFoundException
from .fields import BrickRecordFields
from .record_list import BrickRecordList
from .set_status import BrickSetStatus
logger = logging.getLogger(__name__)
# Lego sets status list
class BrickSetStatusList(BrickRecordList[BrickSetStatus]):
statuses: dict[str, BrickSetStatus]
# Queries
select_query = 'set/metadata/status/list'
def __init__(self, /, *, force: bool = False):
# Load statuses only if there is none already loaded
records = getattr(self, 'records', None)
if records is None or force:
# Don't use super()__init__ as it would mask class variables
self.fields = BrickRecordFields()
logger.info('Loading set statuses list')
BrickSetStatusList.records = []
BrickSetStatusList.statuses = {}
# Load the statuses from the database
for record in self.select():
status = BrickSetStatus(record=record)
BrickSetStatusList.records.append(status)
BrickSetStatusList.statuses[status.fields.id] = status
# Return the statuses as columns for a select
def as_columns(
self,
/,
*,
solo: bool = False,
table: str = 'bricktracker_set_statuses'
) -> str:
return ', '.join([
'"{table}"."{column}"'.format(
table=table,
column=record.as_column(),
)
for record
in self.records
if solo or record.fields.displayed_on_grid
])
# Grab a specific status
def get(self, id: str, /) -> BrickSetStatus:
if id not in self.statuses:
raise NotFoundException(
'Status with ID {id} was not found in the database'.format(
id=id,
),
)
return self.statuses[id]
# Get the list of statuses depending on the context
def list(self, /, *, all: bool = False) -> list[BrickSetStatus]:
return [
record
for record
in self.records
if all or record.fields.displayed_on_grid
]