2010-10-07 4 views
2

J'essaie de faire une copie d'une arborescence de pages FeinCMS, qui est gérée en utilisant django-mptt. J'ai écrit cette fonction:Faire une copie d'une arborescence de pages FeinCMS en utilisant django-mptt modifie l'ordre des fils

def make_tree_copy(page, parent=None): 
    ''' 
    Makes a copy of the tree starting at "page", reparenting it to "parent" 
    ''' 
    new_page = Page.objects.create_copy(page) 
    new_page.save() 
    Page.tree.move_node(new_page, parent) 

    # re-read so django-mptt fields get updated 
    new_page = Page.objects.get(id=new_page.id) 
    for child in page.get_children(): 
     # re-read so django-mptt fields get updated 
     child = Page.objects.get(id=child.id) 
     make_tree_copy(child, new_page) 

et l'appeler à l'aide

make_tree_copy(Page.tree.root_nodes()[0]) 

Il fonctionne en général, mais quand j'ai un arbre de la page qui ressemble à ceci:

A 
|- B 
    |- C 
    |- D 

Il vient comme cela :

A 
|- B 
    |- D 
    |- C 

De ma st En passant par le code mptt, la magie semble se produire dans mptt/managers.py/_inter_tree_move_and_close_gap(), où, pour une raison quelconque, les valeurs "lft" des petits-enfants sont modifiées. Avant le coup, ils sont C = 3, D = 5, après ils sont C = 5, D = 3.

Ce qui explique pourquoi D est trié avant C mais je ne sais pas pourquoi ces valeurs sont commutées. Des pensées?

Répondre

2

Ok, je savais une fois que je demande - je trouverais la réponse moi-même (après avoir passé des heures avant ...) Bien sûr, c'est le même problème que dans tous les autres problèmes django-mptt sur StackOverflow: vous devez -lire l'objet de la base de données.

Je l'ai fait dans l'extrait ci-dessus mais au mauvais endroit. Voici le code qui fonctionne (re-lecture du parent en entrant dans la fonction récursive):

def make_tree_copy(page, parent=None): 
    ''' 
    Makes a copy of the tree starting at "page", reparenting it to "parent" 
    ''' 
    if parent: 
     # re-read so django-mptt fields get updated 
     parent = Page.objects.get(id=parent.id) 

    new_page = Page.objects.create_copy(page) 
    new_page.save() 
    Page.tree.move_node(new_page, parent) 

    for child in page.get_children(): 
     make_tree_copy(child, new_page) 
+0

récentes versions django-MPTT sont un peu plus intelligent en matière de mise à jour des propriétés MPTT sur les instances de modèle (LFT, rght, niveau, etc.); peut-être qu'ils travaillent sans recharger des modèles encore et encore, je ne l'ai pas encore testé trop, cependant. –

Questions connexes