Example #1
0
    def test_add_m2m(self):
        with reversion_api.create_revision():
            new_pet = Pet.objects.create(name="added pet")
            self.person.pets.add(new_pet)
            self.person.save()
            reversion_api.set_comment("version 3: add a pet")

        self.assertEqual(reversion_api.Revision.objects.all().count(), 3)
        self.assertEqual(reversion_api.Version.objects.all().count(), 12)

        queryset = reversion_api.get_for_object(self.person)
        version_ids = queryset.values_list("pk", flat=True)
        self.assertEqual(len(version_ids), 3)

        response = self.client.get("/admin/tests/person/%s/history/" %
                                   self.person.pk)
        #        debug_response(response) # from django-tools
        self.assertContainsHtml(
            response,
            '<input type="submit" value="compare">',
            '<input type="radio" name="version_id1" value="%i" style="visibility:hidden" />'
            % version_ids[0],
            '<input type="radio" name="version_id2" value="%i" checked="checked" />'
            % version_ids[0],
            '<input type="radio" name="version_id1" value="%i" checked="checked" />'
            % version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' %
            version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' %
            version_ids[2],
            '<input type="radio" name="version_id2" value="%i" />' %
            version_ids[2],
        )

        response = self.client.get("/admin/tests/person/%s/history/compare/" %
                                   self.person.pk,
                                   data={
                                       "version_id2": version_ids[0],
                                       "version_id1": version_ids[1]
                                   })
        #        debug_response(response) # from django-tools

        self.assertContainsHtml(
            response,
            """
            <p class="highlight">
                <ins>+ added pet</ins><br />
                Is changed pet<br />
                always the same pet<br />
            </p>
            """,
            "<blockquote>version 3: add a pet</blockquote>",  # edit comment
        )
        self.assertNotContainsHtml(
            response,
            "<h3>name</h3>",  # person name doesn't changed
            'class="follow"'  # All fields are under reversion control
        )
Example #2
0
    def test_m2m_not_changed(self):
        with reversion_api.create_revision():
            self.person.name = "David"
            self.person.save()
            reversion_api.set_comment("version 3: change the name")

        self.assertEqual(reversion_api.Revision.objects.all().count(), 3)
        self.assertEqual(reversion_api.Version.objects.all().count(), 11)

        queryset = reversion_api.get_for_object(self.person)
        version_ids = queryset.values_list("pk", flat=True)
        self.assertEqual(len(version_ids), 3)

        response = self.client.get("/admin/tests/person/%s/history/" %
                                   self.person.pk)
        #        debug_response(response) # from django-tools
        self.assertContainsHtml(
            response,
            '<input type="submit" value="compare">',
            '<input type="radio" name="version_id1" value="%i" style="visibility:hidden" />'
            % version_ids[0],
            '<input type="radio" name="version_id2" value="%i" checked="checked" />'
            % version_ids[0],
            '<input type="radio" name="version_id1" value="%i" checked="checked" />'
            % version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' %
            version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' %
            version_ids[2],
            '<input type="radio" name="version_id2" value="%i" />' %
            version_ids[2],
        )

        response = self.client.get("/admin/tests/person/%s/history/compare/" %
                                   self.person.pk,
                                   data={
                                       "version_id2": version_ids[0],
                                       "version_id1": version_ids[1]
                                   })
        #        debug_response(response) # from django-tools

        self.assertContainsHtml(
            response,
            '''
            <p><pre class="highlight">
            <del>- Dave</del>
            <ins>+ David</ins>
            </pre></p>
            ''',
            "<blockquote>version 3: change the name</blockquote>",  # edit comment
        )
        self.assertNotContainsHtml(
            response,
            "pet",
            'class="follow"'  # All fields are under reversion control
        )
    def create_PersonIdentity_data(self):
        with reversion_api.create_revision():
            person = Person.objects.create(name="Dave")
            identity = Identity.objects.create(id_numer="1234", person=person)

        if self.verbose:
            print("version 1:", person, identity)

        with reversion_api.create_revision():
            person.name = "John"
            person.save()
            reversion_api.set_comment("version 2: change person name.")

        return person, identity
    def create_PersonIdentity_data(self):
        with reversion_api.create_revision():
            person = Person.objects.create(name="Dave")
            identity = Identity.objects.create(id_numer="1234", person=person)

        if self.verbose:
            print("version 1:", person, identity)

        with reversion_api.create_revision():
            person.name = "John"
            person.save()
            reversion_api.set_comment("version 2: change person name.")

        return person, identity
    def test_add_m2m(self):
        with reversion_api.create_revision():
            new_pet = Pet.objects.create(name="added pet")
            self.person.pets.add(new_pet)
            self.person.save()
            reversion_api.set_comment("version 3: add a pet")

        self.assertEqual(reversion_api.Revision.objects.all().count(), 3)
        self.assertEqual(reversion_api.Version.objects.all().count(), 12)

        queryset = reversion_api.get_for_object(self.person)
        version_ids = queryset.values_list("pk", flat=True)
        self.assertEqual(len(version_ids), 3)

        response = self.client.get("/admin/tests/person/%s/history/" % self.person.pk)
