From aaed92f301a6862f30e817e23a50a21e8ae12e7b Mon Sep 17 00:00:00 2001 From: Rich Atkinson Date: Wed, 11 Nov 2015 16:01:20 +1100 Subject: [PATCH] do not delete uploaded images or page revisions when a user is deleted. fixes #1918 --- CHANGELOG.txt | 1 + CONTRIBUTORS.rst | 1 + docs/releases/1.3.rst | 1 + ...022_uploaded_by_user_on_delete_set_null.py | 32 +++++++++++++++++++ ...alter_page_revision_on_delete_behaviour.py | 24 ++++++++++++++ wagtail/wagtailcore/models.py | 5 ++- .../0010_change_on_delete_behaviour.py | 24 ++++++++++++++ wagtail/wagtailimages/models.py | 3 +- 8 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 wagtail/tests/testapp/migrations/0022_uploaded_by_user_on_delete_set_null.py create mode 100644 wagtail/wagtailcore/migrations/0023_alter_page_revision_on_delete_behaviour.py create mode 100644 wagtail/wagtailimages/migrations/0010_change_on_delete_behaviour.py diff --git a/CHANGELOG.txt b/CHANGELOG.txt index abb56bff4a..89c08c411f 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -24,6 +24,7 @@ Changelog * Added an optional human-friendly `site_name` field to sites (Timo Rieber) * Added success message after updating image from the image upload view (Christian Peters) * New translations for Arabic and Latvian + * Fix: Images and page revisions created by a user are no longer deleted when the user is deleted (Rich Atkinson) * Fix: HTTP cache purge now works again on Python 2 (Mitchel Cabuloy) * Fix: Locked pages can no longer be unpublished (Alex Bridge) * Fix: Site records now implement `get_by_natural_key` diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst index eef65b6a56..f9caa346e7 100644 --- a/CONTRIBUTORS.rst +++ b/CONTRIBUTORS.rst @@ -90,6 +90,7 @@ Contributors * Christian Peters * Adon Metcalfe * rayrayndwiga +* Rich Atkinson Translators diff --git a/docs/releases/1.3.rst b/docs/releases/1.3.rst index a644d541b0..3ffa1f779d 100644 --- a/docs/releases/1.3.rst +++ b/docs/releases/1.3.rst @@ -74,6 +74,7 @@ Minor features Bug fixes ~~~~~~~~~ + * Images and page revisions created by a user are no longer deleted when the user is deleted (Rich Atkinson) * HTTP cache purge now works again on Python 2 (Mitchel Cabuloy) * Locked pages can no longer be unpublished (Alex Bridge) * Site records now implement ``get_by_natural_key`` diff --git a/wagtail/tests/testapp/migrations/0022_uploaded_by_user_on_delete_set_null.py b/wagtail/tests/testapp/migrations/0022_uploaded_by_user_on_delete_set_null.py new file mode 100644 index 0000000000..e343227fb3 --- /dev/null +++ b/wagtail/tests/testapp/migrations/0022_uploaded_by_user_on_delete_set_null.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('tests', '0021_custommanagerpage'), + ] + + operations = [ + migrations.AlterField( + model_name='customimage', + name='uploaded_by_user', + field=models.ForeignKey( + on_delete=django.db.models.deletion.SET_NULL, blank=True, editable=False, + to=settings.AUTH_USER_MODEL, null=True, verbose_name='uploaded by user' + ), + ), + migrations.AlterField( + model_name='customimagefilepath', + name='uploaded_by_user', + field=models.ForeignKey( + editable=False, to=settings.AUTH_USER_MODEL, null=True, blank=True, + on_delete=django.db.models.deletion.SET_NULL, verbose_name='uploaded by user' + ), + ), + ] diff --git a/wagtail/wagtailcore/migrations/0023_alter_page_revision_on_delete_behaviour.py b/wagtail/wagtailcore/migrations/0023_alter_page_revision_on_delete_behaviour.py new file mode 100644 index 0000000000..ec597685a5 --- /dev/null +++ b/wagtail/wagtailcore/migrations/0023_alter_page_revision_on_delete_behaviour.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0022_add_site_name'), + ] + + operations = [ + migrations.AlterField( + model_name='pagerevision', + name='user', + field=models.ForeignKey( + on_delete=django.db.models.deletion.SET_NULL, + verbose_name='user', blank=True, to=settings.AUTH_USER_MODEL, null=True + ), + ), + ] diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py index 7392393fba..2c37d6ee67 100644 --- a/wagtail/wagtailcore/models.py +++ b/wagtail/wagtailcore/models.py @@ -1338,7 +1338,10 @@ class PageRevision(models.Model): db_index=True ) created_at = models.DateTimeField(verbose_name=_('created at')) - user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'), null=True, blank=True) + user = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_('user'), null=True, blank=True, + on_delete=models.SET_NULL + ) content_json = models.TextField(verbose_name=_('content JSON')) approved_go_live_at = models.DateTimeField(verbose_name=_('approved go live at'), null=True, blank=True) diff --git a/wagtail/wagtailimages/migrations/0010_change_on_delete_behaviour.py b/wagtail/wagtailimages/migrations/0010_change_on_delete_behaviour.py new file mode 100644 index 0000000000..2d204cf3e1 --- /dev/null +++ b/wagtail/wagtailimages/migrations/0010_change_on_delete_behaviour.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailimages', '0009_capitalizeverbose'), + ] + + operations = [ + migrations.AlterField( + model_name='image', + name='uploaded_by_user', + field=models.ForeignKey( + on_delete=django.db.models.deletion.SET_NULL, blank=True, editable=False, + to=settings.AUTH_USER_MODEL, null=True, verbose_name='uploaded by user' + ), + ), + ] diff --git a/wagtail/wagtailimages/models.py b/wagtail/wagtailimages/models.py index 8212ecdc56..2a5d7ffcca 100644 --- a/wagtail/wagtailimages/models.py +++ b/wagtail/wagtailimages/models.py @@ -62,7 +62,8 @@ class AbstractImage(models.Model, TagSearchable): height = models.IntegerField(verbose_name=_('height'), editable=False) created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True, db_index=True) uploaded_by_user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_('uploaded by user'), null=True, blank=True, editable=False + settings.AUTH_USER_MODEL, verbose_name=_('uploaded by user'), + null=True, blank=True, editable=False, on_delete=models.SET_NULL ) tags = TaggableManager(help_text=None, blank=True, verbose_name=_('tags'))