add a "pointing docs" field/widget pair
This commit is contained in:
parent
1139441ea0
commit
968593bee8
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
||||
|
|
|
@ -102,4 +102,9 @@
|
|||
component=".editors.PreviewDocFactory"
|
||||
/>
|
||||
|
||||
<utility
|
||||
name="themis.fields.PointingDocs"
|
||||
component=".editors.PointingDocsFactory"
|
||||
/>
|
||||
|
||||
</configure>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -104,4 +104,9 @@
|
|||
name="themis.fields.PreviewDoc"
|
||||
/>
|
||||
|
||||
<utility
|
||||
component=".handlers.PointingDocsHandler"
|
||||
name="themis.fields.PointingDocs"
|
||||
/>
|
||||
|
||||
</configure>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
Reference in New Issue