Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Changelog
[chris-adam, sgeulette]
- Added "Open Paraphéo" button on sessions listing view.
[chris-adam]
- Improved file ordering in session.
[chris-adam]

1.0b8 (2026-05-08)
------------------
Expand Down
10 changes: 10 additions & 0 deletions src/imio/esign/adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ def get_context_uid(self):
return None


class DefaultItemOrderProvider(object):
"""Default adapter that orders items by their position in the context container."""

def __init__(self, context):
self.context = context

def get_item_order(self):
return {a.UID(): idx for idx, a in enumerate(self.context.values())}


class FilesBelongingToAGivenSession(object):
def __init__(self, context):
self.context = context
Expand Down
5 changes: 5 additions & 0 deletions src/imio/esign/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
provides=".interfaces.IContextUidProvider"
for="*" />

<adapter
factory=".adapters.DefaultItemOrderProvider"
provides=".interfaces.IItemOrderProvider"
for="*" />

<adapter for="*"
factory=".adapters.FilesBelongingToAGivenSession"
provides="collective.compoundcriterion.interfaces.ICompoundCriterionFilter"
Expand Down
9 changes: 9 additions & 0 deletions src/imio/esign/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,12 @@ class IContextUidProvider(Interface):

def get_context_uid():
"""Return the context UID for the file to sign."""


class IItemOrderProvider(Interface):
"""Adapter to provide item ordering within a context."""

def get_item_order():
"""Return a dict mapping item UID to sort position (int).
Items not in the dict get position -1.
"""
37 changes: 37 additions & 0 deletions src/imio/esign/tests/test_adapters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-

from imio.esign.adapters import DefaultContextUidProvider
from imio.esign.interfaces import IContextUidProvider
from imio.esign.interfaces import IItemOrderProvider
from imio.esign.tests.base import BaseEsignTest
from plone import api
from zope.component import getAdapter


class TestDefaultContextUidProvider(BaseEsignTest):

def test_get_context_uid(self):
annex = self.portal["folder0"]["annex0"]
provider = getAdapter(annex, IContextUidProvider)
self.assertEqual(provider.get_context_uid(), self.portal["folder0"].UID())

class Dummy(object):
pass

provider = DefaultContextUidProvider(Dummy())
self.assertIsNone(provider.get_context_uid())


class TestDefaultItemOrderProvider(BaseEsignTest):

def test_get_item_order(self):
folder = self.portal["folder0"]
provider = getAdapter(folder, IItemOrderProvider)
order = provider.get_item_order()
children = list(folder.values())
for idx, child in enumerate(children):
self.assertEqual(order[child.UID()], idx)

empty = api.content.create(container=self.portal, type="Folder", id="empty-folder")
provider = getAdapter(empty, IItemOrderProvider)
self.assertEqual(provider.get_item_order(), {})
3 changes: 2 additions & 1 deletion src/imio/esign/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from imio.esign.config import get_esign_registry_sign_code
from imio.esign.config import get_esign_registry_vat_number
from imio.esign.interfaces import IContextUidProvider
from imio.esign.interfaces import IItemOrderProvider
from imio.helpers.content import uuidToObject
from imio.helpers.transmogrifier import get_correct_id
from imio.helpers.ws import get_auth_token
Expand Down Expand Up @@ -152,7 +153,7 @@ def add_files_to_session( # noqa C901
# Insert alongside other files from the same context, ordered by position
context = uuidToObject(context_uid)
if context is not None:
uid_order = {a.UID(): idx for idx, a in enumerate(context.values())}
uid_order = getAdapter(context, IItemOrderProvider).get_item_order()
else:
uid_order = {}
files = session["files"][context_start_idx : context_end_idx + 1]
Expand Down
Loading