fdf
This commit is contained in:
104
SYS/detail_view_helpers.py
Normal file
104
SYS/detail_view_helpers.py
Normal file
@@ -0,0 +1,104 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any, Iterable, Optional, Sequence
|
||||
|
||||
|
||||
def _labelize_key(key: str) -> str:
|
||||
return str(key or "").replace("_", " ").title()
|
||||
|
||||
|
||||
def _normalize_tags_value(tags: Any) -> Optional[str]:
|
||||
if tags is None:
|
||||
return None
|
||||
if isinstance(tags, str):
|
||||
text = tags.strip()
|
||||
return text or None
|
||||
if isinstance(tags, Sequence):
|
||||
seen: list[str] = []
|
||||
for tag in tags:
|
||||
text = str(tag or "").strip()
|
||||
if text and text not in seen:
|
||||
seen.append(text)
|
||||
return ", ".join(seen) if seen else None
|
||||
text = str(tags).strip()
|
||||
return text or None
|
||||
|
||||
|
||||
def prepare_detail_metadata(
|
||||
subject: Any,
|
||||
*,
|
||||
include_subject_fields: bool = False,
|
||||
title: Optional[str] = None,
|
||||
hash_value: Optional[str] = None,
|
||||
store: Optional[str] = None,
|
||||
path: Optional[str] = None,
|
||||
tags: Any = None,
|
||||
prefer_existing_tags: bool = True,
|
||||
extra_fields: Optional[dict[str, Any]] = None,
|
||||
) -> dict[str, Any]:
|
||||
from SYS.result_table import extract_item_metadata
|
||||
|
||||
metadata = extract_item_metadata(subject) or {}
|
||||
|
||||
if include_subject_fields and isinstance(subject, dict):
|
||||
for key, value in subject.items():
|
||||
if str(key).startswith("_") or key in {"selection_action", "selection_args"}:
|
||||
continue
|
||||
label = _labelize_key(str(key))
|
||||
if label not in metadata and value is not None:
|
||||
metadata[label] = value
|
||||
|
||||
if title:
|
||||
metadata["Title"] = title
|
||||
if hash_value:
|
||||
metadata["Hash"] = hash_value
|
||||
if store:
|
||||
metadata["Store"] = store
|
||||
if path:
|
||||
metadata["Path"] = path
|
||||
|
||||
tags_text = _normalize_tags_value(tags)
|
||||
if tags_text and (not prefer_existing_tags or not metadata.get("Tags")):
|
||||
metadata["Tags"] = tags_text
|
||||
|
||||
for key, value in (extra_fields or {}).items():
|
||||
if value is not None:
|
||||
metadata[str(key)] = value
|
||||
|
||||
return metadata
|
||||
|
||||
|
||||
def create_detail_view(
|
||||
title: str,
|
||||
metadata: dict[str, Any],
|
||||
*,
|
||||
table_name: Optional[str] = None,
|
||||
source_command: Optional[tuple[str, Sequence[str]]] = None,
|
||||
init_command: Optional[tuple[str, Sequence[str]]] = None,
|
||||
max_columns: Optional[int] = None,
|
||||
exclude_tags: bool = False,
|
||||
value_case: Optional[str] = "preserve",
|
||||
perseverance: bool = True,
|
||||
) -> Any:
|
||||
from SYS.result_table import ItemDetailView
|
||||
|
||||
kwargs: dict[str, Any] = {"item_metadata": metadata}
|
||||
if max_columns is not None:
|
||||
kwargs["max_columns"] = max_columns
|
||||
if exclude_tags:
|
||||
kwargs["exclude_tags"] = True
|
||||
|
||||
table = ItemDetailView(title, **kwargs)
|
||||
if table_name:
|
||||
table = table.set_table(table_name)
|
||||
if value_case:
|
||||
table = table.set_value_case(value_case)
|
||||
if perseverance:
|
||||
table = table._perseverance(True)
|
||||
if source_command:
|
||||
name, args = source_command
|
||||
table.set_source_command(name, list(args))
|
||||
if init_command:
|
||||
name, args = init_command
|
||||
table = table.init_command(name, list(args))
|
||||
return table
|
||||
Reference in New Issue
Block a user