Keep invalid datetimes at end of sort
This commit is contained in:
@@ -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]:
|
||||
|
||||
Reference in New Issue
Block a user