#        debug_response(response) # from django-tools
        self.assertContainsHtml(response,
            '<input type="submit" value="compare">',
            '<input type="radio" name="version_id1" value="%i" style="visibility:hidden" />' % version_ids[0],
            '<input type="radio" name="version_id2" value="%i" checked="checked" />' % version_ids[0],
            '<input type="radio" name="version_id1" value="%i" checked="checked" />' % version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' % version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' % version_ids[2],
            '<input type="radio" name="version_id2" value="%i" />' % version_ids[2],
        )

        response = self.client.get(
            "/admin/tests/person/%s/history/compare/" % self.person.pk,
            data={"version_id2":version_ids[0], "version_id1":version_ids[1]}
        )
#        debug_response(response) # from django-tools

        self.assertContainsHtml(response,
            """
            <p class="highlight">
                <ins>+ added pet</ins><br />
                Is changed pet<br />
                always the same pet<br />
            </p>
            """,
            "<blockquote>version 3: add a pet</blockquote>", # edit comment
        )
        self.assertNotContainsHtml(response,
            "<h3>name</h3>", # person name doesn't changed
            'class="follow"'# All fields are under reversion control
        )
    def test_m2m_not_changed(self):
        with reversion_api.create_revision():
            self.person.name = "David"
            self.person.save()
            reversion_api.set_comment("version 3: change the name")

        self.assertEqual(reversion_api.Revision.objects.all().count(), 3)
        self.assertEqual(reversion_api.Version.objects.all().count(), 11)

        queryset = reversion_api.get_for_object(self.person)
        version_ids = queryset.values_list("pk", flat=True)
        self.assertEqual(len(version_ids), 3)

        response = self.client.get("/admin/tests/person/%s/history/" % self.person.pk)
#        debug_response(response) # from django-tools
        self.assertContainsHtml(response,
            '<input type="submit" value="compare">',
            '<input type="radio" name="version_id1" value="%i" style="visibility:hidden" />' % version_ids[0],
            '<input type="radio" name="version_id2" value="%i" checked="checked" />' % version_ids[0],
            '<input type="radio" name="version_id1" value="%i" checked="checked" />' % version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' % version_ids[1],
            '<input type="radio" name="version_id2" value="%i" />' % version_ids[2],
            '<input type="radio" name="version_id2" value="%i" />' % version_ids[2],
        )

        response = self.client.get(
            "/admin/tests/person/%s/history/compare/" % self.person.pk,
            data={"version_id2":version_ids[0], "version_id1":version_ids[1]}
        )
