add a "pointing docs" field/widget pair

This commit is contained in:
Frédéric Péters 2011-10-11 16:17:46 -04:00
parent 1139441ea0
commit 968593bee8
9 changed files with 85 additions and 0 deletions

View File

@ -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)

View File

@ -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')

View File

@ -102,4 +102,9 @@
component=".editors.PreviewDocFactory"
/>
<utility
name="themis.fields.PointingDocs"
component=".editors.PointingDocsFactory"
/>
</configure>

View File

@ -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)

View File

@ -104,4 +104,9 @@
name="themis.fields.PreviewDoc"
/>
<utility
component=".handlers.PointingDocsHandler"
name="themis.fields.PointingDocs"
/>
</configure>

View File

@ -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

View File

@ -0,0 +1,9 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:tal="http://xml.zope.org/namespaces/tal"
tal:omit-tag="">
<span tal:repeat="item view/pointing_docs">
<a tal:attributes="href item/from_path">
<span class="selected-option" tal:content="item/from_object/Title" />
</a><tal:block condition="not:repeat/item/end">, </tal:block>
</span>
</html>

View File

@ -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

View File

@ -111,4 +111,18 @@
permission="zope.Public"
class=".widgets.PreviewDocFile"/>
<adapter factory=".widgets.PointingDocsFieldWidget"/>
<z3c:widgetTemplate
mode="display"
widget=".widgets.IPointingDocsWidget"
layer="z3c.form.interfaces.IFormLayer"
template="pointingdocs_display.pt"/>
<z3c:widgetTemplate
mode="input"
widget=".widgets.IPointingDocsWidget"
layer="z3c.form.interfaces.IFormLayer"
template="pointingdocs_display.pt"/>
</configure>