Beispiel #1
0
def retour_branche(request):
    '''revoie la branche de l arbre des compétences définie par GET['node']
    si 'lazy'=false, renvoie la branche en profondeur (tous les descendants)
    '''
    
    def parcours_branche(noeud,iter_noeud):
        ''' parcourt la branche à partir de "noeud", retour json'''
        item={}
        item['id']=noeud.id
        item['text']=noeud.nom
        item['chemin']=noeud.chemin
        item['depth']=noeud.depth
        #item['leaf']=noeud.is_leaf()
        item['leaf']=False
        if not noeud.is_leaf():
            #c'est un noeud avec des fils
            item['children']=[]
            anc_noeud=noeud
            encore=True
            
            # parcours des fils            
            while encore:
                noeud=iter_noeud.next() # inutile de faire un try, "encore" nous suffit
                encore=(noeud.rgt<anc_noeud.rgt-1)
                # noeud.is_child_of(anc_noeud) fait une requête. On remplace
                # par un test direct
                #TODO: modifier la class NS
                # remarque : ici pas besoin de tester lft (parcours gauche à droite)
                if (noeud.rgt<anc_noeud.rgt) and (noeud.depth==anc_noeud.depth+1):
                    item['children'].append(parcours_branche(noeud,iter_noeud))
        return item
    
    envois_graphe=('graphe' in request.GET )
    
    if request.GET['node']=='ux':
        return []
    if request.GET['node']=='src':
        is_root=True
        if 'pos' in request.GET and request.GET['pos']=='gauche':
            est_graphe=True
            #TODO: intégrer le select_related a get_root_nodes (comme pour get_desc)
            comps=Graphe_competences.get_root_nodes().select_related('competence__nom')
            #comps=Graphe_competences.get_root_nodes(select_related='competence__nom')
        else :
            est_graphe=False
            if envois_graphe:
                #select_related ne marche pas sur les ..._set
                #comps=Competence.get_root_nodes().select_related('graphe_competences_set')                
                comps=Competence.get_root_nodes_infos_graphe()
                
            else:
                comps=Competence.get_root_nodes().order_by('tree_id')                
    else:
        is_root=False
        if 'pos' in request.GET and request.GET['pos']=='gauche':
            est_graphe=True
            comps=Graphe_competences.objects.get(id=request.GET['node']).get_children().select_related('competence__nom')
        else:
            est_graphe=False
            if envois_graphe:
                #comps=Competence.objects.get(id=request.GET['node']).get_children().select_related('graphe_competences_set')
                comps=Competence.objects.get(id=request.GET['node']).get_children_infos_graphe()
            else:
                comps=Competence.objects.get(id=request.GET['node']).get_children()
    items=[]
    lazy=True
    if request.GET.has_key('lazy'):
        lazy=request.GET['lazy']!='False'
    if not lazy:
        for c in comps:
            iter_arbre=Competence.get_tree(c).iterator()
            items.append(parcours_branche(iter_arbre.next(),iter_arbre))
    else:
        for c in comps:
            item={}
            item['id']=c.id
            item['is_root']=is_root
            
            if est_graphe:
                item['text']='(%2d) %s '%(c.graphe,c.competence.nom)
                item['nom']=c.competence.nom
                item['competence_id']=c.competence.id
                item['graphe']=c.graphe
                item['niveau']=c.niveau
                item['user']=c.user_id
            else:
                item['text']=c.nom
                item['nom']=c.nom
                item['user']=c.user_id
            #item['leaf']=c.is_leaf()
            item['leaf']=False
            item['feuille']=c.is_leaf()
            if c.is_leaf(): item['expandable']=True
            item['tree']=c.tree_id
            if envois_graphe :
                if c.graphe is not None : 
                    #item['text']='(%2d) %s' %(c.niveau,item['text'])
                    liste_graphes=c.liste_graphes.split(',')
                    if len(liste_graphes)>1:
                        #il y a des liens de créés
                        item['liens']='%s' % (len(liste_graphes)-1)
                        if request.user.has_perm('application.est_admin'):
                            if c.user_id is None:
                                item['iconCls']='icon-group_link'
                            elif c.user_id==request.user.id:
                                item['iconCls']='icon-user_suit'
                            else:
                                item['iconCls']='icon-folder_link'
                        elif c.user_id==request.user.id or c.user_id is None:
                            if c.depth==1:
                                item['iconCls']='icon-user'
                            else:
                                item['iconCls']='icon-folder_link'
                        else:
                            if c.depth==1:
                                item['iconCls']='icon-folder'
                            else:
                                item['iconCls']='icon-folder_link'
                        liste_graphes.remove(str(c.graphe))
                        liste=', '.join(liste_graphes)
                        item['qtip']='Des liens vers d\'autres graphes existent ('+liste+')'
                    else:
                        if request.user.has_perm('application.est_admin'):
                            if c.user_id is None:
                                item['iconCls']='icon-group'
                            elif c.user_id==request.user.id:
                                item['iconCls']='icon-user_suit'
                            else:
                                item['iconCls']='icon-user_green'
                        elif c.user_id==request.user.id or c.user_id is None:
                            item['iconCls']='icon-user'                            
                        else:
                            item['iconCls']='icon-folder'
                        item['qtip']='Aucun lien n\'a encore été créé'
                        item['liens']=None
                else:
                    item['iconCls']='icon-folder_error'
                    item['qtip']='Cette compétence ne fait pas partie d`un graphe'
                    item['qtipTitle']='Attention!'
                    
                item['liens_graphe']=c.liste_graphes
                item['graphe']=c.graphe      
                item['niveau']=c.niveau
            if est_graphe:                
                item['type_lien']=c.type_lien
                item['qtipTitle']='Lien:'
                if c.type_lien == 'E':
                    item['iconCls']='icon-arrow_right'
                    item['qtip']='Equivalencegfh'
                elif c.type_lien=='D':
                    item['iconCls']='icon-arrow_divide'
                    item['qtip']='Décomposition'
                else:
                    item['iconCls']='icon-text_heading_%s' % (operator.mod(c.niveau,6)+1)
                    #item['overCls']='cssGras' -> marche po
                    item['qtip']='pas de lien mais un qtip sur %s' % item['id']
                    item['qtitle']='Truc:'
            if request.GET.has_key('pos'): 
                item['pos']=request.GET['pos']
                #if item['pos']=='droite'and c.tree_id==5: item['iconCls']='icon-application_add' 
            items.append(item)
    return items