merge branch master
This commit is contained in:
commit
1414a29436
5 changed files with 83 additions and 32 deletions
|
@ -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
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Add table
Reference in a new issue