def revert(self, delete=False):
     # Group the models by the database of the serialized model.
     versions_by_db = defaultdict(list)
     for version in self.version_set.iterator():
         versions_by_db[version.db].append(version)
     # For each db, perform a separate atomic revert.
     for version_db, versions in versions_by_db.items():
         with transaction.atomic(using=version_db):
             # Optionally delete objects no longer in the current revision.
             if delete:
                 # Get a set of all objects in this revision.
                 old_revision = set()
                 for version in versions:
                     model = version._model
                     try:
                         # Load the model instance from the same DB as it was saved under.
                         old_revision.add(model._default_manager.using(version.db).get(pk=version.object_id))
                     except model.DoesNotExist:
                         pass
                 # Calculate the set of all objects that are in the revision now.
                 current_revision = chain.from_iterable(
                     _follow_relations_recursive(obj)
                     for obj in old_revision
                 )
                 # Delete objects that are no longer in the current revision.
                 for item in current_revision:
                     if item not in old_revision:
                         item.delete(using=version.db)
             # Attempt to revert all revisions.
             _safe_revert(versions)
Beispiel #2
0
 def revert(self, delete=False):
     # Group the models by the database of the serialized model.
     versions_by_db = defaultdict(list)
     for version in self.version_set.iterator():
         versions_by_db[version.db].append(version)
     # For each db, perform a separate atomic revert.
     for version_db, versions in versions_by_db.items():
         with transaction.atomic(using=version_db):
             # Optionally delete objects no longer in the current revision.
             if delete:
                 # Get a set of all objects in this revision.
                 old_revision = set()
                 for version in versions:
                     model = version._model
                     try:
                         # Load the model instance from the same DB as it was saved under.
                         old_revision.add(model._default_manager.using(version.db).get(pk=version.object_id))
                     except model.DoesNotExist:
                         pass
                 # Calculate the set of all objects that are in the revision now.
                 current_revision = chain.from_iterable(
                     _follow_relations_recursive(obj)
                     for obj in old_revision
                 )
                 # Delete objects that are no longer in the current revision.
                 collector = Collector(using=version_db)
                 new_objs = [item for item in current_revision
                             if item not in old_revision]
                 for model, group in groupby(new_objs, type):
                     collector.collect(list(group))
                 collector.delete()
             # Attempt to revert all revisions.
             _safe_revert(versions)