Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Establish on_delete for ForeignKey re Django update #2645

Closed
phillxnet opened this issue Aug 8, 2023 · 5 comments
Closed

Establish on_delete for ForeignKey re Django update #2645

phillxnet opened this issue Aug 8, 2023 · 5 comments
Assignees

Comments

@phillxnet
Copy link
Member

phillxnet commented Aug 8, 2023

In part preparation for "Provisional Django 2.2 LTS update #2625" we need to update our models and migrations re:

RemovedInDjango20Warning: on_delete will be a required arg for ForeignKey in Django 2.0. Set it to models.CASCADE on models and in existing migrations if you want to maintain the current default behavior. See https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.on_delete

RemovedInDjango20Warning: on_delete will be a required arg for OneToOneField in Django 2.0. Set it to models.CASCADE on models and in existing migrations if you want to maintain the current default behavior. See https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.on_delete

/opt/rockstor/.venv/bin/python -Wd /opt/rockstor/.venv/bin/django-admin.py runserver lbuildvm.lan:80 
/opt/rockstor/src/rockstor/storageadmin/models/snapshot.py:25: RemovedInDjango20Warning: on_delete will be a required arg for ForeignKey in Django 2.0. Set it to models.CASCADE on models and in existing migrations if you want to maintain the current default behavior. See https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.on_delete
  share = models.ForeignKey("Share")  # Resolve circular dependency
/opt/rockstor/src/rockstor/storageadmin/models/share.py:31: RemovedInDjango20Warning: on_delete will be a required arg for ForeignKey in Django 2.0. Set it to models.CASCADE on models and in existing migrations if you want to maintain the current default behavior. See https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.on_delete
  pool = models.ForeignKey(Pool)
/opt/rockstor/src/rockstor/storageadmin/models/nfs_export.py:25: RemovedInDjango20Warning: on_delete will be a required arg for ForeignKey in Django 2.0. Set it to models.CASCADE on models and in existing migrations if you want to maintain the current default behavior. See https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.on_delete
  export_group = models.ForeignKey(NFSExportGroup)

Many more reports like above though-out most of our models.

[EDIT] The following checklist was sed prepared from the full version of the above after all duplicate warnings (and leading src path) were first removed via a regular editor:

sed ':a; /\:$/N; s/\:\n/ /; ta' models-dupliicate-warnings-removed.txt > on_delete_model_list.txt
sed -i 's/^/- \[ \] /' on_delete_model_list.txt
  • storageadmin/models/snapshot.py:25 share = models.ForeignKey("Share") # Resolve circular dependency
    The above item was resolved by the below related fixes.
  • storageadmin/models/share.py:31 pool = models.ForeignKey(Pool)
  • storageadmin/models/nfs_export.py:25 export_group = models.ForeignKey(NFSExportGroup)
  • storageadmin/models/nfs_export.py:27 share = models.ForeignKey(Share)
  • storageadmin/models/iscsi_target.py:24 share = models.ForeignKey(Share)
  • storageadmin/models/network_interface.py:62 master = models.ForeignKey("NetworkConnection", null=True)
  • storageadmin/models/network_interface.py:226 connection = models.ForeignKey(NetworkConnection, null=True)
  • storageadmin/models/network_interface.py:236 connection = models.ForeignKey(NetworkConnection, null=True)
  • storageadmin/models/network_interface.py:247 connection = models.ForeignKey(NetworkConnection, null=True)
  • storageadmin/models/network_interface.py:258 connection = models.ForeignKey(NetworkConnection, null=True)
  • smart_manager/models/service.py:34 service = models.ForeignKey(Service)
  • smart_manager/models/nfsd.py:29 rid = models.ForeignKey(SProbe)
  • smart_manager/models/nfsd.py:54 rid = models.ForeignKey(SProbe)
  • smart_manager/models/nfsd_share.py:29 rid = models.ForeignKey(SProbe)
  • smart_manager/models/nfsd_share_client.py:29 rid = models.ForeignKey(SProbe)
  • smart_manager/models/nfsd_uid_gid.py:29 rid = models.ForeignKey(SProbe)
  • smart_manager/models/task.py:25 task_def = models.ForeignKey(TaskDefinition)
  • smart_manager/models/share_replication.py:51 replica = models.ForeignKey(Replica)
  • smart_manager/models/share_replication.py:95 rshare = models.ForeignKey(ReplicaShare)
  • storageadmin/models/dashboard_config.py:24 user = models.OneToOneField(User, null=False)
  • storageadmin/models/user.py:31 user = models.OneToOneField(DjangoUser, null=True, blank=True, related_name="suser")
  • storageadmin/models/user.py:44 group = models.ForeignKey(Group, null=True, blank=True)
  • storageadmin/models/samba_share.py:27 share = models.OneToOneField("Share", related_name="sambashare")
  • storageadmin/models/samba_custom.py:24 smb_share = models.ForeignKey(SambaShare)
  • storageadmin/models/posix_acls.py:24 smb_share = models.ForeignKey(SambaShare)
  • storageadmin/models/scrub.py:25 pool = models.ForeignKey(Pool)
  • storageadmin/models/sftp.py:26 share = models.OneToOneField("Share")
  • storageadmin/models/oauth_app.py:25 application = models.OneToOneField(Application)
  • storageadmin/models/oauth_app.py:27 user = models.ForeignKey(User)
  • storageadmin/models/pool_balance.py:25 pool = models.ForeignKey(Pool)
  • storageadmin/models/rockon.py:100 rockon = models.ForeignKey(RockOn)
  • storageadmin/models/rockon.py:101 dimage = models.ForeignKey(DImage)
  • storageadmin/models/rockon.py:114 source = models.OneToOneField(DContainer)
  • storageadmin/models/rockon.py:115 destination = models.ForeignKey(DContainer, related_name="destination_container")
  • storageadmin/models/rockon.py:124 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:125 connection = models.ForeignKey(BridgeConnection)
  • storageadmin/models/rockon.py:149 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:170 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:171 share = models.ForeignKey(Share, null=True)
  • storageadmin/models/rockon.py:193 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:202 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:211 rockon = models.ForeignKey(RockOn)
  • storageadmin/models/rockon.py:226 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:234 container = models.ForeignKey(DContainer)
  • storageadmin/models/rockon.py:246 container = models.ForeignKey(DContainer)
  • storageadmin/models/smart.py:24 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:34 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:51 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:59 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:71 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:84 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:92 info = models.ForeignKey("SMARTInfo")
  • storageadmin/models/smart.py:132 disk = models.ForeignKey(Disk)
  • storageadmin/models/update_subscription.py:31 appliance = models.ForeignKey(Appliance)
  • storageadmin/models/installed_plugin.py:24 plugin_meta = models.ForeignKey(Plugin)
  • storageadmin/models/snapshot.py:25 share = models.ForeignKey("Share") # Resolve circular dependency

