#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.