Make dynamic column-facet values respect other active filters (Excel-style), with backend facet context helpers, list-page wiring, slip print/sidebar fixes, and refreshed graphify graphs. Co-authored-by: Cursor <cursoragent@cursor.com>
37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""列头 facet 上下文:剥离当前列自身过滤键(Excel 语义)。"""
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
from typing import Dict, Iterable, MutableMapping, Optional, Set
|
|
|
|
|
|
def _camel_to_snake(name: str) -> str:
|
|
s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
|
|
return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower()
|
|
|
|
|
|
def keys_for_facet_field(
|
|
field: str, *, extra_keys: Optional[Iterable[str]] = None
|
|
) -> Set[str]:
|
|
f = (field or "").strip()
|
|
snake = _camel_to_snake(f) if f else ""
|
|
keys = {f, f"{f}In", snake, f"{snake}_in"}
|
|
if extra_keys:
|
|
keys.update(k for k in extra_keys if k)
|
|
return {k for k in keys if k}
|
|
|
|
|
|
def strip_simple_facet_self_params(
|
|
params: MutableMapping[str, object],
|
|
field: str,
|
|
*,
|
|
extra_keys: Optional[Iterable[str]] = None,
|
|
) -> Dict[str, object]:
|
|
"""去掉当前 facet 列对应过滤键与元数据,返回新 dict。"""
|
|
out = {k: v for k, v in params.items() if v not in (None, "")}
|
|
for key in keys_for_facet_field(field, extra_keys=extra_keys):
|
|
out.pop(key, None)
|
|
for meta in ("field", "keyword", "limit"):
|
|
out.pop(meta, None)
|
|
return out
|