This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
collective.dms.thesaurus/src/collective/dms/thesaurus/relatedkeywords.py

103 lines
3.6 KiB
Python

from zope.interface import implements, implementer
from zope.component import adapter, getUtility
from zope.app.intid.interfaces import IIntIds
from zc.relation.interfaces import ICatalog
from z3c.form.interfaces import IFormLayer, IFieldWidget
from z3c.form.widget import FieldWidget
from z3c.relationfield.interfaces import IRelationList
from z3c.relationfield.schema import RelationChoice, RelationList
from plone.formwidget.contenttree.widget import MultiContentTreeWidget
from plone.formwidget.contenttree.utils import closest_content
from plone.formwidget.contenttree import ObjPathSourceBinder
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
class IRelatedThesaurusKeywords(IRelationList):
""""""
class RelatedThesaurusKeywordsWidget(MultiContentTreeWidget):
display_template = ViewPageTemplateFile('related-thesaurus-keywords-display.pt')
def __init__(self, request, from_attribute='related', display_backrefs=False):
self.from_attribute = from_attribute
self.display_backrefs = display_backrefs
super(RelatedThesaurusKeywordsWidget, self).__init__(request)
def get_url(self, v):
return v
def get_term(self, v):
return self.terms.getTermByToken(v)
def get_label(self, v):
return self.get_term(v).title
def get_hn(self, v):
return self.get_term(v).value.historical_note
def get_sn(self, v):
return self.get_term(v).value.scope_note
def dictvalues(self):
refs = [dict(
url=self.get_url(x),
label=self.get_label(x),
hn=self.get_hn(x),
sn=self.get_sn(x),
) for x in self.value]
if self.display_backrefs:
intids = getUtility(IIntIds)
catalog = getUtility(ICatalog)
try:
doc_intid = intids.getId(self.context)
except KeyError:
pass
else:
for ref in catalog.findRelations(
{'to_id': doc_intid,
'from_attribute': self.from_attribute}):
tp = dict(
url=ref.from_path,
label=ref.from_object.Title(),
hn=ref.from_object.historical_note,
sn=ref.from_object.scope_note
)
if tp not in refs:
refs.append(tp)
return refs
@adapter(IRelatedThesaurusKeywords, IFormLayer)
@implementer(IFieldWidget)
def RelatedThesaurusKeywordsFieldWidget(field, request):
return FieldWidget(field, RelatedThesaurusKeywordsWidget(
request, display_backrefs=field.display_backrefs))
class ThesaurusPathSourceBinder(ObjPathSourceBinder):
def __call__(self, context):
selectable_filter = self.selectable_filter
selectable_filter.criteria['portal_type'] = ('dmskeyword',)
thesaurus_path = {'query': '/'.join(context.getPhysicalPath()[:-1])}
selectable_filter.criteria['path'] = thesaurus_path
return self.path_source(
closest_content(context),
selectable_filter=selectable_filter,
navigation_tree_query=self.navigation_tree_query)
class RelatedThesaurusKeywords(RelationList):
implements(IRelatedThesaurusKeywords)
def __init__(self, display_backrefs=False, **kwargs):
self.display_backrefs = display_backrefs
RelationList.__init__(self,
value_type=RelationChoice(
title=u'',
source=ThesaurusPathSourceBinder()),
**kwargs)