From 9419c98b01b486ba07d0376373e64fb71b8f6dc3 Mon Sep 17 00:00:00 2001 From: Gauthier Bastien Date: Mon, 16 Mar 2026 12:34:35 +0100 Subject: [PATCH 1/4] Fixed faceted viewlet broken because sessions format changed from list to OrderedDict. See #PARAF-345 --- CHANGES.rst | 2 ++ src/imio/esign/browser/views.py | 17 +++++++++-------- src/imio/esign/utils.py | 10 ++++++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 32c0773..0f5e8db 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -34,6 +34,8 @@ Changelog - Configured the `@@remove-from-esign-session` the same way as `@@remove-item-from-esign-session` so relying on an `available` method to show it only if a context is in a session. [gbastien] +- Fixed faceted viewlet broken because sessions format changed from list to OrderedDict. + [gbastien] 1.0a2 (2026-02-06) ------------------ diff --git a/src/imio/esign/browser/views.py b/src/imio/esign/browser/views.py index 6e1f42a..4d1a650 100644 --- a/src/imio/esign/browser/views.py +++ b/src/imio/esign/browser/views.py @@ -13,6 +13,7 @@ from imio.esign.config import get_registry_signing_users_email_content from imio.esign.utils import create_external_session from imio.esign.utils import get_session_annotation +from imio.esign.utils import get_session_info from imio.esign.utils import get_sessions_for from imio.esign.utils import get_state_description from imio.esign.utils import remove_session @@ -215,18 +216,18 @@ def render(self): @property def sessions(self): + # caching + if hasattr(self, "_cached_session"): + return self._cached_session session_id = self.request.form.get("esign_session_id[]", None) try: session_id = int(session_id) except (TypeError, ValueError): - return [] - sessions = get_session_annotation()["sessions"] - session = sessions.get(session_id) - if not session: - return [] - session = deepcopy(session) - session["id"] = session_id - return [session] + return {} + session = get_session_info(session_id) + # caching + self._cached_session = session + return session def get_table_rows(self, column): """Get the table rows following the column""" diff --git a/src/imio/esign/utils.py b/src/imio/esign/utils.py index 814ba79..76e1ad9 100644 --- a/src/imio/esign/utils.py +++ b/src/imio/esign/utils.py @@ -331,15 +331,21 @@ def get_session_annotation(portal=None): return annotations["imio.esign"] -def get_session_info(session_id, portal=None): +def get_session_info(session_id, portal=None, readonly=True): """Return a session info for a given numbering. :param session_id: the session id to return :param portal: portal if necessary to get the session annotation + :param readonly: return a copy of stored data to avoid modifying it """ annot = get_session_annotation(portal=portal) + session = {} if session_id in annot['sessions']: - return annot['sessions'][session_id] + session = annot['sessions'][session_id] + if readonly: + session = deepcopy(session) + session = {session_id: session} + return session def remove_context_from_session(context_uids): From 02932dd6d0b16553ee26c1053ceaf1cefdfa971a Mon Sep 17 00:00:00 2001 From: Gauthier Bastien Date: Mon, 16 Mar 2026 12:49:33 +0100 Subject: [PATCH 2/4] Do not change implementation of utils.get_session_info, more logical this way, change FacetedSessionInfoViewlet.sessions --- src/imio/esign/browser/views.py | 2 +- src/imio/esign/utils.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/imio/esign/browser/views.py b/src/imio/esign/browser/views.py index 4d1a650..67015f8 100644 --- a/src/imio/esign/browser/views.py +++ b/src/imio/esign/browser/views.py @@ -224,7 +224,7 @@ def sessions(self): session_id = int(session_id) except (TypeError, ValueError): return {} - session = get_session_info(session_id) + session = {session_id: get_session_info(session_id)} # caching self._cached_session = session return session diff --git a/src/imio/esign/utils.py b/src/imio/esign/utils.py index 76e1ad9..dffc729 100644 --- a/src/imio/esign/utils.py +++ b/src/imio/esign/utils.py @@ -344,7 +344,6 @@ def get_session_info(session_id, portal=None, readonly=True): session = annot['sessions'][session_id] if readonly: session = deepcopy(session) - session = {session_id: session} return session From ee477e53a80b5eeb0abbaf7ed5303ad4fe79df2c Mon Sep 17 00:00:00 2001 From: Gauthier Bastien Date: Mon, 16 Mar 2026 12:57:01 +0100 Subject: [PATCH 3/4] utils.get_session_info always return a dict now, empty of session not found, so we can iterate on it instead returning None that must be managed specifically --- src/imio/esign/tests/test_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/imio/esign/tests/test_utils.py b/src/imio/esign/tests/test_utils.py index 60c9359..7c29331 100644 --- a/src/imio/esign/tests/test_utils.py +++ b/src/imio/esign/tests/test_utils.py @@ -494,9 +494,9 @@ def test_get_session_info(self): """Test getting info about a given session id.""" annot = get_session_annotation() self.assertEqual(len(annot["sessions"]), 0) - self.assertIsNone(get_session_info(0)) - self.assertIsNone(get_session_info(1)) - self.assertIsNone(get_session_info(2)) + self.assertEqual(get_session_info(0), {}) + self.assertEqual(get_session_info(1), {}) + self.assertEqual(get_session_info(2), {}) signers = [ ("user1", "user1@sign.com", "User 1", "Position 1"), ("user2", "user2@sign.com", "User 2", "Position 2"), From ad2a6d78ee478498790f4d12a8012578b63ba7a7 Mon Sep 17 00:00:00 2001 From: Gauthier Bastien Date: Mon, 16 Mar 2026 13:31:59 +0100 Subject: [PATCH 4/4] Make sure we return {} if not session_info --- src/imio/esign/browser/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/imio/esign/browser/views.py b/src/imio/esign/browser/views.py index 67015f8..0511c6c 100644 --- a/src/imio/esign/browser/views.py +++ b/src/imio/esign/browser/views.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from AccessControl import Unauthorized -from copy import deepcopy from datetime import datetime from datetime import timedelta from imio.esign import _ @@ -224,7 +223,10 @@ def sessions(self): session_id = int(session_id) except (TypeError, ValueError): return {} - session = {session_id: get_session_info(session_id)} + session = {} + session_info = get_session_info(session_id) + if session_info: + session = {session_id: session_info} # caching self._cached_session = session return session