always display/process all rows within cardinality if this is set

This commit is contained in:
Helmut Merz 2013-10-11 11:20:43 +02:00
parent 4f54192ae4
commit a1e2d52967

View file

@ -79,11 +79,15 @@ class GridFieldInstance(ListFieldInstance):
def display(self, value): def display(self, value):
headers = [fi.context.title for fi in self.columnFieldInstances] headers = [fi.context.title for fi in self.columnFieldInstances]
rows = [] rows = []
for item in value or []: value = value or []
row = [] cardinality = getattr(self.context, 'cardinality', None)
for fi in self.columnFieldInstances: for item in value:
row.append(fi.display(item.get(fi.name))) rows.append([fi.display(item.get(fi.name))
rows.append(row) for fi in self.columnFieldInstances])
if cardinality > len(value):
for item in range(len(value), self.context.cardinality):
rows.append([fi.display(fi.default)
for fi in self.columnFieldInstances])
return dict(headers=headers, rows=rows) return dict(headers=headers, rows=rows)
def unmarshall(self, value): def unmarshall(self, value):
@ -116,17 +120,21 @@ class GridFieldInstance(ListFieldInstance):
def unmarshallRow(self, row, idx=None): def unmarshallRow(self, row, idx=None):
item = {} item = {}
cardinality = getattr(self.context, 'cardinality', None)
for fi in self.columnFieldInstances: for fi in self.columnFieldInstances:
if idx is not None: if idx is not None:
fi.index = idx fi.index = idx
value = fi.unmarshall(row.get(fi.name) or u'') value = fi.unmarshall(row.get(fi.name) or u'')
if isinstance(value, basestring): if isinstance(value, basestring):
value = value.strip() value = value.strip()
if fi.default is not None: if idx < cardinality:
if value == fi.default:
continue
if value:
item[fi.name] = value item[fi.name] = value
else:
if fi.default is not None:
if value == fi.default:
continue
if value:
item[fi.name] = value
ignoreInCheckOnEmpty = getattr(self.context, 'ignoreInCheckOnEmpty', []) ignoreInCheckOnEmpty = getattr(self.context, 'ignoreInCheckOnEmpty', [])
for k, v in item.items(): for k, v in item.items():
if k not in ignoreInCheckOnEmpty and v != '__no_change__': if k not in ignoreInCheckOnEmpty and v != '__no_change__':
@ -141,11 +149,19 @@ class RecordsFieldInstance(GridFieldInstance):
def marshall(self, value): def marshall(self, value):
result = [] result = []
for row in value or []: value = value or []
cardinality = getattr(self.context, 'cardinality', None)
for row in value:
item = {} item = {}
for fi in self.columnFieldInstances: for fi in self.columnFieldInstances:
item[fi.name] = fi.marshall(row.get(fi.name)) item[fi.name] = fi.marshall(row.get(fi.name))
result.append(item) result.append(item)
if cardinality > len(value):
for row in range(len(value), cardinality):
item = {}
for fi in self.columnFieldInstances:
item[fi.name] = fi.marshall(fi.default)
result.append(item)
return result return result
def unmarshall(self, value): def unmarshall(self, value):
@ -156,23 +172,29 @@ class RecordsFieldInstance(GridFieldInstance):
for idx, row in enumerate(value): for idx, row in enumerate(value):
item = self.unmarshallRow(row, idx) item = self.unmarshallRow(row, idx)
if item: if item:
oldItem = {}
if len(oldValue) > idx: if len(oldValue) > idx:
oldItem = oldValue[idx] oldItem = oldValue[idx]
for k, v in item.items(): for k, v in item.items():
if v != '__no_change__': if v == '__no_change__':
oldItem[k] = v if k in oldItem:
#if oldItem.get(k) == '__no_change__': item[k] = oldItem[k]
# del oldItem[k] else:
#if oldItem:
result.append(oldItem)
else:
for k, v in item.items():
if v == '__no_change__':
del item[k] del item[k]
if item: if item:
result.append(item) result.append(item)
return result return result
def validate(self, value, data=None):
if not value:
if self.context.required:
self.setError('required_missing')
else:
return
for row in value:
for fi in self.columnFieldInstances:
fi.validate(row.get(fi.name) or u'')
class KeyTableFieldInstance(RecordsFieldInstance): class KeyTableFieldInstance(RecordsFieldInstance):