From 968593bee8aabe65086d95a924dd7016d8d31c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 11 Oct 2011 16:17:46 -0400 Subject: [PATCH] add a "pointing docs" field/widget pair --- themis/fields/__init__.py | 4 ++++ themis/fields/editors.py | 3 +++ themis/fields/editors.zcml | 5 +++++ themis/fields/handlers.py | 6 ++++++ themis/fields/handlers.zcml | 5 +++++ themis/fields/interfaces.py | 8 +++++++ themis/fields/pointingdocs_display.pt | 9 ++++++++ themis/fields/widgets.py | 31 +++++++++++++++++++++++++++ themis/fields/widgets.zcml | 14 ++++++++++++ 9 files changed, 85 insertions(+) create mode 100644 themis/fields/pointingdocs_display.pt 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"/> + + + + + +