Performing system checks...

System check identified no issues (0 silenced).

  • storageadmin/migrations/0002_auto_20161125_0051.py:18: field=models.OneToOneField(to=settings.AUTH_USER_MODEL),
  • storageadmin/migrations/0013_auto_20200815_2004.py:28 ('connection', models.ForeignKey(to='storageadmin.NetworkConnection', null=True)),
  • storageadmin/migrations/0013_auto_20200815_2004.py:35 ('connection', models.ForeignKey(to='storageadmin.BridgeConnection')),
  • storageadmin/migrations/0013_auto_20200815_2004.py:36 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • storageadmin/migrations/0001_initial.py:97 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • storageadmin/migrations/0001_initial.py:105 ('destination', models.ForeignKey(related_name='destination_container', to='storageadmin.DContainer')),
  • storageadmin/migrations/0001_initial.py:106 ('source', models.OneToOneField(to='storageadmin.DContainer')),
  • storageadmin/migrations/0001_initial.py:158 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • storageadmin/migrations/0001_initial.py:170 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • storageadmin/migrations/0001_initial.py:247 ('master', models.ForeignKey(to='storageadmin.NetworkConnection', null=True)),
  • storageadmin/migrations/0001_initial.py:287 ('application', models.OneToOneField(to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)),
  • storageadmin/migrations/0001_initial.py:335 ('pool', models.ForeignKey(to='storageadmin.Pool')),
  • storageadmin/migrations/0001_initial.py:361 ('pool', models.ForeignKey(to='storageadmin.Pool')),
  • storageadmin/migrations/0001_initial.py:445 ('pool', models.ForeignKey(to='storageadmin.Pool')),
  • storageadmin/migrations/0001_initial.py:518 ('disk', models.ForeignKey(to='storageadmin.Disk')),
  • storageadmin/migrations/0001_initial.py:531 ('info', models.ForeignKey(to='storageadmin.SMARTInfo')),
  • storageadmin/migrations/0001_initial.py:539 ('info', models.ForeignKey(to='storageadmin.SMARTInfo')),
  • storageadmin/migrations/0001_initial.py:556 ('share', models.ForeignKey(to='storageadmin.Share')),
  • storageadmin/migrations/0001_initial.py:575 ('connection', models.ForeignKey(to='storageadmin.NetworkConnection', null=True)),
  • storageadmin/migrations/0001_initial.py:596 ('appliance', models.ForeignKey(to='storageadmin.Appliance')),
  • storageadmin/migrations/0001_initial.py:611 ('group', models.ForeignKey(blank=True, to='storageadmin.Group', null=True)),
  • storageadmin/migrations/0001_initial.py:613 ('user', models.OneToOneField(related_name='suser', null=True, blank=True, to=settings.AUTH_USER_MODEL)),
  • storageadmin/migrations/0001_initial.py:619 field=models.ForeignKey(to='storageadmin.SMARTInfo'),
  • storageadmin/migrations/0001_initial.py:624 field=models.ForeignKey(to='storageadmin.SMARTInfo'),
  • storageadmin/migrations/0001_initial.py:629 field=models.ForeignKey(to='storageadmin.SMARTInfo'),
  • storageadmin/migrations/0001_initial.py:634 field=models.ForeignKey(to='storageadmin.SMARTInfo'),
  • storageadmin/migrations/0001_initial.py:639 field=models.ForeignKey(to='storageadmin.SMARTInfo'),
  • storageadmin/migrations/0001_initial.py:644 field=models.OneToOneField(to='storageadmin.Share'),
  • storageadmin/migrations/0001_initial.py:649 field=models.OneToOneField(related_name='sambashare', to='storageadmin.Share'),
  • storageadmin/migrations/0001_initial.py:654 field=models.ForeignKey(to='storageadmin.SambaShare'),
  • storageadmin/migrations/0001_initial.py:659 field=models.ForeignKey(to='storageadmin.SambaShare'),
  • storageadmin/migrations/0001_initial.py:668 field=models.ForeignKey(to='storageadmin.User'),
  • storageadmin/migrations/0001_initial.py:673 field=models.ForeignKey(to='storageadmin.NFSExportGroup'),
  • storageadmin/migrations/0001_initial.py:678 field=models.ForeignKey(to='storageadmin.Share'),
  • storageadmin/migrations/0001_initial.py:683 field=models.OneToOneField(related_name='netatalkshare', to='storageadmin.Share'),
  • storageadmin/migrations/0001_initial.py:688 field=models.ForeignKey(to='storageadmin.Share'),
  • storageadmin/migrations/0001_initial.py:693 field=models.ForeignKey(to='storageadmin.Plugin'),
  • storageadmin/migrations/0001_initial.py:698 field=models.ForeignKey(to='storageadmin.NetworkConnection', null=True),
  • storageadmin/migrations/0001_initial.py:703 field=models.ForeignKey(to='storageadmin.Share', null=True),
  • storageadmin/migrations/0001_initial.py:713 field=models.ForeignKey(to='storageadmin.RockOn'),
  • storageadmin/migrations/0001_initial.py:718 field=models.ForeignKey(to='storageadmin.DImage'),
  • storageadmin/migrations/0001_initial.py:723 field=models.ForeignKey(to='storageadmin.RockOn'),
  • storageadmin/migrations/0001_initial.py:728 field=models.ForeignKey(to=settings.AUTH_USER_MODEL, unique=True),
  • storageadmin/migrations/0001_initial.py:733 field=models.ForeignKey(to='storageadmin.DContainer'),
  • storageadmin/migrations/0001_initial.py:738 field=models.ForeignKey(to='storageadmin.NetworkConnection', null=True),
  • storageadmin/migrations/0006_dcontainerargs.py:20 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • storageadmin/migrations/0007_auto_20181210_0740.py:20 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • storageadmin/migrations/0005_auto_20180913_0923.py:22 ('container', models.ForeignKey(to='storageadmin.DContainer')),
  • smart_manager/migrations/0001_initial.py:251 ('replica', models.ForeignKey(to='smart_manager.Replica')),
  • smart_manager/migrations/0001_initial.py:270 ('service', models.ForeignKey(to='smart_manager.Service')),
  • smart_manager/migrations/0001_initial.py:328 field=models.ForeignKey(to='smart_manager.TaskDefinition'),
  • smart_manager/migrations/0001_initial.py:333 field=models.ForeignKey(to='smart_manager.ReplicaShare'),
  • smart_manager/migrations/0001_initial.py:338 field=models.ForeignKey(to='smart_manager.SProbe'),
  • smart_manager/migrations/0001_initial.py:343 field=models.ForeignKey(to='smart_manager.SProbe'),
  • smart_manager/migrations/0001_initial.py:348 field=models.ForeignKey(to='smart_manager.SProbe'),
  • smart_manager/migrations/0001_initial.py:353 field=models.ForeignKey(to='smart_manager.SProbe'),
  • smart_manager/migrations/0001_initial.py:358 field=models.ForeignKey(to='smart_manager.SProbe'),
