[gen] Ref field: param 'shownInfo' can now be a method.

This commit is contained in:
Gaetan Delannay 2014-12-09 09:27:40 +01:00
parent c53654a1a1
commit 12836a40dc
4 changed files with 25 additions and 18 deletions

View file

@ -60,7 +60,7 @@ class FileInfo:
getting the content of a Pod field, a temporary file may be generated and getting the content of a Pod field, a temporary file may be generated and
you will get a FileInfo that represents it. you will get a FileInfo that represents it.
''' '''
BYTES = 5000 BYTES = 50000
def __init__(self, fsPath, inDb=True, uploadName=None): def __init__(self, fsPath, inDb=True, uploadName=None):
'''p_fsPath is the path of the file on disk. '''p_fsPath is the path of the file on disk.

View file

@ -250,7 +250,7 @@ class Ref(Field):
<table if="objects" class=":not innerRef and 'list' or ''" <table if="objects" class=":not innerRef and 'list' or ''"
width=":innerRef and '100%' or field.layouts['view'].width" width=":innerRef and '100%' or field.layouts['view'].width"
var2="columns=ztool.getColumnsSpecifiers(tiedClassName, \ var2="columns=ztool.getColumnsSpecifiers(tiedClassName, \
field.shownInfo, dir)"> field.getAttribute(obj, 'shownInfo'), dir)">
<tr if="field.showHeaders"> <tr if="field.showHeaders">
<th if="not inPickList and numbered" width=":numbered"></th> <th if="not inPickList and numbered" width=":numbered"></th>
<th if="checkboxes" class="cbCell"> <th if="checkboxes" class="cbCell">
@ -397,7 +397,7 @@ class Ref(Field):
# Simplified widget showing minimal info about tied objects. # Simplified widget showing minimal info about tied objects.
pxViewMinimal = Px(''' pxViewMinimal = Px('''
<x var2="infos=[field.getReferenceLabel(o, True) \ <x var2="infos=[field.getReferenceLabel(obj, o, True) \
for o in objects]">:', '.join(infos) or _('no_ref')</x>''') for o in objects]">:', '.join(infos) or _('no_ref')</x>''')
# PX that displays referred objects through this field. In mode link="list", # PX that displays referred objects through this field. In mode link="list",
@ -465,7 +465,7 @@ class Ref(Field):
<select if="objects" name=":name" id=":name" multiple=":isMultiple" <select if="objects" name=":name" id=":name" multiple=":isMultiple"
size=":isMultiple and field.height or ''"> size=":isMultiple and field.height or ''">
<option for="tied in objects" value=":tied.uid" selected="selected" <option for="tied in objects" value=":tied.uid" selected="selected"
var2="title=field.getReferenceLabel(tied, unlimited=True)" var2="title=field.getReferenceLabel(obj, tied, unlimited=True)"
title=":title">:ztool.truncateValue(title, field.width)</option> title=":title">:ztool.truncateValue(title, field.width)</option>
</select> </select>
<div if="not objects">-</div> <div if="not objects">-</div>
@ -483,7 +483,7 @@ class Ref(Field):
<option value="" if="not isMultiple">:_('choose_a_value')</option> <option value="" if="not isMultiple">:_('choose_a_value')</option>
<option for="tied in objects" <option for="tied in objects"
var2="uid=tied.uid; var2="uid=tied.uid;
title=field.getReferenceLabel(tied, unlimited=True)" title=field.getReferenceLabel(obj, tied, unlimited=True)"
selected=":inRequest and (uid in requestValue) or \ selected=":inRequest and (uid in requestValue) or \
(uid in uids)" value=":uid" (uid in uids)" value=":uid"
title=":title">:ztool.truncateValue(title, field.width)</option> title=":title">:ztool.truncateValue(title, field.width)</option>
@ -508,7 +508,7 @@ class Ref(Field):
name=":widgetName" size=":field.sheight" multiple="multiple" name=":widgetName" size=":field.sheight" multiple="multiple"
onchange=":field.getOnChange(ztool, 'search', className)"> onchange=":field.getOnChange(ztool, 'search', className)">
<option for="tied in objects" value=":tied.uid" selected=":selectAll" <option for="tied in objects" value=":tied.uid" selected=":selectAll"
var2="title=field.getReferenceLabel(tied, unlimited=True)" var2="title=field.getReferenceLabel(obj, tied, unlimited=True)"
title=":title">:ztool.truncateValue(title, field.swidth)</option> title=":title">:ztool.truncateValue(title, field.swidth)</option>
</select>''') </select>''')
@ -518,7 +518,7 @@ class Ref(Field):
unlinkElement=None, insert=None, beforeLink=None, unlinkElement=None, insert=None, beforeLink=None,
afterLink=None, afterUnlink=None, back=None, show=True, afterLink=None, afterUnlink=None, back=None, show=True,
page='main', group=None, layouts=None, showHeaders=False, page='main', group=None, layouts=None, showHeaders=False,
shownInfo=(), select=None, maxPerPage=30, move=0, shownInfo=None, select=None, maxPerPage=30, move=0,
indexed=False, searchable=False, specificReadPermission=False, indexed=False, searchable=False, specificReadPermission=False,
specificWritePermission=False, width=None, height=5, specificWritePermission=False, width=None, height=5,
maxChars=None, colspan=1, master=None, masterValue=None, maxChars=None, colspan=1, master=None, masterValue=None,
@ -616,10 +616,16 @@ class Ref(Field):
# When displaying a tabular list of referenced objects, must we show # When displaying a tabular list of referenced objects, must we show
# the table headers? # the table headers?
self.showHeaders = showHeaders self.showHeaders = showHeaders
# When displaying referenced object(s), we will display its title + all # "shownInfo" is a tuple or list (or a method producing) containing
# other fields whose names are listed in the following attribute. # the names of the fields that will be shown when displaying tables of
# tied objects. Field "title" should be present: by default it is a
# clickable link to the "view" page of every tied object.
if shownInfo == None:
self.shownInfo = ['title']
elif isinstance(shownInfo, tuple):
self.shownInfo = list(shownInfo) self.shownInfo = list(shownInfo)
if not self.shownInfo: self.shownInfo.append('title') else:
self.shownInfo = shownInfo
# If a method is defined in this field "select", it will be used to # If a method is defined in this field "select", it will be used to
# return the list of possible tied objects. Be careful: this method can # return the list of possible tied objects. Be careful: this method can
# receive, in its first argument ("self"), the tool instead of an # receive, in its first argument ("self"), the tool instead of an
@ -1265,15 +1271,15 @@ class Ref(Field):
obj.appy().create(self.name) obj.appy().create(self.name)
xhtmlToText = re.compile('<.*?>', re.S) xhtmlToText = re.compile('<.*?>', re.S)
def getReferenceLabel(self, refObject, unlimited=False): def getReferenceLabel(self, obj, refObject, unlimited=False):
'''p_self must have link=True. I need to display, on an edit view, the '''p_self must have link=True. I need to display, on an edit view, the
p_refObject in the listbox that will allow the user to choose which p_refObject in the listbox that will allow the user to choose which
object(s) to link through the Ref. The information to display may object(s) to link through the Ref. The information to display may
only be the object title or more if self.shownInfo is used.''' only be the object title or more if "shownInfo" is used.'''
res = '' res = ''
for fieldName in self.shownInfo: for name in self.getAttribute(obj, 'shownInfo'):
refType = refObject.o.getAppyType(fieldName) refType = refObject.o.getAppyType(name)
value = getattr(refObject, fieldName) value = getattr(refObject, name)
value = refType.getShownValue(refObject.o, value) value = refType.getShownValue(refObject.o, value)
if refType.type == 'String': if refType.type == 'String':
if refType.format == 2: if refType.format == 2:

View file

@ -911,7 +911,7 @@ class String(Field):
from DateTime import DateTime from DateTime import DateTime
obj.modified = DateTime() obj.modified = DateTime()
obj.reindex() obj.reindex()
obj.log('Ajax-edited %s%s on %s.' % (self.name, part, obj.id)) obj.log('ajax-edited %s%s on %s.' % (self.name, part, obj.id))
def getIndexType(self): def getIndexType(self):
'''Index type varies depending on String parameters.''' '''Index type varies depending on String parameters.'''

View file

@ -825,7 +825,8 @@ class XmlMarshaller:
and (field.name not in self.fieldsToMarshall): continue and (field.name not in self.fieldsToMarshall): continue
# Determine field type and value # Determine field type and value
fieldType = (field.type == 'File') and 'file' or 'basic' fieldType = (field.type == 'File') and 'file' or 'basic'
v = field.getXmlValue(instance, field.getValue(instance)) v = field.getXmlValue(instance.appy(),
field.getValue(instance))
self.dumpField(res, field.name, v, fieldType=fieldType) self.dumpField(res, field.name, v, fieldType=fieldType)
# Dump the object history # Dump the object history
if hasattr(instance.aq_base, 'workflow_history'): if hasattr(instance.aq_base, 'workflow_history'):