diff --git a/themis/fields/__init__.py b/themis/fields/__init__.py
index 784dd60..623160e 100644
--- a/themis/fields/__init__.py
+++ b/themis/fields/__init__.py
@@ -30,6 +30,7 @@ from themis.fields.interfaces import IRelatedDocs
from themis.fields.interfaces import IMailId
from themis.fields.interfaces import IMailRefId
from themis.fields.interfaces import IPreviewDoc
+from themis.fields.interfaces import IPointingDocs
from themis.fields.interfaces import IDocHistoLine, IDocHistoLines
@@ -406,3 +407,6 @@ class PreviewDoc(Field):
if attr in kw:
del kw[attr]
super(PreviewDoc, self).__init__(**kw)
+
+class PointingDocs(Field):
+ implements(IPointingDocs, IFromUnicode)
diff --git a/themis/fields/editors.py b/themis/fields/editors.py
index 6c7b5de..305d0d7 100644
--- a/themis/fields/editors.py
+++ b/themis/fields/editors.py
@@ -18,6 +18,7 @@ from themis.fields import MailId
from themis.fields import MailRefId
from themis.fields import DocHistoLines
from themis.fields import PreviewDoc
+from themis.fields import PointingDocs
from plone.schemaeditor.fields import FieldFactory
@interface.implementer(editor_ifaces.IFieldEditFormSchema)
@@ -60,3 +61,5 @@ DocHistoLinesFactory = FieldFactory(DocHistoLines, u'Historic Lines')
PreviewDocFactory = FieldFactory(PreviewDoc, u'Preview Doc')
+PointingDocsFactory = FieldFactory(PointingDocs, u'Pointing Docs')
+
diff --git a/themis/fields/editors.zcml b/themis/fields/editors.zcml
index deb2095..a74b804 100644
--- a/themis/fields/editors.zcml
+++ b/themis/fields/editors.zcml
@@ -102,4 +102,9 @@
component=".editors.PreviewDocFactory"
/>
+
+
diff --git a/themis/fields/handlers.py b/themis/fields/handlers.py
index 376f97d..f5e78b7 100644
--- a/themis/fields/handlers.py
+++ b/themis/fields/handlers.py
@@ -27,6 +27,7 @@ if HAVE_SUPERMODEL:
from themis.fields import MailRefId
from themis.fields import DocHistoLines
from themis.fields import PreviewDoc
+ from themis.fields import PointingDocs
class CommissionHandler_(BaseHandler):
pass
@@ -127,3 +128,8 @@ if HAVE_SUPERMODEL:
pass
PreviewDocHandler = PreviewDocHandler_(PreviewDoc)
+
+ class PointingDocsHandler_(BaseHandler):
+ pass
+
+ PointingDocsHandler = PointingDocsHandler_(PointingDocs)
diff --git a/themis/fields/handlers.zcml b/themis/fields/handlers.zcml
index dd5d933..3861601 100644
--- a/themis/fields/handlers.zcml
+++ b/themis/fields/handlers.zcml
@@ -104,4 +104,9 @@
name="themis.fields.PreviewDoc"
/>
+
+
diff --git a/themis/fields/interfaces.py b/themis/fields/interfaces.py
index 85840e8..464d706 100644
--- a/themis/fields/interfaces.py
+++ b/themis/fields/interfaces.py
@@ -184,3 +184,11 @@ class IPreviewDoc(IField):
class IPreviewDocWidget(IWidget):
pass
+
+
+class IPointingDocs(IField):
+ '''Field to display a list of documents pointing to the current one'''
+
+class IPointingDocsWidget(IWidget):
+ pass
+
diff --git a/themis/fields/pointingdocs_display.pt b/themis/fields/pointingdocs_display.pt
new file mode 100644
index 0000000..5e17f47
--- /dev/null
+++ b/themis/fields/pointingdocs_display.pt
@@ -0,0 +1,9 @@
+
+
+
+
+ ,
+
+
diff --git a/themis/fields/widgets.py b/themis/fields/widgets.py
index 25ae6aa..b78893e 100644
--- a/themis/fields/widgets.py
+++ b/themis/fields/widgets.py
@@ -4,6 +4,7 @@ from AccessControl import ClassSecurityInfo
from Acquisition import ImplicitAcquisitionWrapper
from Acquisition.interfaces import IAcquirer
+from zope import component
from zope.interface import implements, implementsOnly, implementer
from zope.component import adapts, adapter
@@ -16,6 +17,8 @@ from collective.z3cform.datetimewidget import DateWidget
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.Five.browser import BrowserView
+from zc.relation.interfaces import ICatalog
+from zope.app.intid.interfaces import IIntIds
from z3c.form.converter import BaseDataConverter
@@ -37,6 +40,7 @@ from themis.fields.interfaces import IMailRefId, IMailRefIdWidget
from themis.fields.interfaces import IPreviewDoc, IPreviewDocWidget
from themis.fields.interfaces import IRelatedDocWidget, IRelatedDocsWidget
from themis.fields.interfaces import IDocHistoLineWidget, IDocHistoLine
+from themis.fields.interfaces import IPointingDocs, IPointingDocsWidget
from plone.formwidget.autocomplete.interfaces import IAutocompleteWidget
from plone.formwidget.autocomplete.widget import AutocompleteSelectionWidget, AutocompleteMultiSelectionWidget
@@ -426,3 +430,30 @@ class PreviewDocFile(BrowserView):
else:
self.request.response.setHeader('Content-type', 'application/octet-stream')
return file.data
+
+
+@adapter(IPointingDocs, IFormLayer)
+@implementer(IFieldWidget)
+def PointingDocsFieldWidget(field, request):
+ """IFieldWidget factory for PointingDocs"""
+ return FieldWidget(field, PointingDocsWidget(request))
+
+class PointingDocsWidget(Widget):
+ implements(IPointingDocsWidget)
+
+ def pointing_docs(self):
+ from plone.dexterity.content import Item
+ if not isinstance(self.context, Item):
+ # we do not want to call intids.getId on TypeSchemaContext (which
+ # is passed as self.context when viewing the type in dexterity
+ # through-the-web edit schema page) as this will get some deep part
+ # of zope zodb/transaction layer in trouble.
+ return []
+ intids = component.getUtility(IIntIds)
+ catalog = component.getUtility(ICatalog)
+ try:
+ doc_intid = intids.getId(self.context)
+ except KeyError:
+ return []
+ pointing_docs = [x for x in catalog.findRelations({'to_id': doc_intid})]
+ return pointing_docs
diff --git a/themis/fields/widgets.zcml b/themis/fields/widgets.zcml
index 78510a6..84f9228 100644
--- a/themis/fields/widgets.zcml
+++ b/themis/fields/widgets.zcml
@@ -111,4 +111,18 @@
permission="zope.Public"
class=".widgets.PreviewDocFile"/>
+
+
+
+
+
+