Skip to content

Commit 2dda9ca

Browse files
committed
Moved base SessionAnnotationInfoView to imio.esign
1 parent 9422aad commit 2dda9ca

File tree

10 files changed

+31
-183
lines changed

10 files changed

+31
-183
lines changed

imio/dms/mail/Extensions/demo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from imio.dms.mail.interfaces import IOMApproval
1919
from imio.dms.mail.utils import create_period_folder
2020
from imio.dms.mail.utils import DummyView
21-
from imio.dms.mail.utils import persistent_to_native
21+
from imio.esign.utils import persistent_to_native
2222
from imio.helpers.content import find
2323
from imio.helpers.security import check_zope_admin
2424
from imio.helpers.workflow import do_transitions

imio/dms/mail/browser/actionspanel.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from imio.actionspanel.browser.views import ActionsPanelView
44
from imio.dms.mail.dmsmail import filter_dmsincomingmail_assigned_users
55
from imio.helpers.cache import get_plone_groups_for_user
6-
from imio.helpers.security import check_zope_admin
76
from plone import api
87
from plone.memoize import ram
98
from Products.CMFPlone.interfaces import IHideFromBreadcrumbs
@@ -166,8 +165,7 @@ class SigningFieldsetActionsPanelView(ActionsPanelView):
166165

167166
def __init__(self, context, request):
168167
super(SigningFieldsetActionsPanelView, self).__init__(context, request)
169-
self.ACCEPTABLE_ACTIONS = ["edit", "approvals"]
170-
self.SECTIONS_TO_RENDER += ("renderSigningAnnotationInfo",)
168+
self.ACCEPTABLE_ACTIONS = ["edit", "approvals", "session-annotation-info"]
171169

172170
@property
173171
def fieldset(self):
@@ -178,11 +176,6 @@ def renderEdit(self):
178176
return ViewPageTemplateFile("templates/fieldset_actions_panel_edit.pt")(self)
179177
return ""
180178

