def ajout_competence(request): POST=request.POST if not ('id_parent' in POST and 'tree_parent' in POST and 'graphe_parent' in POST and 'newName' in POST): return {'success':False,'msg':u'Clés manquantes.'} id=POST['id_parent'] tree=POST['tree_parent'] graphe=POST['graphe_parent'] newName=POST['newName'] if id=='src' and request.user.has_perm('application.is_admin'): # on rajoute une racine comp_ajout=Competence.add_root(nom=newName,user_id=request.user.id) return {'success':True,'id':comp_ajout.id,'liste':[]} try: comp=Competence.objects.get(id=id) except: return {'success':False,'msg':u'Compétence %s (%s) inexistante' % (newName,id)} if (comp.user==None) or (comp.user==request.user) or request.user.has_perm('application.is_admin'): #user=comp.user user=request.user comp_ajout=comp.add_child(nom=newName,user=user) #mise à jour des graphes cibles=Graphe_competences.objects.filter(competence__id=id) liste=[] for comp in cibles: c=comp.add_child(competence_id=comp_ajout.id,tree_id=tree,user=user) liste.append(comp.id) return {'success':True,'id':comp_ajout.id,'liste':liste} return {'success':False,'msg':u'Vous n\'avez pas les permissions sur cette compétence.'}
def save_model2(self,request,obj,form): ''' sauvegarde du modèle en construisant l'arbre ''' try: parent=Competence.objects.get(id=form.data['parent']) except (Competence.DoesNotExist, ValueError): competence=Competence.add_root(nom=obj.nom,abbrev=obj.abbrev,description=obj.description) else: competence=parent.add_child(nom=obj.nom,abbrev=obj.abbrev,description=obj.description) return competence
def liste_piliers(request): #TODO : envois liste pilier d'un arbre + définir dans l'arbre s'il a des piliers? comps=Competence.objects.get(nom="segpa").get_children() | Competence.get_root_nodes() #préparation de la sortie en JSON retour={'identifier':'id', 'label':'nom', 'items':[]} for c in comps: item={} item['id']=c.id item['nom']='...'*(c.depth-1)+c.nom item['text']=c.nom item['chemin']=c.chemin item['depth']=c.depth item['type']='noeud' retour['items'].append(item) return retour['items']
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