Implement new functions for parsing and retrieving ring bounds in kilometers, enhancing report generation logic. Remove redundant _ring_upper_km function and update sorting of ring items based on lower bounds, improving clarity and accuracy in report outputs.
This commit is contained in:
parent
7dd71f78bf
commit
1020cd97dc
@ -345,6 +345,30 @@ def _add_ring_bullet(doc: Document, ring_label: str, ring_color: str | None, siz
|
|||||||
r.font.size = Pt(size_pt)
|
r.font.size = Pt(size_pt)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_ring_bounds_km(label: str) -> tuple[float | None, float | None]:
|
||||||
|
s = str(label).strip()
|
||||||
|
if ":" in s:
|
||||||
|
s = s.split(":", 1)[0]
|
||||||
|
s = s.lower().replace("km", "").strip()
|
||||||
|
if "-" not in s:
|
||||||
|
return None, None
|
||||||
|
try:
|
||||||
|
lower_str, upper_str = s.split("-", 1)
|
||||||
|
return float(lower_str), float(upper_str)
|
||||||
|
except Exception:
|
||||||
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
|
def _ring_lower_km(label: str) -> float:
|
||||||
|
lower, _ = _parse_ring_bounds_km(label)
|
||||||
|
return lower if lower is not None else float("inf")
|
||||||
|
|
||||||
|
|
||||||
|
def _ring_upper_km(label: str) -> float | None:
|
||||||
|
_, upper = _parse_ring_bounds_km(label)
|
||||||
|
return upper
|
||||||
|
|
||||||
|
|
||||||
def _ring_color_for_label(label: str) -> str | None:
|
def _ring_color_for_label(label: str) -> str | None:
|
||||||
s = str(label)
|
s = str(label)
|
||||||
if ":" in s:
|
if ":" in s:
|
||||||
@ -743,20 +767,6 @@ def create_docx_report(
|
|||||||
# Align the "outermost" ring used for commentary with the analysis radius used in stats.
|
# Align the "outermost" ring used for commentary with the analysis radius used in stats.
|
||||||
outermost_upper_km = analysis_radius_km
|
outermost_upper_km = analysis_radius_km
|
||||||
|
|
||||||
def _ring_upper_km(label: str) -> float | None:
|
|
||||||
s = str(label).strip()
|
|
||||||
if ":" in s:
|
|
||||||
s = s.split(":", 1)[0]
|
|
||||||
s = s.lower().replace("km", "").strip()
|
|
||||||
# Expected formats: "0-2.0" or "2.0-4.0"
|
|
||||||
if "-" not in s:
|
|
||||||
return None
|
|
||||||
try:
|
|
||||||
upper = float(s.split("-", 1)[1])
|
|
||||||
return upper
|
|
||||||
except Exception:
|
|
||||||
return None
|
|
||||||
|
|
||||||
rings = []
|
rings = []
|
||||||
for ring_name, ring_data in ring_stats.items():
|
for ring_name, ring_data in ring_stats.items():
|
||||||
total = int(ring_data.get("total", 0))
|
total = int(ring_data.get("total", 0))
|
||||||
@ -1080,7 +1090,10 @@ def create_docx_report(
|
|||||||
)
|
)
|
||||||
|
|
||||||
ring_items: list[str] = []
|
ring_items: list[str] = []
|
||||||
for ring_name, ring_data in sorted((stats.get("lightning_by_distance_rings") or {}).items()):
|
for ring_name, ring_data in sorted(
|
||||||
|
(stats.get("lightning_by_distance_rings") or {}).items(),
|
||||||
|
key=lambda kv: _ring_lower_km(kv[0]),
|
||||||
|
):
|
||||||
if ring_data.get("total", 0) > 0:
|
if ring_data.get("total", 0) > 0:
|
||||||
ring_items.append(
|
ring_items.append(
|
||||||
s.ring_item.format(
|
s.ring_item.format(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user