181-
def renderSigningAnnotationInfo(self):
182-
if check_zope_admin():
183-
return ViewPageTemplateFile("templates/fieldset_actions_panel_signing_annotation_info.pt")(self)
184-
return ""
185-
186179
@ram.cache(actionspanelview_cachekey)
187180
def SigningFieldsetActionsPanelView__call__(
188181
self,

imio/dms/mail/browser/configure.zcml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@
5757

5858
<browser:page
5959
for="imio.dms.mail.dmsmail.IImioDmsOutgoingMail"
60-
name="signing-annotation-info"
61-
class=".views.SigningAnnotationInfoView"
60+
name="session-annotation-info"
61+
class=".views.OMSessionAnnotationInfoView"
6262
permission="cmf.ManagePortal"
63+
template="templates/session_annotation_info.pt"
6364
/>
6465

6566
<browser:page

imio/dms/mail/browser/templates/fieldset_actions_panel_edit.pt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
<a tal:condition="useIcons"
77
tal:attributes="href string:${context/absolute_url}/edit${view/fieldset};
88
class python: view.kwargs.get('edit_action_class', '');
9-
target python: view.kwargs.get('edit_action_target', '_parent');"
10-
target="_parent">
9+
target python: view.kwargs.get('edit_action_target', '_parent');">
1110
<img src="edit.gif" tal:attributes="src string:${view/portal_url}/edit.png" title="Edit" i18n:attributes="title" />
1211
</a>
1312
<tal:comment replace="nothing">Button</tal:comment>

imio/dms/mail/browser/templates/fieldset_actions_panel_signing_annotation_info.pt

Lines changed: 0 additions & 16 deletions
This file was deleted.

imio/dms/mail/browser/templates/signing_annotation_info.pt renamed to imio/dms/mail/browser/templates/session_annotation_info.pt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
xmlns:metal="http://xml.zope.org/namespaces/metal"
44
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
55
metal:use-macro="context/main_template/macros/master"
6-
i18n:domain="imio.dms.mail">
6+
i18n:domain="imio.esign">
77
<body>
88
<metal:bodytext fill-slot="content-core">
99
<h2>idm.approval annotation</h2>

imio/dms/mail/browser/views.py

Lines changed: 3 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
# -*- coding: utf-8 -*-
22
from AccessControl import getSecurityManager
3-
from AccessControl import Unauthorized
43
from Acquisition import aq_inner
54
from collective.ckeditortemplates.cktemplate import ICKTemplate
65
from datetime import datetime
76
from eea.faceted.vocabularies.autocomplete import IAutocompleteSuggest
8-
from html import escape
97
from imio.dms.mail import _
108
from imio.dms.mail import _tr
119
from imio.dms.mail import PMH_ENABLED
@@ -17,13 +15,13 @@
1715
from imio.dms.mail.interfaces import IPersonnelContact
1816
from imio.dms.mail.utils import current_user_groups_ids
1917
from imio.dms.mail.utils import get_dms_config
20-
from imio.dms.mail.utils import persistent_to_native
2118
from imio.esign import manage_session_perm
2219
from imio.esign.browser.actions import RemoveItemFromSessionView
20+
from imio.esign.browser.actions import SessionAnnotationInfoView
2321
from imio.esign.browser.views import ExternalSessionCreateView
2422
from imio.esign.browser.views import SessionsListingView
2523
from imio.esign.config import get_registry_enabled
26-
from imio.esign.utils import get_session_annotation
24+
from imio.esign.utils import persistent_to_native
2725
from imio.esign.utils import remove_files_from_session
2826
from imio.helpers.content import richtextval
2927
from imio.helpers.content import uuidToObject
@@ -32,7 +30,6 @@
3230
from imio.helpers.emailer import get_mail_host
3331
from imio.helpers.emailer import send_email
3432
from imio.helpers.fancytree.views import BaseRenderFancyTree
35-
from imio.helpers.security import check_zope_admin
3633
from imio.helpers.workflow import do_transitions
3734
from imio.helpers.xhtml import object_link
3835
from plone import api
@@ -55,8 +52,6 @@
5552
from zope.pagetemplate.pagetemplate import PageTemplate
5653

5754
import json
58-
import pprint
59-
import re
6055

6156

6257
class CreateFromTemplateForm(BaseRenderFancyTree):
@@ -677,74 +672,12 @@ def get_link_url(item):
677672
return result
678673

679674

680-
class SigningAnnotationInfoView(BrowserView):
675+
class OMSessionAnnotationInfoView(SessionAnnotationInfoView):
681676
"""Admin-only view displaying idm.approval and imio.esign session annotations for an outgoing mail."""
682677

683-
index = ViewPageTemplateFile("templates/signing_annotation_info.pt")
684-
685-
def __call__(self):
686-
if not check_zope_admin():
687-
raise Unauthorized
688-
return self.index()
689-
690-
def _uid_to_link(self, uid):
691-
"""Return an HTML link for an object UID, or the UID if not found."""
692-
obj = uuidToObject(uid, unrestricted=True)
693-
if obj is None:
694-
return u"<span title='not found'>{}</span>".format(safe_unicode(uid))
695-
url = escape(obj.absolute_url(), quote=True)
696-
path = escape(u"/".join(obj.getPhysicalPath()))
697-
title = escape(safe_unicode(getattr(obj, "title", "") or path))
698-
return u"<a href='{}' title='{}'>{}</a>".format(url, path, title)
699-
700-
def _render_value(self, value, indent=u""):
701-
"""Render a value, replacing UIDs with links where possible."""
702-
inner = indent + u" "
703-
if isinstance(value, dict):
704-
if not value:
705-
return u"{}"
706-
lines = [u"{"]
707-
for k, v in sorted(value.items()):
708-
key = escape(safe_unicode(pprint.pformat(k)))
709-
lines.append(u"{}{}: {},".format(inner, key, self._render_value(v, inner)))
710-
lines.append(u"{}}}".format(indent))
711-
return u"\n".join(lines)
712-
elif isinstance(value, (list, tuple)):
713-
if not value:
714-
return u"[]"
715-
lines = [u"["]
716-
for item in value:
717-
lines.append(u"{}{},".format(inner, self._render_value(item, inner)))
718-
lines.append(u"{}]".format(indent))
719-
return u"\n".join(lines)
720-
elif isinstance(value, basestring) and re.match(r"^[0-9a-f]{32}$", value):
721-
# Looks like a UUID
722-
return self._uid_to_link(value)
723-
else:
724-
return escape(safe_unicode(pprint.pformat(value)))
725-
726678
@property
727679
def approval_annot_html(self):
728680
"""Renders approval annot in HTML"""
729681
approval = IOMApproval(self.context)
730682
native = persistent_to_native(approval.annot)
731683
return self._render_value(native)
732-
733-
@property
734-
def esign_sessions(self):
735-
"""Return list of (session_id, session_data) for all sessions."""
736-
approval = IOMApproval(self.context)
737-
session_ids = approval.annot.get("session_ids", [])
738-
if not session_ids:
739-
return []
740-
annot = get_session_annotation()
741-
result = []
742-
for session_id in session_ids:
743-
session = annot.get("sessions", {}).get(session_id)
744-
if session is not None:
745-
result.append((session_id, persistent_to_native(session)))
746-
return sorted(result)
747-
748-
def esign_session_html(self, session_data):
749-
"""Renders esign session annot in HTML"""
750-
return self._render_value(session_data)

imio/dms/mail/profiles/default/types/dmsoutgoingmail.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,9 @@
2222
<element value="task"/>
2323
</property>
2424
<alias from="edit" to="@@dmsdocument-edit"/>
25+
<action title="Annotation info" action_id="session-annotation-info" category="object_buttons" condition_expr=""
26+
description="" icon_expr="string:${portal_url}/info.png" link_target="_blank"
27+
url_expr="string:${object/absolute_url}/@@session-annotation-info" visible="True">
28+
<permission value="cmf.ManagePortal"/>
29+
</action>
2530
</object>

imio/dms/mail/tests/test_views.py

Lines changed: 16 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
# -*- coding: utf-8 -*-
22
"""Test views."""
33

4-
from AccessControl import Unauthorized
54
from collective.dms.mailcontent.dmsmail import internalReferenceOutgoingMailDefaultValue
65
from collective.iconifiedcategory.utils import calculate_category_id
76
from collective.MockMailHost.MockMailHost import MockMailHost
87
from datetime import datetime
98
from HTMLParser import HTMLParser
109
from imio.dms.mail import PERIODS
1110
from imio.dms.mail import PRODUCT_DIR
11+
from imio.dms.mail.browser.views import OMSessionAnnotationInfoView
1212
from imio.dms.mail.browser.views import parse_query
13-
from imio.dms.mail.browser.views import SigningAnnotationInfoView
1413
from imio.dms.mail.interfaces import IOMApproval
1514
from imio.dms.mail.testing import change_user
1615
from imio.dms.mail.testing import DMSMAIL_INTEGRATION_TESTING
@@ -26,7 +25,6 @@
2625
from plone.app.testing import login
2726
from plone.dexterity.utils import createContentInContainer
2827
from plone.namedfile.file import NamedBlobFile
29-
from Products.CMFPlone.utils import safe_unicode
3028
from z3c.relationfield import RelationValue
3129
from zope.component import getUtility
3230
from zope.i18n import translate
@@ -318,16 +316,16 @@ def test_call(self):
318316
self.assertIn(u">5032 Isnes<", rendered)
319317

320318

321-
class TestSigningAnnotationInfoView(unittest.TestCase, ImioTestHelpers):
322-
"""Test SigningAnnotationInfoView"""
319+
class TestOMSessionAnnotationInfoView(unittest.TestCase, ImioTestHelpers):
320+
"""Test OMSessionAnnotationInfoView"""
323321

324322
layer = DMSMAIL_INTEGRATION_TESTING
325323

326324
def setUp(self):
327325
self.portal = self.layer["portal"]
328326
change_user(self.portal)
329327
self.om1 = get_object(oid="reponse1", ptype="dmsoutgoingmail")
330-
self.view = SigningAnnotationInfoView(self.om1, self.portal.REQUEST)
328+
self.view = OMSessionAnnotationInfoView(self.om1, self.portal.REQUEST)
331329
self.pf = self.portal["contacts"]["personnel-folder"]
332330
self.pgof = self.portal["contacts"]["plonegroup-organization"]
333331

@@ -394,68 +392,12 @@ def _approve_all_files(self, omail, files, approval):
394392
approval.approve_file(files[1], "bourgmestre", transition="propose_to_be_signed")
395393
approval.approve_file(files[0], "bourgmestre", transition="propose_to_be_signed")
396394

397-
def test_call(self):
398-
with self.assertRaises(Unauthorized):
399-
self.view()
400-
login(self.portal.aq_parent, "admin")
401-
self.assertIsInstance(self.view(), basestring)
402-
403-
def test_render_value(self):
404-
# Dict
405-
self.assertEqual(self.view._render_value({}), u"{}")
406-
self.assertEqual(
407-
self.view._render_value({"key": "val"}),
408-
u"{\n &#x27;key&#x27;: &#x27;val&#x27;,\n}",
409-
)
410-
411-
# Indentation: nested value increases indent level
412-
self.assertEqual(
413-
self.view._render_value({"key": ["a"]}),
414-
u"{\n &#x27;key&#x27;: [\n &#x27;a&#x27;,\n ],\n}",
415-
)
416-
417-
# List
418-
self.assertEqual(self.view._render_value([]), u"[]")
419-
self.assertEqual(
420-
self.view._render_value(["a", "b"]),
421-
u"[\n &#x27;a&#x27;,\n &#x27;b&#x27;,\n]",
422-
)
423-
424-
# Tuple
425-
self.assertEqual(self.view._render_value(()), u"[]")
426-
427-
# String
428-
self.assertEqual(self.view._render_value(u"hello"), u"u&#x27;hello&#x27;")
429-
430-
# UID not found
431-
fake_uid = u"a" * 32
432-
self.assertEqual(
433-
self.view._render_value(fake_uid),
434-
u"<span title='not found'>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</span>",
435-
)
436-
437-
# UID found
438-
self.assertEqual(
439-
self.view._render_value(self.om1.UID()),
440-
u"<a href='http://nohost/plone/outgoing-mail/202608/reponse1' title='/plone/outgoing-mail/202608/reponse1'>R\xe9ponse 1</a>",
441-
)
442-
443-
def test_uid_to_link(self):
444-
uid = self.om1.UID()
445-
result = self.view._uid_to_link(uid)
446-
self.assertIn(u"<a href=", result)
447-
self.assertIn(self.om1.absolute_url(), result)
448-
449-
result = self.view._uid_to_link(u"a" * 32)
450-
self.assertIn(u"<span", result)
451-
self.assertIn(u"not found", result)
452-
453-
def test_approval_and_esign_sessions(self):
454-
"""Test approval_annot_html and esign_session_html after a true approval process."""
395+
def test_annot_html(self):
396+
"""Test approval_annot_html and esign_session_html."""
455397
omail, files, approval = self._setup_esign_omail()
456398
self._approve_all_files(omail, files, approval)
457399

458-
view = SigningAnnotationInfoView(omail, self.portal.REQUEST)
400+
view = OMSessionAnnotationInfoView(omail, self.portal.REQUEST)
459401

460402
# approval annot html
461403
self.assertEqual(
@@ -501,15 +443,15 @@ def test_approval_and_esign_sessions(self):
501443
False,
502444
],
503445
'files': [
504-
<a href='http://nohost/plone/outgoing-mail/202608/om-esign/file0' title='/plone/outgoing-mail/202608/om-esign/file0'>Réponse salle.odt</a>,
505-
<a href='http://nohost/plone/outgoing-mail/202608/om-esign/file1' title='/plone/outgoing-mail/202608/om-esign/file1'>Réponse salle.odt</a>,
446+
<a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/file0/view' title='/plone/outgoing-mail/{folder_name}/om-esign/file0'>Réponse salle.odt</a>,
447+
<a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/file1/view' title='/plone/outgoing-mail/{folder_name}/om-esign/file1'>Réponse salle.odt</a>,
506448
],
507449
'pdf_files': [
508450
[
509-
<a href='http://nohost/plone/outgoing-mail/202608/om-esign/reponse-salle.pdf' title='/plone/outgoing-mail/202608/om-esign/reponse-salle.pdf'>Réponse salle.pdf</a>,
451+
<a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle.pdf/view' title='/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle.pdf'>Réponse salle.pdf</a>,
510452
],
511453
[
512-
<a href='http://nohost/plone/outgoing-mail/202608/om-esign/reponse-salle-1.pdf' title='/plone/outgoing-mail/202608/om-esign/reponse-salle-1.pdf'>Réponse salle.pdf</a>,
454+
<a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle-1.pdf/view' title='/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle-1.pdf'>Réponse salle.pdf</a>,
513455
],
514456
],
515457
'session_ids': [
@@ -532,6 +474,7 @@ def test_approval_and_esign_sessions(self):
532474
repr(approval.annot["approval"][0][1]["approved_on"]),
533475
repr(approval.annot["approval"][1][0]["approved_on"]),
534476
repr(approval.annot["approval"][1][1]["approved_on"]),
477+
folder_name=omail.__parent__.__name__,
535478
),
536479
)
537480

