pythondjangodjango-treebeard

Multiple versions (revisions) of objects with django treebeard MP_Node Tree


I'm using Materialized Path tree (provided by django-treebeard) to create a tree structure ( https://bitbucket.org/hoverhell/xmppforum/src/27207da4a061/snapboard/models.py#cl-363 ).

I'm trying to implement (recover) object (Post) editing that allows to view all previous revisions of the edited object.

Question is, where it would be better to store all the old revisions?

By now I have two ideas — 1. store them in some special place in the tree of Post mode, or 2. Implement an additional model for old revisions that can (somehow) be given a MP_Node Post object to be stored (retaining its previous revisions, too). But both ideas don't look very good. Another unfinished idea is to keep tree and data structures separately (referencing data from tree). But I strongly suspect it will be quite problematic too.


Solution

  • After all, I've implemented it with model subclassing (which means almost-duplicate table structures), with base abstract model (which contains the primary data), MP_Tree subclass model (with latest versions in tree structure) with 'previous' as link to model with old revisions, which has 'previous' pointing to self. Additionally, I used this function to “move” objects from tree model into the base model:

    @classmethod
    def make_from_post(cls, post):
        """ Create an object from another object, possibly of a slightly
        different class (like tree Post).  """
        data = {}
        for field in cls._meta.fields:
            if field.primary_key:
                continue
            # Assuming that all default fields for cls are None and thus
            # skipping 'None's from attribute values.
            attrdata = getattr(post, field.name, None)
            if attrdata is not None:
                data[field.name] = attrdata
        return cls(**data)
    

    which could probably be done better.