Skip to content

Commit f4aae3d

Browse files
committed
Files added to session are inserted alongside other files from the same context, ordered by position
1 parent 94c7b5e commit f4aae3d

File tree

3 files changed

+73
-13
lines changed

3 files changed

+73
-13
lines changed

CHANGES.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ Changelog
2929
[chris-adam]
3030
- Added external watchers for esign sessions.
3131
[chris-adam, sgeulette]
32+
- Files added to session are inserted alongside other files from the same context, ordered by position.
33+
[chris-adam]
3234

3335
1.0a2 (2026-02-06)
3436
------------------

src/imio/esign/tests/test_utils.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,10 @@ def test_create_external_session(self):
350350
files_param = call_args[1]["files"]
351351
self.assertEqual(len(files_param), 3)
352352
self.assertEqual(files_param[0][0], "files")
353-
self.assertEqual(files_param[0][1][0], u"annex4.pdf")
353+
self.assertEqual(files_param[0][1][0], u"annex1-1.pdf")
354354
self.assertEqual(files_param[1][0], "files")
355-
self.assertEqual(files_param[1][1][0], u"annex1.pdf")
356-
self.assertEqual(files_param[2][1][0], u"annex1-1.pdf")
355+
self.assertEqual(files_param[1][1][0], u"annex4.pdf")
356+
self.assertEqual(files_param[2][1][0], u"annex1.pdf")
357357

358358
# Case 6: session without files to send => returns "_no_files_", no HTTP call
359359
for i in range(len(session3["files"])):
@@ -422,6 +422,41 @@ def test_session_size_discrimination(self):
422422
self.assertIs(session3, session2)
423423
self.assertEqual(session3["size"], 7014 + 6968)
424424

425+
def test_add_files_ordering_by_context(self):
426+
"""Files added to a session are ordered by their position within their context."""
427+
def reset_annotation():
428+
annot = get_session_annotation()
429+
annot["sessions"].clear()
430+
annot["uids"].clear()
431+
annot["c_uids"].clear()
432+
annot["numbering"] = 0
433+
434+
signers = [("user1", "user1@sign.com", "User 1", "Position 1")]
435+
436+
# Case 1: uid[0] then uid[1] (different context) then uid[2] (same context as uid[0])
437+
# uid[2] must land immediately after uid[0], not after uid[1]
438+
reset_annotation()
439+
sid, session = add_files_to_session(signers, (self.uids[0],))
440+
sid, session = add_files_to_session(signers, (self.uids[1],), session_id=sid)
441+
sid, session = add_files_to_session(signers, (self.uids[2],), session_id=sid)
442+
self.assertEqual([f["uid"] for f in session["files"]], [self.uids[0], self.uids[2], self.uids[1]])
443+
444+
# Case 2: uid[4] (3rd in folder0) added before uid[0] (1st in folder0)
445+
# uid[0] must land before uid[4]
446+
reset_annotation()
447+
sid, session = add_files_to_session(signers, (self.uids[4],))
448+
sid, session = add_files_to_session(signers, (self.uids[0],), session_id=sid)
449+
self.assertEqual([f["uid"] for f in session["files"]], [self.uids[0], self.uids[4]])
450+
451+
# Case 3: uid[0], uid[4] in session, then uid[1] (different context), then uid[2]
452+
# uid[2] must be inserted between uid[0] and uid[4]
453+
reset_annotation()
454+
sid, session = add_files_to_session(signers, (self.uids[0],))
455+
sid, session = add_files_to_session(signers, (self.uids[4],), session_id=sid)
456+
sid, session = add_files_to_session(signers, (self.uids[1],), session_id=sid)
457+
sid, session = add_files_to_session(signers, (self.uids[2],), session_id=sid)
458+
self.assertEqual([f["uid"] for f in session["files"]], [self.uids[0], self.uids[2], self.uids[4], self.uids[1]])
459+
425460
def test_add_files_with_duplicate_filenames(self):
426461
"""Test that files with duplicate filenames are renamed with suffix."""
427462
annot = get_session_annotation()

src/imio/esign/utils.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,42 @@ def add_files_to_session(
8585
context_uid = context_uid_provider.get_context_uid()
8686
filename, ext = path.splitext(annex.file.filename or "no_filename.pdf")
8787
new_filename = get_correct_id(existing_files, filename)
88-
session["files"].append(
89-
{
90-
"scan_id": annex.scan_id,
91-
"filename": new_filename + ext,
92-
"title": annex.title or "no_title",
93-
"uid": uid,
94-
"context_uid": context_uid,
95-
"status": "",
96-
}
97-
)
88+
file_dict = {
89+
"scan_id": annex.scan_id,
90+
"filename": new_filename + ext,
91+
"title": annex.title or "no_title",
92+
"uid": uid,
93+
"context_uid": context_uid,
94+
"status": "",
95+
}
96+
# Find the range of files already belonging to this context (if any)
97+
context_start_idx, context_end_idx = None, None
98+
for i, f in enumerate(session["files"]):
99+
if f["context_uid"] == context_uid:
100+
if context_start_idx is None:
101+
context_start_idx = i
102+
context_end_idx = i
103+
elif context_start_idx is not None:
104+
break
105+
if context_start_idx is None:
106+
# No files from this context yet, append at end
107+
session["files"].append(file_dict)
108+
else:
109+
# Insert alongside other files from the same context, ordered by position
110+
context = uuidToObject(context_uid)
111+
if context is not None:
112+
uid_order = {a.UID(): idx for idx, a in enumerate(context.values())}
113+
else:
114+
uid_order = {}
115+
files = session["files"][context_start_idx:context_end_idx + 1]
116+
files.append(file_dict)
117+
session["files"][context_start_idx:context_end_idx + 1] = sorted(
118+
files, key=lambda f: uid_order.get(f["uid"], -1)
119+
)
98120
existing_files.append(new_filename)
99121
annot["uids"][uid] = session_id
100122
annot["c_uids"].setdefault(context_uid, PersistentList()).append(uid)
123+
101124
if session["client_id"] is None:
102125
# FIXME what if scan_id is None ?
103126
session["client_id"] = session["files"][0]["scan_id"][0:7]

0 commit comments

Comments
 (0)