#33566: Issue with migrations after upgrading Django 2 to Django 3.2.
-------------------------------------+-------------------------------------
     Reporter:  Ismael Jerez         |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Migrations           |                  Version:  3.2
     Severity:  Normal               |               Resolution:
     Keywords:  orm, migrate,        |             Triage Stage:
  makemigrations, database,          |  Unreviewed
  migrations, migration              |
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Ismael Jerez):

 * status:  closed => new
 * resolution:  needsinfo =>


Comment:

 Hi:

 Thanks you for your reply. I don't have any customisation. About
 internationalisation this is my setting:

 {{{
 LANGUAGE_CODE = 'es-es'

 TIME_ZONE = 'Europe/Madrid'

 USE_I18N = True

 USE_L10N = True

 USE_TZ = True
 }}}

 I test it removing these options so makemigrations generates new
 migrations like reverting verbose_name to English but anyway when I run
 migrate after that I still getting the message about changes not reflected
 in a migration...

 I don't think the rest of my variables could take affect on migrations.

 My last try:
 I edited makemigrations command replacing commenting some lines just as
 migrate command:

 {{{
 autodetector = MigrationAutodetector(
             loader.project_state(),
             ProjectState.from_apps(apps),
             # questioner,
         )
 }}}

 {{{
 changes = autodetector.changes(
             graph=loader.graph,
             # trim_to_apps=app_labels or None,
             # convert_apps=app_labels or None,
             # migration_name=self.migration_name,
         )

 }}}

 After this and removing internationalisation settings, it generates all
 these migrations:
 {{{
 Migrations for 'contenttypes':
   venv2\lib\site-
 packages\django\contrib\contenttypes\migrations\0004_auto_20220610_0826.py
     - Change Meta options on contenttype
     - Alter field model on contenttype
 Migrations for 'sessions':
   venv2\lib\site-
 packages\django\contrib\sessions\migrations\0003_auto_20220610_0826.py
     - Change Meta options on session
     - Alter field expire_date on session
     - Alter field session_data on session
     - Alter field session_key on session
 Migrations for 'auth':
   venv2\lib\site-
 packages\django\contrib\auth\migrations\0014_auto_20220610_0826.py
     - Change Meta options on group
     - Change Meta options on permission
     - Change Meta options on user
     - Alter field name on group
     - Alter field permissions on group
     - Alter field codename on permission
     - Alter field content_type on permission
     - Alter field name on permission
     - Alter field date_joined on user
     - Alter field email on user
     - Alter field first_name on user
     - Alter field groups on user
     - Alter field is_active on user
     - Alter field is_staff on user
     - Alter field is_superuser on user
     - Alter field last_login on user
     - Alter field last_name on user
     - Alter field password on user
     - Alter field user_permissions on user
     - Alter field username on user
 Migrations for 'admin':
   venv2\lib\site-
 packages\django\contrib\admin\migrations\0005_auto_20220610_0826.py
     - Change Meta options on logentry
     - Alter field action_flag on logentry
     - Alter field action_time on logentry
     - Alter field change_message on logentry
     - Alter field content_type on logentry
     - Alter field object_id on logentry
     - Alter field object_repr on logentry
     - Alter field user on logentry
 }}}

 These are the last three migrations generated on auth app:

 {{{
 from django.db import migrations, models


 class Migration(migrations.Migration):

     dependencies = [
         ('auth', '0009_alter_user_last_name_max_length'),
     ]

     operations = [
         migrations.AlterField(
             model_name='group',
             name='name',
             field=models.CharField(max_length=150, unique=True,
 verbose_name='name'),
         ),
     ]

 }}}


 {{{
 import sys

 from django.core.management.color import color_style
 from django.db import IntegrityError, migrations, transaction
 from django.db.models import Q

 WARNING = """
     A problem arose migrating proxy model permissions for {old} to {new}.

       Permission(s) for {new} already existed.
       Codenames Q: {query}

     Ensure to audit ALL permissions for {old} and {new}.
 """


 def update_proxy_model_permissions(apps, schema_editor, reverse=False):
     """
     Update the content_type of proxy model permissions to use the
 ContentType
     of the proxy model.
     """
     style = color_style()
     Permission = apps.get_model('auth', 'Permission')
     ContentType = apps.get_model('contenttypes', 'ContentType')
     alias = schema_editor.connection.alias
     for Model in apps.get_models():
         opts = Model._meta
         if not opts.proxy:
             continue
         proxy_default_permissions_codenames = [
             '%s_%s' % (action, opts.model_name)
             for action in opts.default_permissions
         ]
         permissions_query =
 Q(codename__in=proxy_default_permissions_codenames)
         for codename, name in opts.permissions:
             permissions_query = permissions_query | Q(codename=codename,
 name=name)
         content_type_manager = ContentType.objects.db_manager(alias)
         concrete_content_type = content_type_manager.get_for_model(Model,
 for_concrete_model=True)
         proxy_content_type = content_type_manager.get_for_model(Model,
 for_concrete_model=False)
         old_content_type = proxy_content_type if reverse else
 concrete_content_type
         new_content_type = concrete_content_type if reverse else
 proxy_content_type
         try:
             with transaction.atomic(using=alias):
                 Permission.objects.using(alias).filter(
                     permissions_query,
                     content_type=old_content_type,
                 ).update(content_type=new_content_type)
         except IntegrityError:
             old = '{}_{}'.format(old_content_type.app_label,
 old_content_type.model)
             new = '{}_{}'.format(new_content_type.app_label,
 new_content_type.model)
             sys.stdout.write(style.WARNING(WARNING.format(old=old,
 new=new, query=permissions_query)))


 def revert_proxy_model_permissions(apps, schema_editor):
     """
     Update the content_type of proxy model permissions to use the
 ContentType
     of the concrete model.
     """
     update_proxy_model_permissions(apps, schema_editor, reverse=True)


 class Migration(migrations.Migration):
     dependencies = [
         ('auth', '0010_alter_group_name_max_length'),
         ('contenttypes', '0002_remove_content_type_name'),
     ]
     operations = [
         migrations.RunPython(update_proxy_model_permissions,
 revert_proxy_model_permissions),
     ]
 }}}


 {{{
 from django.db import migrations, models


 class Migration(migrations.Migration):

     dependencies = [
         ('auth', '0011_update_proxy_permissions'),
     ]

     operations = [
         migrations.AlterField(
             model_name='user',
             name='first_name',
             field=models.CharField(blank=True, max_length=150,
 verbose_name='first name'),
         ),
     ]
 }}}

 I can paste you the rest of the migrations if you need them.

 Just in case, remember I was migrating from Django 2 to Django 3.

 These are my installed pip packages, just to be sure any of these are not
 affecting it:
 {{{
 django==3.2.13
 django-debug-toolbar
 cx-Oracle==7.3.0
 django-braces
 django-tinymce==2.8.0
 suds-jurko==0.6
 django-bootstrap3
 django-wkhtmltopdf==3.3.0
 xlwt==1.3.0
 ftfy==5.7
 psycopg2
 selenium
 django-nocaptcha-recaptcha==0.0.20
 zeep
 }}}

 Thanks you in advance,
 Ismael.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33566#comment:4>
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/010701814c592447-428e669e-ae38-45e3-89ed-3c0f78ca892d-000000%40eu-central-1.amazonses.com.

Reply via email to