2025-01-24 10:36:24 +01:00
|
|
|
import logging
|
|
|
|
|
|
|
|
from .exceptions import NotFoundException
|
|
|
|
from .fields import BrickRecordFields
|
|
|
|
from .record_list import BrickRecordList
|
2025-01-30 15:03:16 +01:00
|
|
|
from .set_status import BrickSetStatus
|
2025-01-24 10:36:24 +01:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
# Lego sets status list
|
|
|
|
class BrickSetStatusList(BrickRecordList[BrickSetStatus]):
|
|
|
|
statuses: dict[str, BrickSetStatus]
|
2025-01-24 10:36:24 +01:00
|
|
|
|
|
|
|
# Queries
|
2025-01-30 15:03:16 +01:00
|
|
|
select_query = 'set/metadata/status/list'
|
2025-01-24 10:36:24 +01:00
|
|
|
|
|
|
|
def __init__(self, /, *, force: bool = False):
|
2025-01-30 15:03:16 +01:00
|
|
|
# Load statuses only if there is none already loaded
|
2025-01-24 10:36:24 +01:00
|
|
|
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()
|
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
logger.info('Loading set statuses list')
|
2025-01-24 10:36:24 +01:00
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
BrickSetStatusList.records = []
|
|
|
|
BrickSetStatusList.statuses = {}
|
2025-01-24 10:36:24 +01:00
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
# Load the statuses from the database
|
2025-01-24 10:36:24 +01:00
|
|
|
for record in self.select():
|
2025-01-30 15:03:16 +01:00
|
|
|
status = BrickSetStatus(record=record)
|
2025-01-24 10:36:24 +01:00
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
BrickSetStatusList.records.append(status)
|
|
|
|
BrickSetStatusList.statuses[status.fields.id] = status
|
2025-01-24 10:36:24 +01:00
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
# Return the statuses as columns for a select
|
2025-01-24 10:36:24 +01:00
|
|
|
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
|
|
|
|
])
|
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
# Grab a specific status
|
|
|
|
def get(self, id: str, /) -> BrickSetStatus:
|
|
|
|
if id not in self.statuses:
|
2025-01-24 10:36:24 +01:00
|
|
|
raise NotFoundException(
|
2025-01-30 15:03:16 +01:00
|
|
|
'Status with ID {id} was not found in the database'.format(
|
2025-01-29 17:35:15 +01:00
|
|
|
id=id,
|
2025-01-24 10:36:24 +01:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
return self.statuses[id]
|
2025-01-24 10:36:24 +01:00
|
|
|
|
2025-01-30 15:03:16 +01:00
|
|
|
# Get the list of statuses depending on the context
|
|
|
|
def list(self, /, *, all: bool = False) -> list[BrickSetStatus]:
|
2025-01-24 10:36:24 +01:00
|
|
|
return [
|
|
|
|
record
|
|
|
|
for record
|
|
|
|
in self.records
|
|
|
|
if all or record.fields.displayed_on_grid
|
|
|
|
]
|