Skip to content

Commit eb62f2a

Browse files
committed
Merge remote-tracking branch 'origin/main' into PARAF-359_file_added_to_same_session_again
2 parents 385efb9 + 6730ff2 commit eb62f2a

File tree

11 files changed

+66
-20
lines changed

11 files changed

+66
-20
lines changed

CHANGES.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ Changelog
3333
[chris-adam]
3434
- Manage file added again to same session, data is updated.
3535
[gbastien]
36+
- Configured the `@@remove-from-esign-session` the same way as `@@remove-item-from-esign-session`
37+
so relying on an `available` method to show it only if a context is in a session.
38+
[gbastien]
39+
- Fixed faceted viewlet broken because sessions format changed from list to OrderedDict.
40+
[gbastien]
3641

3742
1.0a2 (2026-02-06)
3843
------------------

src/imio/esign/browser/actions.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ def get_uid_to_remove(self):
101101
""" """
102102
return self.context.UID()
103103

104+
def available(self):
105+
"""Defines if the action is available or not."""
106+
annot = get_session_annotation()
107+
return self.context.UID() in annot.get("c_uids", {})
108+
104109

105110
class RemoveItemFromSessionView(BrowserView):
106111
"""View to remove an item from an esign session."""
1.9 KB
Loading
847 Bytes
Loading
1.89 KB
Loading
1.89 KB
Loading

src/imio/esign/browser/views.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# -*- coding: utf-8 -*-
22

33
from AccessControl import Unauthorized
4-
from copy import deepcopy
54
from datetime import datetime
65
from datetime import timedelta
76
from imio.esign import _
@@ -13,6 +12,7 @@
1312
from imio.esign.config import get_registry_signing_users_email_content
1413
from imio.esign.utils import create_external_session
1514
from imio.esign.utils import get_session_annotation
15+
from imio.esign.utils import get_session_info
1616
from imio.esign.utils import get_sessions_for
1717
from imio.esign.utils import get_state_description
1818
from imio.esign.utils import remove_session
@@ -215,18 +215,21 @@ def render(self):
215215

216216
@property
217217
def sessions(self):
218+
# caching
219+
if hasattr(self, "_cached_session"):
220+
return self._cached_session
218221
session_id = self.request.form.get("esign_session_id[]", None)
219222
try:
220223
session_id = int(session_id)
221224
except (TypeError, ValueError):
222-
return []
223-
sessions = get_session_annotation()["sessions"]
224-
session = sessions.get(session_id)
225-
if not session:
226-
return []
227-
session = deepcopy(session)
228-
session["id"] = session_id
229-
return [session]
225+
return {}
226+
session = {}
227+
session_info = get_session_info(session_id)
228+
if session_info:
229+
session = {session_id: session_info}
230+
# caching
231+
self._cached_session = session
232+
return session
230233

231234
def get_table_rows(self, column):
232235
"""Get the table rows following the column"""

src/imio/esign/profiles/default/actions.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<property name="title" i18n:translate="">Add to esign session</property>
77
<property name="description" i18n:translate="">This will add this element or configured sub elements to the relevant esign session</property>
88
<property name="url_expr">string:${object/absolute_url}/@@add-to-esign-session</property>
9-
<property name="icon_expr"></property>
9+
<property name="icon_expr">string:$portal_url/++resource++imio.esign/add_to_esign_session.png</property>
1010
<property name="available_expr"></property>
1111
<property name="permissions">
1212
<element value="Manage portal"/>
@@ -17,8 +17,8 @@
1717
<property name="title" i18n:translate="">Remove from esign session</property>
1818
<property name="description" i18n:translate="">This will remove this element or configured sub elements from the relevant esign session</property>
1919
<property name="url_expr">string:${object/absolute_url}/@@remove-from-esign-session</property>
20-
<property name="icon_expr"></property>
21-
<property name="available_expr"></property>
20+
<property name="icon_expr">string:$portal_url/++resource++imio.esign/remove_from_esign_session.png</property>
21+
<property name="available_expr">object/@@remove-from-esign-session/available</property>
2222
<property name="permissions">
2323
<element value="Manage portal"/>
2424
</property>
@@ -28,7 +28,7 @@
2828
<property name="title" i18n:translate="">Remove item from esign session</property>
2929
<property name="description" i18n:translate="">This will remove this element from the relevant esign session</property>
3030
<property name="url_expr">string:${object/absolute_url}/@@remove-item-from-esign-session</property>
31-
<property name="icon_expr"></property>
31+
<property name="icon_expr">string:$portal_url/++resource++imio.esign/remove_item_from_esign_session.png</property>
3232
<property name="available_expr">object/@@remove-item-from-esign-session/available</property>
3333
<property name="permissions">
3434
<element value="Manage portal"/>

