Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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