def end(self): """Ends a revision.""" self._assert_active() self._depth -= 1 # Handle end of revision conditions here. if self._depth == 0: try: if self._versions and not self._is_invalid: # Save a new revision. revision = Revision.objects.create(user=self._user, comment=self._comment) revision_set = set() # Follow relationships. for version in self._versions: add_to_revision(version, revision_set) # Save version models. for obj in revision_set: fields, follow, format = get_registration_info(obj.__class__) object_id = unicode(obj.pk) content_type = ContentType.objects.get_for_model(obj) serialized_data = serializers.serialize(format, [obj], fields=fields) Version.objects.create(revision=revision, object_id=object_id, content_type=content_type, format=format, serialized_data=serialized_data, object_repr=unicode(obj)) for meta_cls, meta_kwargs in self._meta: meta_cls._default_manager.create(revision=revision, **meta_kwargs) finally: self._clear() return False
def revert(self, delete=False): """Reverts all objects in this revision.""" versions = self.version_set.all() for version in versions: version.revert() if delete: # Get a set of all objects in this revision. old_revision_set = set([version.latest_object_version for version in versions]) # Calculate the set of all objects that would be in the revision now. current_revision_set = set() for latest_object_version in old_revision_set: add_to_revision(latest_object_version, current_revision_set) for current_object in current_revision_set: if not current_object in old_revision_set: current_object.delete()
def revert(self, delete=False): """Reverts all objects in this revision.""" versions = self.version_set.all() for version in versions: version.revert() if delete: # Get a set of all objects in this revision. old_revision_set = set( [version.latest_object_version for version in versions]) # Calculate the set of all objects that would be in the revision now. current_revision_set = set() for latest_object_version in old_revision_set: add_to_revision(latest_object_version, current_revision_set) for current_object in current_revision_set: if not current_object in old_revision_set: current_object.delete()