@phillxnet phillxnet self-assigned this Aug 8, 2023
@phillxnet
Copy link
Member Author

Just have to sort out the appropriate migration file for all these changes and some back-log we have in the migration area and can then present a pull request against this issue.

@phillxnet
Copy link
Member Author

Notes on the creation of the associated new migration files:

lbuildvm:/opt/rockstor # cd /opt/rockstor
lbuildvm:/opt/rockstor # export DJANGO_SETTINGS_MODULE=settings
lbuildvm:/opt/rockstor # poetry run django-admin makemigrations storageadmin
Migrations for 'storageadmin':
  src/rockstor/storageadmin/migrations/0017_auto_20230810_1141.py
    - Alter field hostname on appliance
    - Alter field config_backup on configbackup
    - Alter field editable on nfsexportgroup
    - Alter field mount_security on nfsexportgroup
    - Alter field syncable on nfsexportgroup
    - Alter field description on plugin
    - Alter field display_name on plugin
    - Alter field status on poolbalance
    - Alter field rate on poolscrub
    - Alter field status on poolscrub
    - Alter field owner on posixacls
    - Alter field perms on posixacls
    - Alter field browsable on sambashare
    - Alter field comment on sambashare
    - Alter field guest_ok on sambashare
    - Alter field read_only on sambashare
    - Alter field editable on sftp
    - Alter field group on share
    - Alter field owner on share
    - Alter field perms on share
    - Alter field pqgroup on share
    - Alter field assessment on smartidentity
    - Alter field ata_version on smartidentity
    - Alter field capacity on smartidentity
    - Alter field device_model on smartidentity
    - Alter field enabled on smartidentity
    - Alter field firmware_version on smartidentity
    - Alter field in_smartdb on smartidentity
    - Alter field model_family on smartidentity
    - Alter field rotation_rate on smartidentity
    - Alter field sata_version on smartidentity
    - Alter field scanned_on on smartidentity
    - Alter field sector_size on smartidentity
    - Alter field serial_number on smartidentity
    - Alter field supported on smartidentity
    - Alter field version on smartidentity
    - Alter field world_wide_name on smartidentity
    - Alter field real_name on snapshot
    - Alter field snap_type on snapshot
    - Alter field case_type on supportcase
    - Alter field status on supportcase
    - Alter field username on user
