Skip to content
This repository was archived by the owner on Sep 29, 2023. It is now read-only.

Commit f1ebedc

Browse files
committed
bone specific renderings moved and split to their Bones. As a result we don't need to override the renderer for new Bones.
1 parent 409bb61 commit f1ebedc

File tree

11 files changed

+222
-305
lines changed

11 files changed

+222
-305
lines changed

bones/bone.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,3 +465,18 @@ def setBoneValue(self, valuesCache, boneName, value, append, *args, **kwargs):
465465
return True
466466
else:
467467
return False
468+
469+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
470+
ret = {
471+
"descr":_( self.descr ),
472+
"type":self.type,
473+
"required":self.required,
474+
"params":self.params,
475+
"visible":self.visible,
476+
"readOnly":self.readOnly
477+
}
478+
479+
return ret
480+
481+
def renderBoneValue( self,skel,boneName, rendererObj = None, *args, **kwargs ):
482+
return skel[boneName]

bones/captchaBone.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,9 @@ def fromClient(self, valuesCache, name, data):
5757
return None
5858
return( u"Invalid Captcha" )
5959

60+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
61+
ret = super(captchaBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
62+
ret.update( {
63+
"publicKey":self.publicKey,
64+
} )
65+
return ret

bones/dateBone.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,32 @@ def buildDBFilter( self, name, skel, dbFilter, rawFilter, prefix=None ):
280280
def performMagic( self, valuesCache, name, isAdd ):
281281
if (self.creationMagic and isAdd) or self.updateMagic:
282282
self.setLocalized( valuesCache, name, ExtendedDateTime.now() )
283+
284+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
285+
ret = super(dateBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
286+
ret.update( {
287+
"date":self.date,
288+
"time":self.time
289+
} )
290+
return ret
291+
292+
def renderBoneValue( self, skel, boneName, rendererObj = None, *args, **kwargs ):
293+
from server.render.json import default as jsonrenderer
294+
from server.render.xml import default as xmlrenderer
295+
from server.render.vi import default as virenderer
296+
from server.render.admin import default as adminrenderer
297+
298+
if isinstance(rendererObj,jsonrenderer) or\
299+
isinstance( rendererObj, virenderer ) or\
300+
isinstance( rendererObj, adminrenderer ) or\
301+
isinstance( rendererObj, xmlrenderer ): #datetime object is not json serializable
302+
if skel[ boneName ]:
303+
if self.date and self.time:
304+
return skel[ boneName ].strftime( "%d.%m.%Y %H:%M:%S" )
305+
elif self.date:
306+
return skel[ boneName ].strftime( "%d.%m.%Y" )
307+
308+
return skel[ boneName ].strftime( "%H:%M:%S" )
309+
return None
310+
else:
311+
return super(dateBone, self).renderBoneValue(skel,boneName,rendererObj,*args,**kwargs)

bones/numericBone.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,12 @@ def getSearchDocumentFields(self, valuesCache, name, prefix = ""):
115115
if isinstance(valuesCache.get(name), int) or isinstance(valuesCache.get(name), float):
116116
return [search.NumberField(name=prefix + name, value=valuesCache[name])]
117117
return []
118+
119+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
120+
ret = super(numericBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
121+
ret.update( {
122+
"precision":self.precision,
123+
"min":self.min,
124+
"max":self.max
125+
} )
126+
return ret

bones/relationalBone.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,3 +949,112 @@ def blobsFromSkel(skel, valuesCache):
949949
if valuesCache[name]["rel"]:
950950
res.update(blobsFromSkel(self._usingSkelCache, valuesCache[name]["rel"]))
951951
return res
952+
953+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
954+
from server.skeleton import RefSkel, skeletonByKind #prevent circular imports
955+
from server import bones
956+
ret = super(relationalBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
957+
958+
if isinstance( self, bones.hierarchyBone ):
959+
boneType = "hierarchy"
960+
elif isinstance( self, bones.treeItemBone ):
961+
boneType = "treeitem"
962+
elif isinstance( self, bones.treeDirBone ):
963+
boneType = "treedir"
964+
else:
965+
boneType = "relational"
966+
967+
ret.update( {
968+
"type":"%s.%s" % (boneType, self.kind),
969+
"module":self.module,
970+
"multiple":self.multiple,
971+
"format":self.format,
972+
"using":rendererObj.renderSkelStructure( self.using() ) if self.using else None,
973+
"relskel":rendererObj.renderSkelStructure( RefSkel.fromSkel( skeletonByKind( self.kind ), *self.refKeys ) )
974+
} )
975+
976+
return ret
977+
978+
def renderBoneValue( self,skel,boneName, rendererObj = None, *args, **kwargs ):
979+
from server.render.json import default as jsonrenderer
980+
from server.render.xml import default as xmlrenderer
981+
from server.render.vi import default as virenderer
982+
from server.render.admin import default as adminrenderer
983+
from server.render.html import default as htmlrenderer
984+
985+
if isinstance( rendererObj, jsonrenderer ) or \
986+
isinstance( rendererObj, virenderer ) or \
987+
isinstance( rendererObj, adminrenderer ) or \
988+
isinstance( rendererObj, xmlrenderer ):
989+
if isinstance( skel[ boneName ], list ):
990+
refSkel = self._refSkelCache
991+
usingSkel = self._usingSkelCache
992+
tmpList = [ ]
993+
for k in skel[ boneName ]:
994+
refSkel.setValuesCache( k[ "dest" ] )
995+
if usingSkel:
996+
usingSkel.setValuesCache( k.get( "rel", { } ) )
997+
usingData = rendererObj.renderSkelValues( usingSkel )
998+
else:
999+
usingData = None
1000+
tmpList.append( {
1001+
"dest":rendererObj.renderSkelValues( refSkel ),
1002+
"rel":usingData
1003+
} )
1004+
1005+
return tmpList
1006+
1007+
elif isinstance( skel[ boneName ], dict ):
1008+
refSkel = self._refSkelCache
1009+
usingSkel = self._usingSkelCache
1010+
refSkel.setValuesCache( skel[ boneName ][ "dest" ] )
1011+
if usingSkel:
1012+
usingSkel.setValuesCache( skel[ boneName ].get( "rel", { } ) )
1013+
usingData = rendererObj.renderSkelValues( usingSkel )
1014+
else:
1015+
usingData = None
1016+
return {
1017+
"dest":rendererObj.renderSkelValues( refSkel ),
1018+
"rel":usingData
1019+
}
1020+
elif isinstance(rendererObj,htmlrenderer):
1021+
if isinstance(skel[ boneName ], list):
1022+
tmpList = []
1023+
for k in skel[ boneName ]:
1024+
refSkel = self._refSkelCache
1025+
refSkel.setValuesCache(k["dest"])
1026+
if self.using is None:
1027+
tmpList.append(rendererObj.collectSkelData(refSkel))
1028+
else:
1029+
usingSkel = self._usingSkelCache
1030+
if k["rel"]:
1031+
usingSkel.setValuesCache(k["rel"])
1032+
usingData = rendererObj.collectSkelData(usingSkel)
1033+
else:
1034+
usingData = None
1035+
tmpList.append({
1036+
"dest": rendererObj.collectSkelData(refSkel),
1037+
"rel": usingData
1038+
})
1039+
return tmpList
1040+
elif isinstance(skel[ boneName ], dict):
1041+
refSkel = self._refSkelCache
1042+
refSkel.setValuesCache(skel[ boneName ]["dest"])
1043+
if self.using is None:
1044+
return rendererObj.collectSkelData(refSkel)
1045+
else:
1046+
usingSkel = self._usingSkelCache
1047+
if skel[ boneName ]["rel"]:
1048+
usingSkel.setValuesCache(skel[ boneName ]["rel"])
1049+
usingData = rendererObj.collectSkelData(usingSkel)
1050+
else:
1051+
usingData = None
1052+
1053+
return {
1054+
"dest": rendererObj.collectSkelData(refSkel),
1055+
"rel": usingData
1056+
}
1057+
else:
1058+
return None
1059+
else:
1060+
return super(relationalBone, self).renderBoneValue(skel,boneName,rendererObj,*args,**kwargs)

bones/selectBone.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,32 @@ def unserialize(self, valuesCache, name, expando):
113113

114114
return True
115115

116+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
117+
ret = super(selectBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
118+
ret.update( {
119+
"values":OrderedDict( [ (k, _( v )) for (k, v) in self.values.items() ] ),
120+
"multiple":self.multiple
121+
} )
122+
return ret
123+
124+
def renderBoneValue( self, skel, boneName, rendererObj = None, *args, **kwargs ):
125+
from server.render.html import default as htmlrenderer
126+
127+
if isinstance(rendererObj,htmlrenderer): # datetime object is not json serializable
128+
skelValue = skel[ boneName ]
129+
if self.multiple and not isinstance( skelValue, list ):
130+
return [ rendererObj.KeyValueWrapper( skelValue, self.values[ skelValue ] ) ]
131+
elif self.multiple:
132+
return [
133+
rendererObj.KeyValueWrapper( val, self.values[ val ] ) if val in self.values else val
134+
for val in skelValue
135+
]
136+
elif skelValue in self.values:
137+
return rendererObj.KeyValueWrapper( skelValue, self.values[ skelValue ] )
138+
return skelValue
139+
else:
140+
return super(selectBone, self).renderBoneValue(skel,boneName,rendererObj,*args,**kwargs)
141+
116142

117143
class selectOneBone(selectBone):
118144
def __init__(self, *args, **kwargs):

bones/stringBone.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,3 +382,10 @@ def getUniquePropertyIndexValue(self, valuesCache, name):
382382
return( None )
383383
return( super( stringBone, self).getUniquePropertyIndexValue(valuesCache, name))
384384

385+
def renderBoneStructure( self, rendererObj=None, *args, **kwargs ):
386+
ret = super(stringBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
387+
ret.update( {
388+
"languages":self.languages,
389+
"multiple":self.multiple
390+
} )
391+
return ret

bones/textBone.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,3 +326,11 @@ def getSearchDocumentFields(self, valuesCache, name, prefix = ""):
326326
return [search.HtmlField(name=prefix + name, value=unicode(valuesCache[name]))]
327327
else:
328328
return [search.TextField(name=prefix + name, value=unicode(valuesCache[name]))]
329+
330+
def renderBoneStructure( self, rendererObj = None, *args, **kwargs ):
331+
ret = super(textBone, self).renderBoneStructure(rendererObj, *args, **kwargs)
332+
ret.update( {
333+
"validHtml":self.validHtml,
334+
"languages":self.languages
335+
} )
336+
return ret

render/html/default.py

Lines changed: 4 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -198,69 +198,8 @@ def renderBoneStructure(self, bone):
198198
:rtype: dict
199199
"""
200200

201-
# Base bone contents.
202-
ret = {
203-
"descr": _(bone.descr),
204-
"type": bone.type,
205-
"required":bone.required,
206-
"params":bone.params,
207-
"visible": bone.visible,
208-
"readOnly": bone.readOnly
209-
}
210-
211-
if bone.type == "relational" or bone.type.startswith("relational."):
212-
if isinstance(bone, hierarchyBone):
213-
boneType = "hierarchy"
214-
elif isinstance(bone, treeItemBone):
215-
boneType = "treeitem"
216-
else:
217-
boneType = "relational"
218-
219-
ret.update({
220-
"type": bone.type,
221-
"module": bone.module,
222-
"multiple": bone.multiple,
223-
"format": bone.format,
224-
"using": self.renderSkelStructure(bone.using()) if bone.using else None,
225-
"relskel": self.renderSkelStructure(RefSkel.fromSkel(skeletonByKind(bone.kind), *bone.refKeys))
226-
})
227-
228-
elif bone.type == "select" or bone.type.startswith("select."):
229-
ret.update({
230-
"values": OrderedDict([(k, _(v)) for (k, v) in bone.values.items()]),
231-
"multiple": bone.multiple
232-
})
233-
234-
elif bone.type == "date" or bone.type.startswith("date."):
235-
ret.update({
236-
"date": bone.date,
237-
"time": bone.time
238-
})
239-
240-
elif bone.type == "numeric" or bone.type.startswith("numeric."):
241-
ret.update({
242-
"precision": bone.precision,
243-
"min": bone.min,
244-
"max": bone.max
245-
})
246-
247-
elif bone.type == "text" or bone.type.startswith("text."):
248-
ret.update({
249-
"validHtml": bone.validHtml,
250-
"languages": bone.languages
251-
})
252-
253-
elif bone.type == "str" or bone.type.startswith("str."):
254-
ret.update({
255-
"languages": bone.languages,
256-
"multiple": bone.multiple
257-
})
258-
elif bone.type == "captcha" or bone.type.startswith("captcha."):
259-
ret.update({
260-
"publicKey": bone.publicKey,
261-
})
262-
263-
return ret
201+
return bone.renderBoneStructure(self)
202+
264203

265204
def renderSkelStructure(self, skel):
266205
"""
@@ -300,61 +239,9 @@ def renderBoneValue(self, bone, skel, key):
300239
:return: A dict containing the rendered attributes.
301240
:rtype: dict
302241
"""
303-
if bone.type == "select" or bone.type.startswith("select."):
304-
skelValue = skel[key]
305-
if isinstance(skelValue, list):
306-
return [
307-
Render.KeyValueWrapper(val, bone.values[val]) if val in bone.values else val
308-
for val in skelValue
309-
]
310-
elif skelValue in bone.values:
311-
return Render.KeyValueWrapper(skelValue, bone.values[skelValue])
312-
return skelValue
313-
elif bone.type=="relational" or bone.type.startswith("relational."):
314-
if isinstance(skel[key], list):
315-
tmpList = []
316-
for k in skel[key]:
317-
refSkel = bone._refSkelCache
318-
refSkel.setValuesCache(k["dest"])
319-
if bone.using is None:
320-
tmpList.append(self.collectSkelData(refSkel))
321-
else:
322-
usingSkel = bone._usingSkelCache
323-
if k["rel"]:
324-
usingSkel.setValuesCache(k["rel"])
325-
usingData = self.collectSkelData(usingSkel)
326-
else:
327-
usingData = None
328-
tmpList.append({
329-
"dest": self.collectSkelData(refSkel),
330-
"rel": usingData
331-
})
332-
return tmpList
333-
elif isinstance(skel[key], dict):
334-
refSkel = bone._refSkelCache
335-
refSkel.setValuesCache(skel[key]["dest"])
336-
if bone.using is None:
337-
return self.collectSkelData(refSkel)
338-
else:
339-
usingSkel = bone._usingSkelCache
340-
if skel[key]["rel"]:
341-
usingSkel.setValuesCache(skel[key]["rel"])
342-
usingData = self.collectSkelData(usingSkel)
343-
else:
344-
usingData = None
345-
346-
return {
347-
"dest": self.collectSkelData(refSkel),
348-
"rel": usingData
349-
}
350-
else:
351-
return None
352-
else:
353-
#logging.error("RETURNING")
354-
#logging.error((skel[key]))
355-
return skel[key]
356242

357-
return None
243+
return bone.renderBoneValue( skel, key, self )
244+
358245

359246

360247
def collectSkelData(self, skel):

0 commit comments

Comments
 (0)