src/imio/esign/tests/test_actions.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
import unittest
1818

1919

20-
class TestRemoveItemFromSessionView(unittest.TestCase):
21-
"""Test RemoveItemFromSessionView browser view."""
20+
class BaseRemoveFromSession(unittest.TestCase):
21+
"""Base class to centralize setUp."""
2222

2323
layer = IMIO_ESIGN_INTEGRATION_TESTING
2424

@@ -73,6 +73,10 @@ def setUp(self):
7373
self.annexes.append(annex)
7474
self.signers = [("user1", "user1@sign.com", "User 1", "Position 1")]
7575

76+
77+
class TestRemoveItemFromSessionView(BaseRemoveFromSession):
78+
"""Test RemoveItemFromSessionView browser view."""
79+
7680
def test_available(self):
7781
"""Test available method returns True."""
7882
view = getMultiAdapter((self.annexes[0], self.request), name="remove-item-from-esign-session")
@@ -124,3 +128,27 @@ def test_finished_shows_message_and_redirects(self):
124128
self.assertEqual(len(messages), 1)
125129
self.assertIn("removed from session", messages[0].message)
126130
self.assertEqual(self.request.RESPONSE.getHeader("location"), self.annexes[0].absolute_url())
131+
132+
133+
class TestRemoveFromSessionView(BaseRemoveFromSession):
134+
"""Test RemoveFromSessionView browser view."""
135+
136+
def test_available(self):
137+
"""Test available method returns True."""
138+
annot = get_session_annotation()
139+
self.assertFalse(annot["sessions"])
140+
# only available on "context_uid"
141+
annex = self.annexes[0]
142+
view = getMultiAdapter((annex, self.request), name="remove-from-esign-session")
143+
self.assertFalse(view.available())
144+
add_files_to_session(self.signers, [annex.UID()])
145+
self.assertTrue(annot["sessions"])
146+
self.assertFalse(view.available())
147+
# available on parent
148+
folder = annex.aq_parent
149+
view = getMultiAdapter((folder, self.request), name="remove-from-esign-session")
150+
self.assertTrue(view.available())
151+
# call the view so context is removed so no more session
152+
view()
153+
self.assertFalse(annot["sessions"])
154+
self.assertFalse(view.available())

src/imio/esign/tests/test_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,9 +555,9 @@ def test_get_session_info(self):
555555
"""Test getting info about a given session id."""
556556
annot = get_session_annotation()
557557
self.assertEqual(len(annot["sessions"]), 0)
558-
self.assertIsNone(get_session_info(0))
559-
self.assertIsNone(get_session_info(1))
560-
self.assertIsNone(get_session_info(2))
558+
self.assertEqual(get_session_info(0), {})
559+
self.assertEqual(get_session_info(1), {})
560+
self.assertEqual(get_session_info(2), {})
561561
signers = [
562562
("user1", "user1@sign.com", "User 1", "Position 1"),
563563
("user2", "user2@sign.com", "User 2", "Position 2"),

0 commit comments

Comments
 (0)