merge branch master

This commit is contained in:
Helmut Merz 2013-11-16 13:11:32 +01:00
commit 1414a29436
5 changed files with 83 additions and 32 deletions

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -186,9 +186,11 @@ class FieldInstance(object):
implements(IFieldInstance) implements(IFieldInstance)
adapts(IField) adapts(IField)
clientInstance = clientContext = request = None clientInstance = None
clientContext = None
value = undefined value = undefined
request = None request = None
index = None
def __init__(self, context): def __init__(self, context):
self.context = context self.context = context

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -50,8 +50,11 @@ class GridFieldInstance(ListFieldInstance):
for f in self.columnTypes: for f in self.columnTypes:
instanceName = (f.instance_name or instanceName = (f.instance_name or
f.getFieldTypeInfo().instanceName) f.getFieldTypeInfo().instanceName)
result.append(component.getAdapter(f, IFieldInstance, fi = component.getAdapter(f, IFieldInstance, name=instanceName)
name=instanceName)) fi.clientInstance = self.clientInstance
fi.clientContext = self.clientContext
fi.request = self.request
result.append(fi)
return result return result
def marshall(self, value): def marshall(self, value):
@ -76,12 +79,17 @@ 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])
return dict(headers=headers, rows=rows) if cardinality > len(value):
for item in range(len(value), self.context.cardinality):
rows.append([fi.display(fi.default)
for fi in self.columnFieldInstances])
empty = not rows or (len(rows) == 1 and not [v for v in rows[0] if v])
return dict(headers=headers, rows=rows, empty=empty)
def unmarshall(self, value): def unmarshall(self, value):
value = toUnicode(value.strip()) value = toUnicode(value.strip())
@ -89,8 +97,8 @@ class GridFieldInstance(ListFieldInstance):
return [] return []
result = [] result = []
rows = json.loads(value)['items'] rows = json.loads(value)['items']
for row in rows: for idx, row in enumerate(rows):
item = self.unmarshallRow(row) item = self.unmarshallRow(row, idx)
if item: if item:
result.append(item) result.append(item)
return result return result
@ -111,18 +119,28 @@ class GridFieldInstance(ListFieldInstance):
result.append(item) result.append(item)
return result return result
def unmarshallRow(self, row): 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:
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 idx < cardinality:
item[fi.name] = value
else:
if fi.default is not None: if fi.default is not None:
if value == fi.default: if value == fi.default:
continue continue
if value: if value:
item[fi.name] = value item[fi.name] = value
ignoreInCheckOnEmpty = getattr(self.context, 'ignoreInCheckOnEmpty', [])
for k, v in item.items():
if k not in ignoreInCheckOnEmpty: #and v != '__no_change__':
return item return item
return {}
class RecordsFieldInstance(GridFieldInstance): class RecordsFieldInstance(GridFieldInstance):
@ -132,23 +150,52 @@ 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):
if not value: if not value:
value = [] value = []
result = [] result = []
for row in value: oldValue = getattr(self.clientContext, self.name, None) or []
item = self.unmarshallRow(row) for idx, row in enumerate(value):
item = self.unmarshallRow(row, idx)
if item:
oldItem = {}
if len(oldValue) > idx:
oldItem = oldValue[idx]
for k, v in item.items():
if v == '__no_change__':
if k in oldItem:
item[k] = oldItem[k]
else:
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):
@ -187,8 +234,8 @@ class KeyTableFieldInstance(RecordsFieldInstance):
if not value: if not value:
value = {} value = {}
result = {} result = {}
for row in value: for idx, row in enumerate(value):
item = self.unmarshallRow(row) item = self.unmarshallRow(row, idx)
if item: if item:
result[item.pop(self.keyName)] = [item.get(name) or u'' result[item.pop(self.keyName)] = [item.get(name) or u''
for name in self.dataNames] for name in self.dataNames]

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -38,6 +38,7 @@ class Grid(schema.List):
instanceName='grid')) instanceName='grid'))
column_types = [] column_types = []
ignoreInCheckOnEmpty = []
cardinality = None cardinality = None

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -18,8 +18,6 @@
""" """
Instance adapter classes for schemas. Instance adapter classes for schemas.
$Id$
""" """
from BTrees.OOBTree import OOBTree from BTrees.OOBTree import OOBTree
@ -68,7 +66,8 @@ class Instance(BaseInstance):
template = self.template template = self.template
if template is not None: if template is not None:
for f in template.components: for f in template.components:
fieldInstances[f.name] = f.getFieldInstance(self) fieldInstances[f.name] = f.getFieldInstance(self,
context=self.context)
return fieldInstances return fieldInstances
@Lazy @Lazy
@ -111,7 +110,7 @@ class Editor(BaseInstance):
fieldHandlers[ftype](context, value, fi, formState) fieldHandlers[ftype](context, value, fi, formState)
else: else:
oldValue = getattr(context, name, None) oldValue = getattr(context, name, None)
if value != oldValue: if value not in ('__no_change__', oldValue):
setattr(context, name, value) setattr(context, name, value)
fi.change = (oldValue, value) fi.change = (oldValue, value)
formState.changed = True formState.changed = True
@ -124,7 +123,7 @@ class Editor(BaseInstance):
for f in self.template.components: for f in self.template.components:
if f.readonly: if f.readonly:
continue continue
fi = f.getFieldInstance(self) fi = f.getFieldInstance(self, context=self.context)
#value = data.get(f.name) #value = data.get(f.name)
value = fi.getRawValue(data, f.name) value = fi.getRawValue(data, f.name)
fi.validate(value, data) fi.validate(value, data)

View file

@ -115,4 +115,6 @@ def extractFirstPart(value):
else: else:
text = stripAll(value) text = stripAll(value)
part = sentencePattern.split(text)[0] part = sentencePattern.split(text)[0]
if isinstance(part, unicode):
part = part.encode('UTF-8')
return ('<p>%s</p>' % part).decode('utf8') return ('<p>%s</p>' % part).decode('utf8')