|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | from AccessControl import getSecurityManager |
| 3 | +from AccessControl import Unauthorized |
3 | 4 | from Acquisition import aq_inner |
4 | 5 | from collective.ckeditortemplates.cktemplate import ICKTemplate |
5 | 6 | from datetime import datetime |
|
15 | 16 | from imio.dms.mail.interfaces import IPersonnelContact |
16 | 17 | from imio.dms.mail.utils import current_user_groups_ids |
17 | 18 | from imio.dms.mail.utils import get_dms_config |
| 19 | +from imio.dms.mail.utils import persistent_to_native |
18 | 20 | from imio.esign import manage_session_perm |
19 | 21 | from imio.esign.browser.views import ExternalSessionCreateView |
20 | 22 | from imio.esign.browser.views import SessionsListingView |
21 | 23 | from imio.esign.config import get_registry_enabled |
| 24 | +from imio.esign.utils import get_session_annotation |
22 | 25 | from imio.helpers.content import richtextval |
23 | 26 | from imio.helpers.content import uuidToObject |
24 | 27 | from imio.helpers.emailer import add_attachment |
25 | 28 | from imio.helpers.emailer import create_html_email |
26 | 29 | from imio.helpers.emailer import get_mail_host |
27 | 30 | from imio.helpers.emailer import send_email |
28 | 31 | from imio.helpers.fancytree.views import BaseRenderFancyTree |
| 32 | +from imio.helpers.security import check_zope_admin |
29 | 33 | from imio.helpers.workflow import do_transitions |
30 | 34 | from imio.helpers.xhtml import object_link |
31 | 35 | from plone import api |
|
48 | 52 | from zope.pagetemplate.pagetemplate import PageTemplate |
49 | 53 |
|
50 | 54 | import json |
| 55 | +import pprint |
51 | 56 |
|
52 | 57 |
|
53 | 58 | class CreateFromTemplateForm(BaseRenderFancyTree): |
@@ -643,3 +648,76 @@ def get_link_url(item): |
643 | 648 | result = sorted(result, key=lambda x: x['id'] == "plus") |
644 | 649 |
|
645 | 650 | return result |
| 651 | + |
| 652 | + |
| 653 | +class SigningAnnotationInfoView(BrowserView): |
| 654 | + """Admin-only view displaying idm.approval and imio.esign session annotations for an outgoing mail.""" |
| 655 | + |
| 656 | + index = ViewPageTemplateFile("templates/signing_annotation_info.pt") |
| 657 | + |
| 658 | + def __call__(self): |
| 659 | + if not check_zope_admin(): |
| 660 | + raise Unauthorized |
| 661 | + return self.index() |
| 662 | + |
| 663 | + def _uid_to_link(self, uid): |
| 664 | + """Return an HTML link for an object UID, or the UID if not found.""" |
| 665 | + obj = uuidToObject(uid, unrestricted=True) |
| 666 | + if obj is None: |
| 667 | + return u"<span title='not found'>{}</span>".format(safe_unicode(uid)) |
| 668 | + url = obj.absolute_url() |
| 669 | + title = safe_unicode(getattr(obj, 'title', '') or uid) |
| 670 | + path = u"/".join(obj.getPhysicalPath()) |
| 671 | + return u"<a href='{}' title='{}'>{}</a>".format(url, path, title) |
| 672 | + |
| 673 | + def _render_value(self, value, indent=u""): |
| 674 | + """Render a value, replacing UIDs with links where possible.""" |
| 675 | + inner = indent + u" " |
| 676 | + if isinstance(value, dict): |
| 677 | + if not value: |
| 678 | + return u"{}" |
| 679 | + lines = [u"{"] |
| 680 | + for k, v in sorted(value.items()): |
| 681 | + lines.append(u"{}{!r}: {},".format(inner, k, self._render_value(v, inner))) |
| 682 | + lines.append(u"{}}}".format(indent)) |
| 683 | + return u"\n".join(lines) |
| 684 | + elif isinstance(value, (list, tuple)): |
| 685 | + if not value: |
| 686 | + return u"[]" |
| 687 | + lines = [u"["] |
| 688 | + for item in value: |
| 689 | + lines.append(u"{}{},".format(inner, self._render_value(item, inner))) |
| 690 | + lines.append(u"{}]".format(indent)) |
| 691 | + return u"\n".join(lines) |
| 692 | + elif isinstance(value, basestring) and len(value) == 32 and value.isalnum(): |
| 693 | + # Looks like a UUID |
| 694 | + return self._uid_to_link(value) |
| 695 | + else: |
| 696 | + return safe_unicode(pprint.pformat(value)) |
| 697 | + |
| 698 | + @property |
| 699 | + def approval_annot_html(self): |
| 700 | + approval = IOMApproval(self.context) |
| 701 | + native = persistent_to_native(approval.annot) |
| 702 | + return self._render_value(native) |
| 703 | + |
| 704 | + @property |
| 705 | + def esign_session_id(self): |
| 706 | + approval = IOMApproval(self.context) |
| 707 | + return approval.annot.get("session_id") |
| 708 | + |
| 709 | + @property |
| 710 | + def esign_session(self): |
| 711 | + session_id = self.esign_session_id |
| 712 | + if session_id is None: |
| 713 | + return None |
| 714 | + annot = get_session_annotation() |
| 715 | + return annot["sessions"].get(session_id) |
| 716 | + |
| 717 | + @property |
| 718 | + def esign_session_html(self): |
| 719 | + session = self.esign_session |
| 720 | + if session is None: |
| 721 | + return u"" |
| 722 | + native = persistent_to_native(session) |
| 723 | + return self._render_value(native) |
0 commit comments