@@ -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 )
0 commit comments