@@ -551,20 +494,20 @@ def test_approval_and_esign_sessions(self):
551494
'discriminators': [],
552495
'files': [
553496
{{
554-
'context_uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign' title='/plone/outgoing-mail/{folder_name}/om-esign'>Courrier test esign</a>,
497+
'context_uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/view' title='/plone/outgoing-mail/{folder_name}/om-esign'>Courrier test esign</a>,
555498
'filename': u'R\\xe9ponse salle__{pdf1_uid}.pdf',
556499
'scan_id': '012999900000601',
557500
'status': '',
558501
'title': u'R\\xe9ponse salle.pdf',
559-
'uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle.pdf' title='/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle.pdf'>Réponse salle.pdf</a>,
502+
'uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle.pdf/view' title='/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle.pdf'>Réponse salle.pdf</a>,
560503
}},
561504
{{
562-
'context_uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign' title='/plone/outgoing-mail/{folder_name}/om-esign'>Courrier test esign</a>,
505+
'context_uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/view' title='/plone/outgoing-mail/{folder_name}/om-esign'>Courrier test esign</a>,
563506
'filename': u'R\\xe9ponse salle__{pdf2_uid}.pdf',
564507
'scan_id': '012999900000601',
565508
'status': '',
566509
'title': u'R\\xe9ponse salle.pdf',
567-
'uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle-1.pdf' title='/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle-1.pdf'>Réponse salle.pdf</a>,
510+
'uid': <a href='http://nohost/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle-1.pdf/view' title='/plone/outgoing-mail/{folder_name}/om-esign/reponse-salle-1.pdf'>Réponse salle.pdf</a>,
568511
}},
569512
],
570513
'last_update': {last_update},

0 commit comments

Comments
 (0)