2009-03-04 8 views
1

J'utilise le templatetag de MPTT pour rendre mon arbre de genre.Django MPTT - Filtrage d'arbres

{% for genre, structure in genres|tree_info %} 
     {% if tree.new_level %}<ul><li>{% else %}</li><li>{% endif %} 
     {{ genre.name }} 
     {% for level in tree.closed_levels %}</li></ul>{% endfor %} 
    {% endfor %} 

La chose est, mon objet genre a is_visible propriété qui doit être respecté.

def is_visible(self): 
     if self.is_root_node() or not self.visibility: 
      return self.visibility       
     for parent in self.get_ancestors(): 
      if not parent.visibility:  
       return False          
     return True 

Quelle est la manière la plus intelligente et la plus propre d'accomplir ceci?


informations supplémentaires

J'ai besoin (X) imbrication de liste HTML à produire correctement. J'ai défini des fonctions SQL pour la vérification de la visibilité héritée.

CREATE OR REPLACE function get_genre_parent_id(_genre_id int) 
RETURNS INTEGER AS $$ 
DECLARE 
    _parent_id INTEGER; 
    _genre_id ALIAS FOR $1;  
BEGIN 
    SELECT parent_id INTO _parent_id 
    FROM product_productgenre 
    WHERE id = _genre_id; 

    RETURN _parent_id; 

END; 
$$ LANGUAGE plpgsql; 


CREATE OR REPLACE function is_genre_visible(_genre_id int) 
RETURNS BOOLEAN AS $$ 
DECLARE 
    _visible BOOLEAN; 
    _genre_id ALIAS FOR $1;  
BEGIN 
    SELECT visibility INTO _visible 
    FROM product_productgenre 
    WHERE id = _genre_id; 

    RETURN _visible; 

END; 
$$ LANGUAGE plpgsql; 


CREATE OR REPLACE function is_genre_branch_visible(_genre_id int) 
RETURNS BOOLEAN AS $$ 
DECLARE 
    visible BOOLEAN; 
    _genre_id ALIAS FOR $1; 
    _temp_genre_id INTEGER; 
BEGIN 
    visible = true; 
    _temp_genre_id := _genre_id; 
    -- checking for our own genre 
    IF NOT is_genre_visible(_temp_genre_id) THEN 
     RETURN false; 
    END IF; 
    -- iterating through all parent genres 
    WHILE get_genre_parent_id(_temp_genre_id) IS NOT NULL LOOP 
     _temp_genre_id = get_genre_parent_id(_temp_genre_id); 
     IF NOT is_genre_visible(_temp_genre_id) THEN 
      RETURN false; 
     END IF; 
    END LOOP; 

    RETURN visible; 

END; 
$$ LANGUAGE plpgsql; 

et a essayé de remplacer la balise full_tree_for_model pour le faire utiliser un gestionnaire personnalisé, qui ajoute simplement is_genre_branch_visible(genre_id) supplémentaire à la QuerySet. Mais quelque chose ne va pas avec la commande, ne peut pas vraiment comprendre cela.

Plus Cela fonctionne, mais je n'aime pas l'approche, me semble moche.

Répondre

-1

Eh bien, un simple

{% if genre.is_visible %} 

juste à l'intérieur de la boucle for qui devraient faire l'affaire :)

+0

Il ne sera pas, car il génère des balises invalides de nidification ('tree.closed_levels'). – ohnoes