#32263: squashmigrations produces incorrect result with a RenameModel on a
ForeignKey target.
-------------------------------------+-------------------------------------
     Reporter:  InvalidInterrupt     |                    Owner:  Anvesh
                                     |  Mishra
         Type:  Bug                  |                   Status:  assigned
    Component:  Migrations           |                  Version:  3.1
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by Anvesh Mishra):

 A regression test for this ticket would look something like this:
 {{{#!python
     def test_squashmigrations_rename_foreign_key(self):

         out = io.StringIO()
         with self.temporary_migration_module(
             module="migrations.test_migrations_rename"
         ) as migration_dir:
             call_command(
                 "squashmigrations",
                 "migrations",
                 "0003",
                 interactive=False,
                 stdout=out,
                 no_color=True,
             )
             squashed_migration_file = os.path.join(
                 migration_dir, "0001_squashed_0003_third.py"
             )
             with open(squashed_migration_file, encoding="utf-8") as fp:
                 content = fp.read()
                 self.assertIn('to="migrations.person"',content)
             self.assertTrue(os.path.exists(squashed_migration_file))
         self.assertEqual(
             out.getvalue(),
             f"Will squash the following migrations:\n"
             f" - 0001_initial\n"
             f" - 0002_second\n"
             f" - 0003_third\n"
             f"Optimizing...\n"
             f"  Optimized from 4 operations to 2 operations.\n"
             f"Created new squashed migration {squashed_migration_file}\n"
             f"  You should commit this migration but leave the old ones in
 place;\n"
             f"  the new migration will be used for new installs. Once you
 are sure\n"
             f"  all instances of the codebase have applied the migrations
 you "
             f"squashed,\n"
             f"  you can delete them.\n",
         )
 }}}
 By running this test I found out that the base migration objects created
 are of `CreateModel` so we need to somehow change the functionality of
 this section of `CreateModel.reduce()`:
 {{{#!python
 def reduce(self,operation,app_label):
         ...
         elif (
             isinstance(operation, RenameModel)
             and self.name_lower == operation.old_name_lower
         ):
             return [
                 CreateModel(
                     operation.new_name,
                     fields=self.fields,
                     options=self.options,
                     bases=self.bases,
                     managers=self.managers,
                 ),
             ]
 }}}
 to something like:
 {{{#!python
 def reduce(self,operation,app_label):
         ...
         elif (
             isinstance(operation, RenameModel)
             and self.name_lower == operation.old_name_lower
         ):
             return operation.reduce(operation,app_label)
 }}}
 and changing the functionality of `RenameModel.reduce()`. I hope I'm
 clear.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32263#comment:13>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070184a64e6dd9-8bc9b483-03fa-4c85-8e15-d484a37c7a58-000000%40eu-central-1.amazonses.com.

Reply via email to