Skip to content

Commit 8570d5f

Browse files
committed
Added tree structure of files to be signed on OMVersionsTable + Session ID column
1 parent 2d99573 commit 8570d5f

File tree

4 files changed

+144
-2
lines changed

4 files changed

+144
-2
lines changed

CHANGES.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ Changelog
4848
[chris-adam]
4949
- Replaced default actions bar by actionspanel for iconified categories.
5050
[chris-adam]
51+
- Added tree struture on OMVersionsTable for eSigned files.
52+
[chris-adam]
53+
- Added Session ID column on OMVersionsTable.
54+
[chris-adam]
5155

5256
3.0 (2021-09-30)
5357
----------------

imio/dms/mail/browser/configure.zcml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,14 @@
922922
provides="z3c.table.interfaces.IColumn"
923923
name="title-column"
924924
/>
925+
<adapter
926+
for="zope.interface.Interface
927+
zope.publisher.interfaces.browser.IBrowserRequest
928+
collective.dms.basecontent.browser.listing.VersionsTable"
929+
factory=".table.SessionIdColumn"
930+
provides="z3c.table.interfaces.IColumn"
931+
name="session-id-column"
932+
/>
925933

926934
<unconfigure package="imio.annex">
927935
<adapter

imio/dms/mail/browser/table.py

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@
22
from collective.contact.plonegroup.browser.tables import OrgaPrettyLinkWithAdditionalInfosColumn as opl_base
33
from collective.dms.basecontent.browser.listing import VersionsTable
44
from collective.dms.basecontent.browser.listing import VersionsTitleColumn
5+
from collective.eeafaceted.z3ctable.columns import BaseColumn
56
from collective.iconifiedcategory import utils as ic_utils
67
from collective.iconifiedcategory.browser.tabview import CategorizedContent
78
from collective.task import _ as _task
89
from html import escape # noqa F401
910
from imio.dms.mail import _
10-
from imio.dms.mail.adapters import OMApprovalAdapter
11+
from imio.dms.mail.interfaces import IOMApproval
12+
from imio.esign.config import get_registry_enabled
13+
from imio.esign.utils import get_session_annotation
1114
from imio.helpers.content import uuidToObject
1215
from plone import api
1316
from Products.CMFPlone.utils import safe_unicode
1417
from z3c.table.column import Column
1518
from z3c.table.table import Table
1619
from zope.cachedescriptors.property import CachedProperty
20+
from zope.component import getMultiAdapter
1721
from zope.component import getUtility
1822
from zope.i18n import translate
1923
from zope.schema.interfaces import IVocabularyFactory
@@ -72,6 +76,32 @@ def renderCell(self, content):
7276
)
7377

7478

79+
class SessionIdColumn(BaseColumn):
80+
""""""
81+
weight = 10
82+
escape = False
83+
84+
def renderHeadCell(self):
85+
return u'<img src="++resource++imio.esign/parapheo.svg" style="height:1em;vertical-align:middle"> ID'
86+
87+
def renderCell(self, content):
88+
session_id = self.table._session_annotation.get("uids", {}).get(content.UID, None)
89+
portal = api.portal.get()
90+
dashboard_link = getMultiAdapter((portal, portal.REQUEST), name="parapheo").get_dashboard_link({"id": session_id})
91+
if session_id is not None and len(self.table._approval.session_ids) > 1:
92+
return u'<a href={dashboard_link} title="{title}" class="pdf-session-badge">#{session_id}</span>'.format(
93+
dashboard_link=dashboard_link,
94+
title=translate(
95+
u"Paraphéo session ID: ${session_id}",
96+
domain="imio.dms.mail",
97+
context=content.REQUEST,
98+
mapping={'session_id': session_id},
99+
),
100+
session_id=session_id,
101+
)
102+
return u""
103+
104+
75105
class EnquirerColumn(Column):
76106
"""Tasks table viewlet. xss ok"""
77107

@@ -127,8 +157,90 @@ class IMVersionsTable(BaseVersionsTable):
127157

128158

129159
class OMVersionsTable(BaseVersionsTable):
160+
"""Versions table for outgoing mails with PDF child row indentation.
161+
162+
When the esign approval process generates PDF files from source files, the
163+
table reorders rows so each PDF child appears directly below its source, and
164+
adds a ``pdf-child-row`` CSS class for visual indentation (↳ arrow via CSS).
165+
166+
+----------------------------------+-----+--------+
167+
| Title | ... | signed |
168+
+----------------------------------+-----+--------+
169+
| [icon] Source file A | | |
170+
| ↳ #1 [icon] PDF of A | | ✔ | ← pdf-child-row
171+
| [icon] File B (no signature) | | |
172+
| [icon] Source file C | | |
173+
| ↳ #2 [icon] PDF of C | | ✔ | ← pdf-child-row
174+
+----------------------------------+-----+--------+
175+
176+
Notes:
177+
- The ``#N`` session badge (OMVersionsTitleColumn) appears only when the
178+
mail spans multiple esign sessions (len(approval.session_ids) > 1).
179+
"""
180+
130181
portal_types = ["dmsommainfile", "dmsappendixfile"]
131182

