Keep invalid datetimes at end of sort

This commit is contained in:
Alfredo Di Stasio
2026-04-27 15:08:34 +02:00
parent 3e370c25b6
commit a2ab2674e3
2 changed files with 85 additions and 6 deletions

View File

@@ -47,7 +47,7 @@ def sort_records(
reverse = options.order == "desc"
if options.sort_by == "datetime":
key_func = _datetime_key
return _sort_records_by_datetime(records, reverse)
elif options.sort_by == "severity":
key_func = _severity_key
else:
@@ -56,17 +56,34 @@ def sort_records(
return sorted(records, key=key_func, reverse=reverse)
def _datetime_key(record: dict[str, str]) -> tuple[int, datetime]:
def _sort_records_by_datetime(
records: Iterable[dict[str, str]], reverse: bool
) -> list[dict[str, str]]:
"""Sort valid datetimes normally and always place invalid/missing values last."""
valid_records: list[tuple[datetime, dict[str, str]]] = []
invalid_records: list[dict[str, str]] = []
for record in records:
parsed_datetime = _parse_datetime(record)
if parsed_datetime is None:
invalid_records.append(record)
continue
valid_records.append((parsed_datetime, record))
sorted_valid_records = sorted(valid_records, key=lambda item: item[0], reverse=reverse)
return [record for _parsed, record in sorted_valid_records] + invalid_records
def _parse_datetime(record: dict[str, str]) -> datetime | None:
date_value = record.get("v015xxxxdate", "").strip()
time_value = record.get("time", "").strip()
if not date_value or not time_value:
return (1, datetime.max)
return None
try:
parsed = datetime.strptime(f"{date_value} {time_value}", "%Y-%m-%d %H:%M:%S")
return datetime.strptime(f"{date_value} {time_value}", "%Y-%m-%d %H:%M:%S")
except ValueError:
return (1, datetime.max)
return (0, parsed)
return None
def _severity_key(record: dict[str, str]) -> tuple[int, str]: