From c04890112922afe243168e642cb729288d37660a Mon Sep 17 00:00:00 2001 From: Daniel Townsend Date: Fri, 30 Dec 2022 05:58:16 +0000 Subject: [PATCH] allow `SelectRaw` with `Readable` --- piccolo/apps/playground/commands/run.py | 8 +++++++- piccolo/columns/readable.py | 22 ++++++++++------------ piccolo/table.py | 9 ++++++--- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/piccolo/apps/playground/commands/run.py b/piccolo/apps/playground/commands/run.py index 092b79c20..47fa9a1fb 100644 --- a/piccolo/apps/playground/commands/run.py +++ b/piccolo/apps/playground/commands/run.py @@ -23,6 +23,7 @@ from piccolo.columns.readable import Readable from piccolo.engine import PostgresEngine, SQLiteEngine from piccolo.engine.base import Engine +from piccolo.query import SelectRaw from piccolo.table import Table from piccolo.utils.warnings import colored_string @@ -111,7 +112,12 @@ class DiscountCode(Table): def get_readable(cls) -> Readable: return Readable( template="%s - %s", - columns=[cls.code, cls.active], + columns=[ + cls.code, + SelectRaw( + "CASE WHEN active THEN 'active' ELSE 'inactive' END" + ), + ], ) diff --git a/piccolo/columns/readable.py b/piccolo/columns/readable.py index 2748648d8..9d521d3b5 100644 --- a/piccolo/columns/readable.py +++ b/piccolo/columns/readable.py @@ -5,9 +5,6 @@ from piccolo.columns.base import Selectable -if t.TYPE_CHECKING: # pragma: no cover - from piccolo.columns.base import Column - @dataclass class Readable(Selectable): @@ -18,32 +15,33 @@ class Readable(Selectable): """ template: str - columns: t.Sequence[Column] + columns: t.Sequence[Selectable] output_name: str = "readable" - @property - def _columns_string(self) -> str: + def _get_columns_string(self, engine_type: str) -> str: return ", ".join( - i._meta.get_full_name(with_alias=False) for i in self.columns + i.get_select_string(engine_type=engine_type, with_alias=False) + for i in self.columns ) - def _get_string(self, operator: str) -> str: + def _get_string(self, operator: str, engine_type: str) -> str: + columns_string = self._get_columns_string(engine_type=engine_type) return ( - f"{operator}('{self.template}', {self._columns_string}) AS " + f"{operator}('{self.template}', {columns_string}) AS " f"{self.output_name}" ) @property def sqlite_string(self) -> str: - return self._get_string(operator="PRINTF") + return self._get_string(operator="PRINTF", engine_type="sqlite") @property def postgres_string(self) -> str: - return self._get_string(operator="FORMAT") + return self._get_string(operator="FORMAT", engine_type="postgres") @property def cockroach_string(self) -> str: - return self._get_string(operator="FORMAT") + return self._get_string(operator="FORMAT", engine_type="cockroach") def get_select_string(self, engine_type: str, with_alias=True) -> str: try: diff --git a/piccolo/table.py b/piccolo/table.py index a6cdc64c4..961d0e9fc 100644 --- a/piccolo/table.py +++ b/piccolo/table.py @@ -713,9 +713,12 @@ def _get_related_readable(cls, column: ForeignKey) -> Readable: for readable_column in readable.columns: output_column = column - for fk in readable_column._meta.call_chain: - output_column = getattr(output_column, fk._meta.name) - output_column = getattr(output_column, readable_column._meta.name) + if isinstance(readable_column, Column): + for fk in readable_column._meta.call_chain: + output_column = getattr(output_column, fk._meta.name) + output_column = getattr( + output_column, readable_column._meta.name + ) output_columns.append(output_column) output_name = f"{column._meta.name}_readable"