183+
@CachedProperty
184+
def _approval(self):
185+
return IOMApproval(self.context)
186+
187+
@CachedProperty
188+
def _session_annotation(self):
189+
return get_session_annotation()
190+
191+
@CachedProperty
192+
def _pdf_child_uids(self):
193+
"""Set of PDF-generated child file UIDs that are distinct from their source."""
194+
return set(
195+
uid for lst in self._approval.pdf_files_uids for uid in lst
196+
if uid not in self._approval.files_uids
197+
)
198+
199+
@property
200+
def values(self):
201+
"""
202+
Values (DMS files and appendixes) in orginal order except children are below their parent.
203+
Note: Children mean files generated for eSignature, parent is the file originally created by the user.
204+
"""
205+
if not getattr(self, '_v_stored_values', []):
206+
raw_data = BaseVersionsTable.values.fget(self)
207+
uid_to_content = {c.UID: c for c in raw_data}
208+
209+
# Build parent-to-children UID mapping
210+
parent_to_children_uids = {}
211+
for i, source_uid in enumerate(self._approval.files_uids):
212+
parent_to_children_uids[source_uid] = [
213+
uid for uid in self._approval.pdf_files_uids[i]
214+
if uid in self._pdf_child_uids
215+
]
216+
217+
# Build list of values in parent order, but with children below their parent
218+
result = []
219+
for content in raw_data:
220+
if content.UID in self._pdf_child_uids:
221+
continue # skip and insert later below parent
222+
result.append(content)
223+
for child_uid in parent_to_children_uids.get(content.UID, []):
224+
if child_uid in uid_to_content:
225+
result.append(uid_to_content[child_uid])
226+
227+
self._v_stored_values = result
228+
return self._v_stored_values
229+
230+
def setUpColumns(self):
231+
"""Removes SessionIdColumn if eSignature is disabled or this mail doesn't belong to any session"""
232+
columns = super(OMVersionsTable, self).setUpColumns()
233+
if not get_registry_enabled() or not self.context.UID() in self._session_annotation['c_uids']:
234+
columns = [col for col in columns if col.__name__ != "session-id-column"]
235+
return columns
236+
237+
def renderRow(self, row, cssClass=None):
238+
"""Render row with custom css class for children"""
239+
item = row[0][0]
240+
if item.UID in self._pdf_child_uids:
241+
cssClass = (cssClass + ' pdf-child-row') if cssClass else 'pdf-child-row'
242+
return super(OMVersionsTable, self).renderRow(row, cssClass)
243+
132244

133245
class OrgaPrettyLinkWithAdditionalInfosColumn(opl_base):
134246
"""Plonegroup organizations: removed additional infos. xss ok"""
@@ -219,7 +331,7 @@ class ApprovalTable(Table):
219331

220332
def __init__(self, context, request):
221333
super(ApprovalTable, self).__init__(context, request)
222-
self.approval = OMApprovalAdapter(self.context)
334+
self.approval = IOMApproval(self.context)
223335
self.portal = api.portal.getSite()
224336

225337
def setUpColumns(self):

imio/dms/mail/skins/imio_dms_mail/imiodmsmail.css.dtml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,24 @@ body.template-facetednavigation_view.portaltype-classificationsubfolder #content
566566
color: #75ad0a;
567567
}
568568

569+
/* esign PDF-generated version child rows - tree indentation */
570+
#fieldset-versions table.dv tr.pdf-child-row td a.version-link {
571+
padding-left: 20px;
572+
position: relative;
573+
}
574+
#fieldset-versions table.dv tr.pdf-child-row td a.version-link::before {
575+
content: "\21B3 ";
576+
position: absolute;
577+
left: 0;
578+
color: #888;
579+
}
580+
#fieldset-versions table.dv tr a.pdf-session-badge {
581+
color: #333;
582+
background: #eee;
583+
border-radius: 3px;
584+
vertical-align: middle;
585+
}
586+
569587
#collections-count-refresh {
570588
vertical-align: middle;
571589
margin-left: 1em;

0 commit comments

Comments
 (0)