lbuildvm:/opt/rockstor # poetry run django-admin makemigrations smart_manager
Migrations for 'smart_manager':
  src/rockstor/smart_manager/migrations/0003_auto_20230810_1143.py
    - Alter field state on sprobe
    - Alter field task_type on taskdefinition

@phillxnet
Copy link
Member Author

phillxnet commented Aug 10, 2023

The new migration files do not contain the new on_delete. It is currently assumed this is as a result of having back-ported the on_delete additions to our existing migration files. However there does exist entries in the migration files stating an AlterField for each affected model.
See: https://code.djangoproject.com/ticket/28677
And: https://docs.djangoproject.com/en/dev/releases/1.9/#foreignkey-and-onetoonefield-on-delete-argument

@phillxnet
Copy link
Member Author

Test migrations of within an initrock prepared database set look to apply as expected:

lbuildvm:~ # cd /opt/rockstor
lbuildvm:/opt/rockstor # export DJANGO_SETTINGS_MODULE=settings
lbuildvm:/opt/rockstor # poetry run django-admin migrate storageadmin
Operations to perform:
  Apply all migrations: storageadmin
Running migrations:
  Applying storageadmin.0017_auto_20230810_1141... OK
lbuildvm:/opt/rockstor # poetry run django-admin migrate --database=smart_manager smart_manager
Operations to perform:
  Apply all migrations: smart_manager
Running migrations:
  Applying smart_manager.0003_auto_20230810_1143... OK

phillxnet added a commit to phillxnet/rockstor-core that referenced this issue Aug 10, 2023
Adds now required on_delete argument to all ForeignKey and
OneToOneField definitions: in both model definitions and
all prior migration files. The resulting migration files
for storageadmin (default) and smart_manager were created
via:

- poetry run django-admin makemigrations storageadmin
- poetry run django-admin makemigrations smart_manager
phillxnet added a commit that referenced this issue Aug 14, 2023
…ForeignKey-re-Django-update

Establish on_delete for ForeignKey re Django update #2645
@phillxnet
Copy link
Member Author

Closing as:
Fixed by #2648

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant