use data table as basis for vocabularies

This commit is contained in:
Helmut Merz 2011-12-27 20:11:00 +01:00
parent e4b4ca2634
commit 0162adea94
4 changed files with 42 additions and 6 deletions

View file

@ -137,7 +137,7 @@ class BaseRelationView(BaseView):
return self.getData() return self.getData()
def getData(self): def getData(self):
return self.instance.applyTemplate() return self.instance.applyTemplate(context=self.context, request=self.request)
@Lazy @Lazy
def instance(self): def instance(self):
@ -248,7 +248,7 @@ class ConceptView(BaseView):
return None return None
def getData(self, omit=('title', 'description')): def getData(self, omit=('title', 'description')):
data = self.instance.applyTemplate() data = self.instance.applyTemplate(context=self.context, request=self.request)
for k in omit: for k in omit:
if k in data: if k in data:
del data[k] del data[k]

View file

@ -50,10 +50,14 @@
<tal:row repeat="field fields"> <tal:row repeat="field fields">
<tr tal:define="fieldName field/name; <tr tal:define="fieldName field/name;
value nocall:data/?fieldName; value nocall:data/?fieldName;
renderer field/displayRenderer" fieldInstance python:field.getFieldInstance(
context=context, request=request);
rendererName field/displayRenderer;
renderer python:fieldInstance.getRenderer(rendererName) or
view.concept_macros[rendererName]"
tal:condition="nocall:value"> tal:condition="nocall:value">
<td><b tal:content="field/title" i18n:translate="" />:</td> <td><b tal:content="field/title" i18n:translate="" />:</td>
<td><span metal:use-macro="view/concept_macros/?renderer" /></td> <td><span metal:use-macro="renderer" /></td>
</tr> </tr>
</tal:row> </tal:row>
</table> </table>

View file

@ -693,6 +693,10 @@
for="loops.view.NodeTypeSourceList for="loops.view.NodeTypeSourceList
zope.publisher.interfaces.browser.IBrowserRequest" /> zope.publisher.interfaces.browser.IBrowserRequest" />
<zope:adapter factory="loops.browser.common.SimpleTerms"
for="loops.table.DataTableSourceList
zope.publisher.interfaces.browser.IBrowserRequest" />
<zope:view factory="loops.browser.node.NodeTraverser" <zope:view factory="loops.browser.node.NodeTraverser"
for="loops.interfaces.INode" for="loops.interfaces.INode"
type="zope.publisher.interfaces.http.IHTTPRequest" type="zope.publisher.interfaces.http.IHTTPRequest"

View file

@ -21,14 +21,15 @@ Data (keyword-based) table definition and implementation.
""" """
from BTrees.OOBTree import OOBTree from BTrees.OOBTree import OOBTree
from zope.cachedescriptors.property import Lazy
from zope import component, schema from zope import component, schema
from zope.component import adapts from zope.component import adapts
from zope.interface import implements, Interface, Attribute from zope.interface import implements, Interface, Attribute
from zope.cachedescriptors.property import Lazy from zope.schema.interfaces import IContextSourceBinder, IIterableSource
from cybertools.composer.schema.factory import SchemaFactory from cybertools.composer.schema.factory import SchemaFactory
from cybertools.composer.schema.grid.interfaces import KeyTable from cybertools.composer.schema.grid.interfaces import KeyTable
from loops.common import AdapterBase from loops.common import AdapterBase, adapted, baseObject
from loops.interfaces import IConcept, IConceptSchema, ILoopsAdapter from loops.interfaces import IConcept, IConceptSchema, ILoopsAdapter
from loops.type import TypeInterfaceSourceList from loops.type import TypeInterfaceSourceList
from loops import util from loops import util
@ -101,3 +102,30 @@ class DataTableSchemaFactory(SchemaFactory):
schema.fields.remove('viewName') schema.fields.remove('viewName')
return schema return schema
class DataTableSourceBinder(object):
implements(IContextSourceBinder)
def __init__(self, tableName):
self.tableName = tableName
def __call__(self, context):
context = baseObject(context)
dt = context.getLoopsRoot().getConceptManager()[self.tableName]
return DataTableSourceList(adapted(dt))
class DataTableSourceList(object):
implements(IIterableSource)
def __init__(self, context):
self.context = context
def __iter__(self):
items = [(k, v[0]) for k, v in self.context.data.items()]
return iter(sorted(items, key=lambda x: x[1]))
def __len__(self):
return len(self.context.data)