From f88ab6923a9a4cbbbf7ae2d995c22c0696ce0c90 Mon Sep 17 00:00:00 2001 From: Eric Vyncke Date: Sat, 1 Nov 2025 15:23:58 +0000 Subject: [PATCH] Sort ADs by full name --- ietf/doc/views_search.py | 3 ++- ietf/utils/unicodenormalize.py | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 ietf/utils/unicodenormalize.py diff --git a/ietf/doc/views_search.py b/ietf/doc/views_search.py index 2144c23e06..3b67061b05 100644 --- a/ietf/doc/views_search.py +++ b/ietf/doc/views_search.py @@ -74,7 +74,7 @@ from ietf.utils.log import log from ietf.doc.utils_search import prepare_document_table, doc_type, doc_state, doc_type_name, AD_WORKLOAD from ietf.ietfauth.utils import has_role - +from ietf.utils.unicodenormalize import normalize_for_sorting class SearchForm(forms.Form): name = forms.CharField(required=False) @@ -480,6 +480,7 @@ def _state_to_doc_type(state): ).distinct(): if p in get_active_ads(): ads.append(p) + ads.sort(key=lambda p: normalize_for_sorting(p.plain_name())) bucket_template = { dt: {state: [[] for _ in range(days)] for state in STATE_SLUGS[dt].values()} diff --git a/ietf/utils/unicodenormalize.py b/ietf/utils/unicodenormalize.py new file mode 100644 index 0000000000..8644dbdb79 --- /dev/null +++ b/ietf/utils/unicodenormalize.py @@ -0,0 +1,9 @@ +# Copyright The IETF Trust 2025, All Rights Reserved +import unicodedata + +def normalize_for_sorting(text): + """Normalize text for proper accent-aware sorting.""" + # Normalize the text to NFD (decomposed form) + decomposed = unicodedata.normalize('NFD', text) + # Filter out combining diacritical marks + return ''.join(char for char in decomposed if not unicodedata.combining(char))