add RecordsTable type implemented as a simple list of records

This commit is contained in:
Helmut Merz 2023-12-26 22:09:12 +01:00
parent a2ccb8a35b
commit 4343dc517f
2 changed files with 47 additions and 3 deletions

View file

@ -23,7 +23,7 @@ with lower-level aspects like type or state management.
Let's also import some common stuff needed later. Let's also import some common stuff needed later.
>>> from loops.common import adapted >>> from loops.common import adapted, baseObject
>>> from loops.setup import addAndConfigureObject >>> from loops.setup import addAndConfigureObject
@ -921,6 +921,26 @@ relates ISO country codes with the full name of the country.
>>> countries.getRowsByValue('value', 'Germany') >>> countries.getRowsByValue('value', 'Germany')
[{'value': 'Germany', 'key': 'de'}] [{'value': 'Germany', 'key': 'de'}]
The ``recordstable`` type is a variation of this datable type that contains
a simple list of records - without a key column. A record in this type is a
dictionary with the field name as key and the field value as value.
>>> from loops.table import IRecordsTable, RecordsTable
>>> component.provideAdapter(RecordsTable, provides=IRecordsTable)
>>> drType = addAndConfigureObject(concepts, Concept, 'recordstable',
... title='Records Table', conceptType=concepts['type'],
... typeInterface=IRecordsTable)
We just reuse the existing ``countries`` table and convert it to a records table.
>>> baseObject(countries).setType(drType)
>>> countries = adapted(concepts['countries'])
>>> countries.data
[{'value': 'Austria', 'key': 'at'}, {'value': 'Germany', 'key': 'de'}]
Caching Caching
======= =======

View file

@ -24,7 +24,7 @@ from BTrees.OOBTree import OOBTree
from zope.cachedescriptors.property import Lazy 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 implementer, implements, Interface, Attribute
from zope.schema.interfaces import IContextSourceBinder, IIterableSource from zope.schema.interfaces import IContextSourceBinder, IIterableSource
from cybertools.composer.schema.factory import SchemaFactory from cybertools.composer.schema.factory import SchemaFactory
@ -65,6 +65,11 @@ class IDataTable(IConceptSchema, ILoopsAdapter):
IDataTable['columns'].hidden = True IDataTable['columns'].hidden = True
class IRecordsTable(IDataTable):
pass
class DataTable(AdapterBase): class DataTable(AdapterBase):
implements(IDataTable) implements(IDataTable)
@ -101,8 +106,11 @@ class DataTable(AdapterBase):
data = property(getData, setData) data = property(getData, setData)
def dataAsRecords(self): def dataAsRecords(self):
return self.asRecords(self.data)
def asRecords(self, data):
result = [] result = []
for k, v in sorted(self.data.items()): for k, v in sorted(data.items()):
item = {} item = {}
for idx, c in enumerate(self.columns): for idx, c in enumerate(self.columns):
if idx == 0: if idx == 0:
@ -188,3 +196,19 @@ class DataTableSourceBinder(object):
dt = context.getLoopsRoot().getConceptManager()[self.tableName] dt = context.getLoopsRoot().getConceptManager()[self.tableName]
return self.sourceList(adapted(dt), self.valueProvider) return self.sourceList(adapted(dt), self.valueProvider)
@implementer(IRecordsTable)
class RecordsTable(DataTable):
def getData(self):
data = self.context._data
if not isinstance(data, list):
return self.asRecords(data)
return data
def setData(self, data):
self.context._data = data
data = property(getData, setData)
def dataAsRecords(self):
return self.data