0
-Functions dealing with Modified Preorder Tree Traversal related setup
0
-and creation of instance methods for a model, given the names of its
0
-``treeify`` should be the only function a user of this application need
0
-use directly to set their model up for Modified Preorder Tree Traversal.
0
+New instance methods for Django models which are set up for Modified
0
+Preorder Tree Traversal.
0
-from django.db import models
0
-from django.db.models import signals
0
-from django.dispatch import dispatcher
0
-from django.utils.translation import ugettext as _
0
-from mptt.signals import pre_delete, pre_save
0
-from mptt.managers import TreeManager
0
-class AlreadySetUp(Exception):
0
- An attempt was made to set up a model for MPTT more than once.
0
-def treeify(model, parent_attr='parent', left_attr='lft', right_attr='rght',
0
- tree_id_attr='tree_id', level_attr='level',
0
- tree_manager_attr='tree'):
0
- Sets the given model class up for Modified Preorder Tree Traversal.
0
- raise AlreadySetUp(_('The model %s has already been set up for MPTT.') % model.__name__)
0
- registry.append(model)
0
- # Add tree options to the model's Options
0
- setattr(opts, 'parent_attr', parent_attr)
0
- setattr(opts, 'right_attr', right_attr)
0
- setattr(opts, 'left_attr', left_attr)
0
- setattr(opts, 'tree_id_attr', tree_id_attr)
0
- setattr(opts, 'level_attr', level_attr)
0
- setattr(opts, 'tree_manager_attr', tree_manager_attr)
0
- # Add tree fields if they do not exist
0
- for attr in [left_attr, right_attr, tree_id_attr, level_attr]:
0
- except models.FieldDoesNotExist:
0
- models.PositiveIntegerField(
0
- db_index=True, editable=False).contribute_to_class(model, attr)
0
- # Add tree methods for model instances
0
- setattr(model, 'get_ancestors', get_ancestors)
0
- setattr(model, 'get_children', get_children)
0
- setattr(model, 'get_descendants', get_descendants)
0
- setattr(model, 'get_descendant_count', get_descendant_count)
0
- setattr(model, 'get_next_sibling', get_next_sibling)
0
- setattr(model, 'get_previous_sibling', get_previous_sibling)
0
- setattr(model, 'get_root', get_root)
0
- setattr(model, 'get_siblings', get_siblings)
0
- setattr(model, 'is_child_node', is_child_node)
0
- setattr(model, 'is_leaf_node', is_leaf_node)
0
- setattr(model, 'is_root_node', is_root_node)
0
- setattr(model, 'move_to', move_to)
0
- # Add a custom tree manager
0
- TreeManager(parent_attr, left_attr, right_attr, tree_id_attr,
0
- level_attr).contribute_to_class(model, tree_manager_attr)
0
- setattr(model, '_tree_manager', getattr(model, tree_manager_attr))
0
- # Set up signal receivers to manage the tree when instances of the
0
- # model are about to be created, have their parent changed or be
0
- dispatcher.connect(pre_save, signal=signals.pre_save, sender=model)
0
- dispatcher.connect(pre_delete, signal=signals.pre_delete, sender=model)
0
def get_ancestors(self, ascending=False):
Comments
No one has commented yet.