Skip to content

Commit 937ebb7

Browse files
committed
Improved logic to represent reference fields in dashboard
1 parent 0c2d31e commit 937ebb7

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

apps/_dashboard/__init__.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
from py4web.core import DAL, Fixture, Reloader, Session, dumps, error_logger, safely
3636
from py4web.utils.factories import ActionFactory
3737
from py4web.utils.grid import Grid
38-
from yatl.helpers import A, XML
3938

4039
from .diff2kryten import diff2kryten
4140
from .utils import *
@@ -153,18 +152,9 @@ def make_grid():
153152
field.readable = True
154153
field.writable = True
155154
# Make reference fields clickable
156-
if field.type_name in ("reference", "big-reference"):
155+
if field.type_name in ("reference", "big-reference", "list:reference"):
157156
field.represent = make_admin_reference_represent(
158-
app_name, db_name, db, field
159-
)
160-
elif field.type_name in ("list:reference"):
161-
representer = make_admin_reference_represent(
162-
app_name, db_name, db, field
163-
)
164-
field.represent = (
165-
lambda values, _: [representer(item, _) for item in values]
166-
if isinstance(values, list)
167-
else ""
157+
app_name, db_name, field
168158
)
169159

170160
columns = [

apps/_dashboard/utils.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import datetime
2121

2222
from py4web import URL
23-
from yatl.helpers import A
23+
from yatl.helpers import A, SPAN
2424

2525
__all__ = (
2626
"safe_join",
@@ -229,21 +229,35 @@ def fieldformat(table, row):
229229
return str(row.id)
230230

231231

232-
# Create a custom represent function that returns a clickable link
233-
def make_admin_reference_represent(app_name, db_name, db, field):
234-
def represent(value, _):
235-
if not value:
236-
return ""
237-
ref_table = field.referenced_table()
232+
class make_admin_reference_represent:
233+
"""An object that knows how to represent reference fields and list of references"""
234+
235+
def __init__(self, app_name, db_name, field):
236+
self.app_name = app_name
237+
self.db_name = db_name
238+
self.field = field
239+
240+
def represent_item(self, value):
241+
ref_table = self.field.referenced_table()
242+
238243
ref_row = ref_table(value)
239244
if not ref_row:
240245
return f"#{value}(missing)"
241246
# Create text to be displayed
242247
display_text = fieldformat(ref_table, ref_row)
243248
# Create link to the referenced record's table
244249
link_url = URL(
245-
"dbadmin", app_name, db_name, ref_table._tablename, vars=dict(id=value)
250+
"dbadmin",
251+
self.app_name,
252+
self.db_name,
253+
ref_table._tablename,
254+
vars=dict(id=value),
246255
)
247256
return A(display_text, _href=link_url)
248257

249-
return represent
258+
def __call__(self, value, _):
259+
if not value:
260+
return ""
261+
if isinstance(value, list):
262+
return SPAN(*list(map(self.represent_item, value)))
263+
return self.represent_item(value)

0 commit comments

Comments
 (0)