Added fields and keyword view
This commit is contained in:
parent
d5a8bf3e42
commit
145ccf90e2
|
@ -34,10 +34,20 @@ Résumé :
|
|||
- champ ID
|
||||
- champ Titre (dénomination du KW)
|
||||
- champ Description (NH)
|
||||
|
||||
- champ (multi texte) EQ/UF
|
||||
|
||||
- champ Enfant (relation -> NT)
|
||||
- champ RT (relation)
|
||||
- champ NH
|
||||
|
||||
Relation parent/enfant :
|
||||
Je choisis de placer la relation dans le sens suivant:
|
||||
l'enfant stocke la relation 'parent' dans 1 de ses champs.
|
||||
La raison est que lorsque l'on crée un nouvel objet, c'est souvent pour
|
||||
l'ajouter à partir d'un point d'accroche existant (un parent).
|
||||
Il est plus facil de stocker la relation dans l'objet créé que de
|
||||
remonter à l'objet parent pour créer la nouvelle relation une fois
|
||||
l'objet enfant lui-même créé.
|
||||
|
||||
|
||||
Le widget
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
#
|
|
@ -0,0 +1,25 @@
|
|||
<configure
|
||||
xmlns="http://namespaces.zope.org/zope"
|
||||
xmlns:browser="http://namespaces.zope.org/browser"
|
||||
xmlns:i18n="http://namespaces.zope.org/i18n"
|
||||
i18n_domain="collective.dms.thesaurus">
|
||||
|
||||
<browser:resource
|
||||
name="thesaurus_icon.png"
|
||||
image="thesaurus_icon.png"
|
||||
/>
|
||||
|
||||
<browser:resource
|
||||
name="thesaurus_item_icon.png"
|
||||
image="thesaurus_item_icon.png"
|
||||
/>
|
||||
|
||||
<browser:page
|
||||
for="collective.dms.thesaurus.dmskeyword.IDmsKeyword"
|
||||
name="dmskeyword.view"
|
||||
class="plone.dexterity.browser.view.DefaultView"
|
||||
template="dmskeyword_view.pt"
|
||||
permission="zope2.View"
|
||||
/>
|
||||
|
||||
</configure>
|
|
@ -0,0 +1,38 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
|
||||
xmlns:tal="http://xml.zope.org/namespaces/tal"
|
||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
||||
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
|
||||
lang="en"
|
||||
metal:use-macro="context/main_template/macros/master"
|
||||
i18n:domain="plone.app.dexterity">
|
||||
<body>
|
||||
|
||||
<metal:main fill-slot="content-core">
|
||||
<metal:content-core define-macro="content-core">
|
||||
|
||||
<tal:block repeat="widget view/widgets/values">
|
||||
<div class="field" tal:condition="python:widget.__name__ not in ('IBasic.title', 'IBasic.description', 'title', 'description',)">
|
||||
<label tal:content="widget/label" />
|
||||
<br />
|
||||
<div tal:content="structure widget/render" />
|
||||
</div>
|
||||
</tal:block>
|
||||
|
||||
<fieldset tal:repeat="group view/groups"
|
||||
tal:attributes="id python:''.join((group.prefix, 'groups.', group.__name__)).replace('.', '-')">
|
||||
<legend tal:content="group/label" />
|
||||
<div class="field" tal:repeat="widget group/widgets/values">
|
||||
<label tal:content="widget/label" />
|
||||
<br />
|
||||
<div tal:content="structure widget/render" />
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
Toto
|
||||
|
||||
</metal:content-core>
|
||||
</metal:main>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
Binary file not shown.
After Width: | Height: | Size: 510 B |
Binary file not shown.
After Width: | Height: | Size: 330 B |
|
@ -15,7 +15,8 @@
|
|||
<include package="plone.app.dexterity" />
|
||||
<include package="plone.supermodel" />
|
||||
<include package="plone.app.relationfield" />
|
||||
<include package="collective.dms.thesaurus" />
|
||||
<include package="." />
|
||||
<include package=".browser" />
|
||||
|
||||
<genericsetup:registerProfile
|
||||
name="default"
|
||||
|
|
|
@ -1,22 +1,65 @@
|
|||
#import datetime
|
||||
#from zope import schema
|
||||
from zope.interface import implements, implementer
|
||||
#from zope.component import adapts
|
||||
from zope.interface import implements
|
||||
from zope.component import adapter
|
||||
|
||||
#from plone.dexterity.content import Container
|
||||
from zope import schema
|
||||
from zope.schema.interfaces import IList
|
||||
|
||||
|
||||
from z3c.form.interfaces import IFormLayer, IFieldWidget, IMultiWidget
|
||||
from z3c.form.widget import FieldWidget, MultiWidget
|
||||
|
||||
# #from plone.dexterity.content import Container
|
||||
from plone.dexterity.schema import DexteritySchemaPolicy
|
||||
from plone.dexterity.content import Item
|
||||
|
||||
from plone.supermodel import model
|
||||
|
||||
from . import _
|
||||
from .relatedkeywords import RelatedThesaurusKeywords
|
||||
|
||||
#from plone.autoform import directives as form
|
||||
#from plone.directives.form import default_value
|
||||
|
||||
class IEquivalences(IList):
|
||||
""""""
|
||||
|
||||
class Equivalences(schema.List):
|
||||
implements(IEquivalences)
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
schema.List.__init__(self, **kwargs)
|
||||
|
||||
@adapter(IEquivalences, IFormLayer)
|
||||
@implementer(IFieldWidget)
|
||||
def EquivalencesWidget(field, request):
|
||||
return FieldWidget(field, MultiWidget(request))
|
||||
|
||||
|
||||
class IDmsKeyword(model.Schema):
|
||||
""" """
|
||||
|
||||
# XXX: Ungly widget that needs to be replaced
|
||||
equivs = Equivalences(
|
||||
title=u'EQs',
|
||||
required=False,
|
||||
value_type=schema.TextLine()
|
||||
)
|
||||
|
||||
# BT: broader term
|
||||
broader = RelatedThesaurusKeywords(
|
||||
title=_(u"BT (Broader Terms)"),
|
||||
required=False,
|
||||
)
|
||||
|
||||
# RT: related term
|
||||
related = RelatedThesaurusKeywords(
|
||||
title=_(u"RT (Related Terms)"),
|
||||
required=False,
|
||||
)
|
||||
|
||||
|
||||
class DmsKeyword(Item):
|
||||
""" """
|
||||
implements(IDmsKeyword)
|
||||
|
@ -28,3 +71,4 @@ class DmsKeywordSchemaPolicy(DexteritySchemaPolicy):
|
|||
def bases(self, schemaName, tree):
|
||||
return (IDmsKeyword, )
|
||||
|
||||
|
||||
|
|
|
@ -3,24 +3,25 @@
|
|||
xmlns:i18n="http://xml.zope.org/namespaces/i18n">
|
||||
<property name="title" i18n:translate="">Keyword</property>
|
||||
<property name="description" i18n:translate="">DMS Keyword</property>
|
||||
<property name="icon_expr">string:${portal_url}/++resource++folder_icon.png</property>
|
||||
<property name="icon_expr">string:${portal_url}/++resource++thesaurus_item_icon.png</property>
|
||||
<property name="factory">dmskeyword</property>
|
||||
<property name="add_view_expr">string:${folder_url}/++add++dmskeyword</property>
|
||||
<property name="link_target"></property>
|
||||
<property name="immediate_view">view</property>
|
||||
<property name="global_allow">True</property>
|
||||
<property name="global_allow">False</property>
|
||||
<property name="filter_content_types">True</property>
|
||||
<property name="allowed_content_types"/>
|
||||
<property name="allow_discussion">False</property>
|
||||
<property name="default_view">view</property>
|
||||
<property name="default_view">@@dmskeyword.view</property>
|
||||
<property name="view_methods">
|
||||
<element value="view"/>
|
||||
<element value="@@dmskeyword.view"/>
|
||||
</property>
|
||||
<property name="default_view_fallback">False</property>
|
||||
<property name="add_permission">cmf.AddPortalContent</property>
|
||||
<property name="klass">collective.dms.thesaurus.dmskeyword.DmsKeyword</property>
|
||||
<property name="behaviors">
|
||||
<element value="plone.app.content.interfaces.INameFromTitle"/>
|
||||
<!-- element value="plone.app.content.interfaces.INameFromTitle"/ -->
|
||||
<element value="plone.app.dexterity.behaviors.metadata.IDublinCore"/>
|
||||
<element value="collective.dexteritytextindexer.behavior.IDexterityTextIndexer" />
|
||||
</property>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
xmlns:i18n="http://xml.zope.org/namespaces/i18n">
|
||||
<property name="title" i18n:translate="">Thesaurus</property>
|
||||
<property name="description" i18n:translate="">DMS Thesaurus</property>
|
||||
<property name="icon_expr">string:${portal_url}/++resource++folder_icon.png</property>
|
||||
<property name="icon_expr">string:${portal_url}/++resource++thesaurus_icon.png</property>
|
||||
<property name="factory">dmsthesaurus</property>
|
||||
<property name="add_view_expr">string:${folder_url}/++add++dmsthesaurus</property>
|
||||
<property name="link_target"></property>
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
<span id="" class=""
|
||||
tal:attributes="id view/id;
|
||||
class view/klass;
|
||||
style view/style;
|
||||
title view/title;
|
||||
lang view/lang;
|
||||
onclick view/onclick;
|
||||
ondblclick view/ondblclick;
|
||||
onmousedown view/onmousedown;
|
||||
onmouseup view/onmouseup;
|
||||
onmouseover view/onmouseover;
|
||||
onmousemove view/onmousemove;
|
||||
onmouseout view/onmouseout;
|
||||
onkeypress view/onkeypress;
|
||||
onkeydown view/onkeydown;
|
||||
onkeyup view/onkeyup"><tal:block
|
||||
tal:repeat="value view/tuples"
|
||||
><a class="selected-option"
|
||||
href="#"
|
||||
tal:content="python:value[1]"
|
||||
tal:attributes="href python:value[0]"
|
||||
/><tal:block condition="not:repeat/value/end">, </tal:block
|
||||
></tal:block
|
||||
></span>
|
|
@ -0,0 +1,54 @@
|
|||
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 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, display_backrefs, request):
|
||||
self.display_backrefs = display_backrefs
|
||||
super(RelatedThesaurusKeywordsWidget, self).__init__(request)
|
||||
|
||||
def get_url(self, v):
|
||||
return v
|
||||
|
||||
def get_label(self, v):
|
||||
term = self.terms.getTermByToken(v)
|
||||
return term.title
|
||||
|
||||
def tuples(self):
|
||||
refs = [(self.get_url(x), self.get_label(x)) for x in self.value]
|
||||
return refs
|
||||
|
||||
@adapter(IRelatedThesaurusKeywords, IFormLayer)
|
||||
@implementer(IFieldWidget)
|
||||
def RelatedThesaurusKeywordsFieldWidget(field, request):
|
||||
return FieldWidget(field, RelatedThesaurusKeywordsWidget(field.display_backrefs, request))
|
||||
|
||||
class RelatedThesaurusKeywords(RelationList):
|
||||
implements(IRelatedThesaurusKeywords)
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
source_config = dict()
|
||||
source_config['portal_type'] = ('dmskeyword',)
|
||||
RelationList.__init__(self,
|
||||
value_type=RelationChoice(
|
||||
title=u'',
|
||||
source=ObjPathSourceBinder(**source_config)),
|
||||
**kwargs)
|
||||
|
Reference in New Issue