|
20 | 20 | import datetime |
21 | 21 |
|
22 | 22 | from py4web import URL |
23 | | -from yatl.helpers import A |
| 23 | +from yatl.helpers import A, SPAN |
24 | 24 |
|
25 | 25 | __all__ = ( |
26 | 26 | "safe_join", |
@@ -229,21 +229,35 @@ def fieldformat(table, row): |
229 | 229 | return str(row.id) |
230 | 230 |
|
231 | 231 |
|
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 | + |
238 | 243 | ref_row = ref_table(value) |
239 | 244 | if not ref_row: |
240 | 245 | return f"#{value}(missing)" |
241 | 246 | # Create text to be displayed |
242 | 247 | display_text = fieldformat(ref_table, ref_row) |
243 | 248 | # Create link to the referenced record's table |
244 | 249 | 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), |
246 | 255 | ) |
247 | 256 | return A(display_text, _href=link_url) |
248 | 257 |
|
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