|
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 |
6 | 7 | from eea.faceted.vocabularies.autocomplete import IAutocompleteSuggest |
| 8 | +from html import escape |
7 | 9 | from imio.dms.mail import _ |
8 | 10 | from imio.dms.mail import _tr |
9 | 11 | from imio.dms.mail import PMH_ENABLED |
|
15 | 17 | from imio.dms.mail.interfaces import IPersonnelContact |
16 | 18 | from imio.dms.mail.utils import current_user_groups_ids |
17 | 19 | from imio.dms.mail.utils import get_dms_config |
| 20 | +from imio.dms.mail.utils import persistent_to_native |
18 | 21 | from imio.esign import manage_session_perm |
19 | 22 | from imio.esign.browser.actions import RemoveItemFromSessionView |
20 | 23 | from imio.esign.browser.views import ExternalSessionCreateView |
21 | 24 | from imio.esign.browser.views import SessionsListingView |
22 | 25 | from imio.esign.config import get_registry_enabled |
| 26 | +from imio.esign.utils import get_session_annotation |
23 | 27 | from imio.esign.utils import remove_files_from_session |
24 | 28 | from imio.helpers.content import richtextval |
25 | 29 | from imio.helpers.content import uuidToObject |
|
28 | 32 | from imio.helpers.emailer import get_mail_host |
29 | 33 | from imio.helpers.emailer import send_email |
30 | 34 | from imio.helpers.fancytree.views import BaseRenderFancyTree |
| 35 | +from imio.helpers.security import check_zope_admin |
31 | 36 | from imio.helpers.workflow import do_transitions |
32 | 37 | from imio.helpers.xhtml import object_link |
33 | 38 | from plone import api |
|
50 | 55 | from zope.pagetemplate.pagetemplate import PageTemplate |
51 | 56 |
|
52 | 57 | import json |
| 58 | +import pprint |
| 59 | +import re |
53 | 60 |
|
54 | 61 |
|
55 | 62 | class CreateFromTemplateForm(BaseRenderFancyTree): |
@@ -668,3 +675,73 @@ def get_link_url(item): |
668 | 675 | result = sorted(result, key=lambda x: x['id'] == "plus") |
669 | 676 |
|
670 | 677 | return result |
| 678 | + |
| 679 | + |
| 680 | +class SigningAnnotationInfoView(BrowserView): |
| 681 | + """Admin-only view displaying idm.approval and imio.esign session annotations for an outgoing mail.""" |
| 682 | + |
| 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 = obj.absolute_url() |
| 696 | + title = escape(safe_unicode(getattr(obj, 'title', '') or uid)) |
| 697 | + path = escape(u"/".join(obj.getPhysicalPath())) |
| 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 | + lines.append(u"{}{!r}: {},".format(inner, k, self._render_value(v, inner))) |
| 709 | + lines.append(u"{}}}".format(indent)) |
| 710 | + return u"\n".join(lines) |
| 711 | + elif isinstance(value, (list, tuple)): |
| 712 | + if not value: |
| 713 | + return u"[]" |
| 714 | + lines = [u"["] |
| 715 | + for item in value: |
| 716 | + lines.append(u"{}{},".format(inner, self._render_value(item, inner))) |
| 717 | + lines.append(u"{}]".format(indent)) |
| 718 | + return u"\n".join(lines) |
| 719 | + elif isinstance(value, basestring) and re.match(r'^[0-9a-f]{32}$', value): |
| 720 | + # Looks like a UUID |
| 721 | + return self._uid_to_link(value) |
| 722 | + else: |
| 723 | + return safe_unicode(pprint.pformat(value)) |
| 724 | + |
| 725 | + @property |
| 726 | + def approval_annot_html(self): |
| 727 | + approval = IOMApproval(self.context) |
| 728 | + native = persistent_to_native(approval.annot) |
| 729 | + return self._render_value(native) |
| 730 | + |
| 731 | + @property |
| 732 | + def esign_sessions(self): |
| 733 | + """Return list of (session_id, session_data) for all sessions.""" |
| 734 | + approval = IOMApproval(self.context) |
| 735 | + session_ids = approval.annot.get("session_ids", []) |
| 736 | + if not session_ids: |
| 737 | + return [] |
| 738 | + annot = get_session_annotation() |
| 739 | + result = [] |
| 740 | + for session_id in session_ids: |
| 741 | + session = annot["sessions"].get(session_id) |
| 742 | + if session is not None: |
| 743 | + result.append((session_id, persistent_to_native(session))) |
| 744 | + return sorted(result) |
| 745 | + |
| 746 | + def esign_session_html(self, session_data): |
| 747 | + return self._render_value(session_data) |
0 commit comments