#        debug_response(response) # from django-tools

        self.assertContainsHtml(response,
            '''
            <p><pre class="highlight">
            <del>- Dave</del>
            <ins>+ David</ins>
            </pre></p>
            ''',
            "<blockquote>version 3: change the name</blockquote>", # edit comment
        )
        self.assertNotContainsHtml(response,
            "pet",
            'class="follow"'# All fields are under reversion control
        )
    def create_Simple_data(self):
        with reversion_api.create_revision():
            item1 = SimpleModel.objects.create(text="version one")

        if self.verbose:
            print("version 1:", item1)

        with reversion_api.create_revision():
            item1.text = "version two"
            item1.save()
            reversion_api.set_comment("simply change the CharField text.")

        if self.verbose:
            print("version 2:", item1)

        for no in range(5):
            with reversion_api.create_revision():
                if no==0:
                    item2 = SimpleModel.objects.create(text="v0")
                    reversion_api.set_comment("create v%i" % no)
                else:
                    item2.text = "v%i" % no
                    item2.save()
                    reversion_api.set_comment("change to v%i" % no)

        return item1, item2
    def create_Simple_data(self):
        with reversion_api.create_revision():
            item1 = SimpleModel.objects.create(text="version one")

        if self.verbose:
            print("version 1:", item1)

        with reversion_api.create_revision():
            item1.text = "version two"
            item1.save()
            reversion_api.set_comment("simply change the CharField text.")

        if self.verbose:
            print("version 2:", item1)

        for no in range(5):
            with reversion_api.create_revision():
                if no == 0:
                    item2 = SimpleModel.objects.create(text="v0")
                    reversion_api.set_comment("create v%i" % no)
                else:
                    item2.text = "v%i" % no
                    item2.save()
                    reversion_api.set_comment("change to v%i" % no)

        return item1, item2
    def create_PersonPet_data(self):
        with reversion_api.create_revision():
            pet1 = Pet.objects.create(name="would be changed pet")
            pet2 = Pet.objects.create(name="would be deleted pet")
            pet3 = Pet.objects.create(name="would be removed pet")
            pet4 = Pet.objects.create(name="always the same pet")
            person = Person.objects.create(name="Dave")
            person.pets.add(pet1, pet2, pet3, pet4)
            person.save()
            reversion_api.set_comment("initial version 1")

        if self.verbose:
            print("version 1:", person, person.pets.all())
            # Dave [<Pet: would be changed pet>, <Pet: would be deleted pet>, <Pet: would be removed pet>, <Pet: always the same pet>]

        """ 1 to 2 diff:

        "pets" ManyToManyField:
            would be changed pet -> Is changed pet
            - would be removed pet
            - would be deleted pet
            = always the same pet
        """

        with reversion_api.create_revision():
            pet1.name = "Is changed pet"
            pet1.save()
            pet2.delete()
            person.pets.remove(pet3)
            person.save()
            reversion_api.set_comment("version 2: change follow related pets.")

        if self.verbose:
            print("version 2:", person, person.pets.all())
            # Dave [<Pet: Is changed pet>, <Pet: always the same pet>]

        return pet1, pet2, person
    def create_PersonPet_data(self):
        with reversion_api.create_revision():
            pet1 = Pet.objects.create(name="would be changed pet")
            pet2 = Pet.objects.create(name="would be deleted pet")
            pet3 = Pet.objects.create(name="would be removed pet")
            pet4 = Pet.objects.create(name="always the same pet")
            person = Person.objects.create(name="Dave")
            person.pets.add(pet1, pet2, pet3, pet4)
            person.save()
            reversion_api.set_comment("initial version 1")

        if self.verbose:
            print("version 1:", person, person.pets.all())
            # Dave [<Pet: would be changed pet>, <Pet: would be deleted pet>, <Pet: would be removed pet>, <Pet: always the same pet>]

        """ 1 to 2 diff:

        "pets" ManyToManyField:
            would be changed pet -> Is changed pet
            - would be removed pet
            - would be deleted pet
            = always the same pet
        """

        with reversion_api.create_revision():
            pet1.name = "Is changed pet"
            pet1.save()
            pet2.delete()
            person.pets.remove(pet3)
            person.save()
            reversion_api.set_comment("version 2: change follow related pets.")

        if self.verbose:
            print("version 2:", person, person.pets.all())
            # Dave [<Pet: Is changed pet>, <Pet: always the same pet>]

        return pet1, pet2, person
    def create_VariantModel_data(self):
        with reversion_api.create_revision():
            item = VariantModel.objects.create(
                boolean = False,
                null_boolean = None,

                char = "a",
                text = "Foo 'one'",
                # skip: models.SlugField()

                integer = 0,
                integers = "1,2,3", # CommaSeparatedIntegerField
                positive_integer = 1,
                big_integer = (-BigIntegerField.MAX_BIGINT - 1),
                # skip:
                # models.PositiveSmallIntegerField()
                # models.SmallIntegerField()

                time = datetime.time(hour=20, minute=15),
                date = datetime.date(year=1941, month=5, day=12), # Z3 was presented in germany ;)
                # PyLucid v0.0.1 release date:
                datetime = datetime.datetime(year=2005, month=8, day=19, hour=8, minute=13, second=24),

                decimal = Decimal('1.23456789'),
                float = 2.345,

                email = "*****@*****.**",
                url = "http://www.pylucid.org/",

                filepath = os.path.join(settings.UNITTEST_TEMP_PATH, "foo"),

                ip_address = "192.168.0.1",
                # skip: models.GenericIPAddressField()
            )
            reversion_api.set_comment("initial version")

        test_data = (
            ("boolean", True),
            ("null_boolean", True),
            ("null_boolean", False),
            ("char", "B"),
            ("text", "Bar 'two'"),
            # skip: models.SlugField()
            ("integer", -1),
            ("integers", "2,3,4"), # CommaSeparatedIntegerField
            ("positive_integer", 3),
            ("big_integer", BigIntegerField.MAX_BIGINT),
            # models.PositiveSmallIntegerField()
            # models.SmallIntegerField()
            ("time", datetime.time(hour=19, minute=30)),
            ("date", datetime.date(year=2099, month=12, day=31)),
            ("datetime", datetime.datetime(year=2000, month=1, day=1, hour=0, minute=0, second=1)),
            ("decimal", Decimal('3.1415926535')),
            ("float", 3.1415),
            ("email", "*****@*****.**"),
            ("url", "https://github.com/jedie/"),
            ("filepath", os.path.join(settings.UNITTEST_TEMP_PATH, "bar")),
            ("ip_address", "10.0.0.0"),
        )
        for no, (field_name, value) in enumerate(test_data):
            with reversion_api.create_revision():
                setattr(item, field_name, value)
                item.save()
                reversion_api.set_comment("%i change: %r field." % (no, field_name))

        return item, test_data
    def create_Factory_reverse_relation_data(self):
        from django.db import transaction

        with transaction.atomic(), reversion_api.create_revision():
            manufacturer = Factory.objects.create(name="factory one", address="1 Fake Plaza")
            different_manufacturer = Factory.objects.create(name="factory two", address="1 Fake Plaza")
            car1 = Car.objects.create(
                name="motor-car one",
                manufacturer=manufacturer
            )
            car2 = Car.objects.create(
                name="motor-car two",
                manufacturer=manufacturer
            )
            car3 = Car.objects.create(
                name="motor-car three",
                manufacturer=manufacturer
            )
            car1.save()
            car2.save()
            car3.save()
            manufacturer.save()
            reversion_api.set_comment("initial version 1")

        if self.verbose:
            print("version 1:", manufacturer)
            # Factory One

        """ 1 to 2 diff:

        "manufacture" ForeignKey:
            "factory one" -> "factory I"

        "supplier" ManyToManyField:
            + new, would be renamed supplier
            - would be deleted supplier
            - would be removed supplier
            = always the same supplier
        """

        with transaction.atomic(), reversion_api.create_revision():
            car3.delete()
            car4 = Car.objects.create(
                name="motor-car four",
                manufacturer=manufacturer
            )
            car4.save()

            worker1 = Person.objects.create(
                name="Bob Bobertson",
                workplace=manufacturer
            )

            manufacturer.save()
            reversion_api.set_comment("version 2: discontinued car-three, add car-four, add Bob the worker")

        if self.verbose:
            print("version 2:", manufacturer)
            # motor-car one from factory I supplier(s): always the same supplier, new, would be renamed supplier

        """ 2 to 3 diff:

        "name" CharField:
            "motor-car one" -> "motor-car II"

        "manufacture" ForeignKey:
            "factory I" -> "factory II"

        "supplier" ManyToManyField:
            new, would be renamed supplier -> not new anymore supplier
            = always the same supplier
        """

        with transaction.atomic(), reversion_api.create_revision():
            car2.manufacturer = different_manufacturer
            car2.save()
            manufacturer.save()
            reversion_api.set_comment("version 3: car2 now built by someone else.")

        if self.verbose:
            print("version 3:", manufacturer)
            # version 3: motor-car II from factory II supplier(s): always the same supplier, not new anymore supplier

        return manufacturer
    def create_FactoryCar_data(self):
        with reversion_api.create_revision():
            manufacture = Factory.objects.create(name="factory one", address="1 Fake Plaza")
            supplier1 = Factory.objects.create(name="always the same supplier", address="1 Fake Plaza")
            supplier2 = Factory.objects.create(name="would be deleted supplier", address="1 Fake Plaza")
            supplier3 = Factory.objects.create(name="would be removed supplier", address="1 Fake Plaza")
            car = Car.objects.create(
                name="motor-car one",
                manufacturer=manufacture
            )
            car.supplier.add(supplier1, supplier2, supplier3)
            car.save()
            reversion_api.set_comment("initial version 1")

        if self.verbose:
            print("version 1:", car)
            # motor-car one from factory one supplier(s): always the same supplier, would be deleted supplier, would be removed supplier

        """ 1 to 2 diff:

        "manufacture" ForeignKey:
            "factory one" -> "factory I"

        "supplier" ManyToManyField:
            + new, would be renamed supplier
            - would be deleted supplier
            - would be removed supplier
            = always the same supplier
        """

        with reversion_api.create_revision():
            manufacture.name = "factory I"
            manufacture.save()
            supplier2.delete() # - would be deleted supplier
            supplier4 = Factory.objects.create(name="new, would be renamed supplier", address="1 Fake Plaza")
            car.supplier.add(supplier4) # + new, would be renamed supplier
            car.supplier.remove(supplier3) # - would be removed supplier
            car.save()
            reversion_api.set_comment("version 2: change ForeignKey and ManyToManyField.")

        if self.verbose:
            print("version 2:", car)
            # motor-car one from factory I supplier(s): always the same supplier, new, would be renamed supplier

        """ 2 to 3 diff:

        "name" CharField:
            "motor-car one" -> "motor-car II"

        "manufacture" ForeignKey:
            "factory I" -> "factory II"

        "supplier" ManyToManyField:
            new, would be renamed supplier -> not new anymore supplier
            = always the same supplier
        """

        with reversion_api.create_revision():
            car.name = "motor-car II"
            manufacture.name = "factory II"
            supplier4.name = "not new anymore supplier"
            supplier4.save()
            car.save()
            reversion_api.set_comment("version 3: change CharField, ForeignKey and ManyToManyField.")

        if self.verbose:
            print("version 3:", car)
            # version 3: motor-car II from factory II supplier(s): always the same supplier, not new anymore supplier

        return car
    def create_VariantModel_data(self):
        with reversion_api.create_revision():
            item = VariantModel.objects.create(
                boolean=False,
                null_boolean=None,
                char="a",
                text="Foo 'one'",
                # skip: models.SlugField()
                integer=0,
                integers="1,2,3",  # CommaSeparatedIntegerField
                positive_integer=1,
                big_integer=(-BigIntegerField.MAX_BIGINT - 1),
                # skip:
                # models.PositiveSmallIntegerField()
                # models.SmallIntegerField()
                time=datetime.time(hour=20, minute=15),
                date=datetime.date(year=1941, month=5,
                                   day=12),  # Z3 was presented in germany ;)
                # PyLucid v0.0.1 release date:
                datetime=datetime.datetime(year=2005,
                                           month=8,
                                           day=19,
                                           hour=8,
                                           minute=13,
                                           second=24),
                decimal=Decimal('1.23456789'),
                float=2.345,
                email="*****@*****.**",
                url="http://www.pylucid.org/",
                filepath=os.path.join(settings.UNITTEST_TEMP_PATH, "foo"),
                ip_address="192.168.0.1",
                # skip: models.GenericIPAddressField()
            )
            reversion_api.set_comment("initial version")

        test_data = (
            ("boolean", True),
            ("null_boolean", True),
            ("null_boolean", False),
            ("char", "B"),
            ("text", "Bar 'two'"),
            # skip: models.SlugField()
            ("integer", -1),
            ("integers", "2,3,4"),  # CommaSeparatedIntegerField
            ("positive_integer", 3),
            ("big_integer", BigIntegerField.MAX_BIGINT),
            # models.PositiveSmallIntegerField()
            # models.SmallIntegerField()
            ("time", datetime.time(hour=19, minute=30)),
            ("date", datetime.date(year=2099, month=12, day=31)),
            ("datetime",
             datetime.datetime(year=2000,
                               month=1,
                               day=1,
                               hour=0,
                               minute=0,
                               second=1)),
            ("decimal", Decimal('3.1415926535')),
            ("float", 3.1415),
            ("email", "*****@*****.**"),
            ("url", "https://github.com/jedie/"),
            ("filepath", os.path.join(settings.UNITTEST_TEMP_PATH, "bar")),
            ("ip_address", "10.0.0.0"),
        )
        for no, (field_name, value) in enumerate(test_data):
            with reversion_api.create_revision():
                setattr(item, field_name, value)
                item.save()
                reversion_api.set_comment("%i change: %r field." %
                                          (no, field_name))

        return item, test_data
    def create_Factory_reverse_relation_data(self):
        from django.db import transaction

        with transaction.atomic(), reversion_api.create_revision():
            manufacturer = Factory.objects.create(name="factory one",
                                                  address="1 Fake Plaza")
            different_manufacturer = Factory.objects.create(
                name="factory two", address="1 Fake Plaza")
            car1 = Car.objects.create(name="motor-car one",
                                      manufacturer=manufacturer)
            car2 = Car.objects.create(name="motor-car two",
                                      manufacturer=manufacturer)
            car3 = Car.objects.create(name="motor-car three",
                                      manufacturer=manufacturer)
            car1.save()
            car2.save()
            car3.save()
            manufacturer.save()
            reversion_api.set_comment("initial version 1")

        if self.verbose:
            print("version 1:", manufacturer)
            # Factory One
        """ 1 to 2 diff:

        "manufacture" ForeignKey:
            "factory one" -> "factory I"

        "supplier" ManyToManyField:
            + new, would be renamed supplier
            - would be deleted supplier
            - would be removed supplier
            = always the same supplier
        """

        with transaction.atomic(), reversion_api.create_revision():
            car3.delete()
            car4 = Car.objects.create(name="motor-car four",
                                      manufacturer=manufacturer)
            car4.save()

            worker1 = Person.objects.create(name="Bob Bobertson",
                                            workplace=manufacturer)

            manufacturer.save()
            reversion_api.set_comment(
                "version 2: discontinued car-three, add car-four, add Bob the worker"
            )

        if self.verbose:
            print("version 2:", manufacturer)
            # motor-car one from factory I supplier(s): always the same supplier, new, would be renamed supplier
        """ 2 to 3 diff:

        "name" CharField:
            "motor-car one" -> "motor-car II"

        "manufacture" ForeignKey:
            "factory I" -> "factory II"

        "supplier" ManyToManyField:
            new, would be renamed supplier -> not new anymore supplier
            = always the same supplier
        """

        with transaction.atomic(), reversion_api.create_revision():
            car2.manufacturer = different_manufacturer
            car2.save()
            manufacturer.save()
            reversion_api.set_comment(
                "version 3: car2 now built by someone else.")

        if self.verbose:
            print("version 3:", manufacturer)
            # version 3: motor-car II from factory II supplier(s): always the same supplier, not new anymore supplier

        return manufacturer
    def create_FactoryCar_data(self):
        with reversion_api.create_revision():
            manufacture = Factory.objects.create(name="factory one",
                                                 address="1 Fake Plaza")
            supplier1 = Factory.objects.create(name="always the same supplier",
                                               address="1 Fake Plaza")
            supplier2 = Factory.objects.create(
                name="would be deleted supplier", address="1 Fake Plaza")
            supplier3 = Factory.objects.create(
                name="would be removed supplier", address="1 Fake Plaza")
            car = Car.objects.create(name="motor-car one",
                                     manufacturer=manufacture)
            car.supplier.add(supplier1, supplier2, supplier3)
            car.save()
            reversion_api.set_comment("initial version 1")

        if self.verbose:
            print("version 1:", car)
            # motor-car one from factory one supplier(s): always the same supplier, would be deleted supplier, would be removed supplier
        """ 1 to 2 diff:

        "manufacture" ForeignKey:
            "factory one" -> "factory I"

        "supplier" ManyToManyField:
            + new, would be renamed supplier
            - would be deleted supplier
            - would be removed supplier
            = always the same supplier
        """

        with reversion_api.create_revision():
            manufacture.name = "factory I"
            manufacture.save()
            supplier2.delete()  # - would be deleted supplier
            supplier4 = Factory.objects.create(
                name="new, would be renamed supplier", address="1 Fake Plaza")
            car.supplier.add(supplier4)  # + new, would be renamed supplier
            car.supplier.remove(supplier3)  # - would be removed supplier
            car.save()
            reversion_api.set_comment(
                "version 2: change ForeignKey and ManyToManyField.")

        if self.verbose:
            print("version 2:", car)
            # motor-car one from factory I supplier(s): always the same supplier, new, would be renamed supplier
        """ 2 to 3 diff:

        "name" CharField:
            "motor-car one" -> "motor-car II"

        "manufacture" ForeignKey:
            "factory I" -> "factory II"

        "supplier" ManyToManyField:
            new, would be renamed supplier -> not new anymore supplier
            = always the same supplier
        """

        with reversion_api.create_revision():
            car.name = "motor-car II"
            manufacture.name = "factory II"
            supplier4.name = "not new anymore supplier"
            supplier4.save()
            car.save()
            reversion_api.set_comment(
                "version 3: change CharField, ForeignKey and ManyToManyField.")

        if self.verbose:
            print("version 3:", car)
            # version 3: motor-car II from factory II supplier(s): always the same supplier, not new anymore supplier

        return car