kopia lustrzana https://github.com/wagtail/wagtail
Purge revisions of non-page models in purge_revisions command
rodzic
a84fdd4919
commit
690d0a740e
|
@ -13,7 +13,7 @@ except ImportError:
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = "Delete page revisions which are not the latest revision for a page, published or scheduled to be published, or in moderation"
|
help = "Delete revisions which are not the latest revision, published or scheduled to be published, or in moderation"
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
|
@ -39,7 +39,7 @@ class Command(BaseCommand):
|
||||||
|
|
||||||
def purge_revisions(days=None):
|
def purge_revisions(days=None):
|
||||||
# exclude revisions which have been submitted for moderation in the old system
|
# exclude revisions which have been submitted for moderation in the old system
|
||||||
purgeable_revisions = Revision.page_revisions.exclude(
|
purgeable_revisions = Revision.objects.exclude(
|
||||||
submitted_for_moderation=True
|
submitted_for_moderation=True
|
||||||
).exclude(
|
).exclude(
|
||||||
# and exclude revisions with an approved_go_live_at date
|
# and exclude revisions with an approved_go_live_at date
|
||||||
|
@ -61,7 +61,7 @@ def purge_revisions(days=None):
|
||||||
deleted_revisions_count = 0
|
deleted_revisions_count = 0
|
||||||
|
|
||||||
for revision in purgeable_revisions.iterator():
|
for revision in purgeable_revisions.iterator():
|
||||||
# don't delete the latest revision for any page
|
# don't delete the latest revision
|
||||||
if not revision.is_latest_revision():
|
if not revision.is_latest_revision():
|
||||||
revision.delete()
|
revision.delete()
|
||||||
deleted_revisions_count += 1
|
deleted_revisions_count += 1
|
||||||
|
|
|
@ -608,10 +608,11 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase):
|
||||||
self.assertFalse(self.snippet.expired)
|
self.assertFalse(self.snippet.expired)
|
||||||
|
|
||||||
|
|
||||||
class TestPurgeRevisionsCommand(TestCase):
|
class TestPurgeRevisionsCommandForPages(TestCase):
|
||||||
fixtures = ["test.json"]
|
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
self.object = self.get_object()
|
||||||
|
|
||||||
|
def get_object(self):
|
||||||
# Find root page
|
# Find root page
|
||||||
self.root_page = Page.objects.get(id=2)
|
self.root_page = Page.objects.get(id=2)
|
||||||
self.page = SimplePage(
|
self.page = SimplePage(
|
||||||
|
@ -622,6 +623,7 @@ class TestPurgeRevisionsCommand(TestCase):
|
||||||
)
|
)
|
||||||
self.root_page.add_child(instance=self.page)
|
self.root_page.add_child(instance=self.page)
|
||||||
self.page.refresh_from_db()
|
self.page.refresh_from_db()
|
||||||
|
return self.page
|
||||||
|
|
||||||
def run_command(self, days=None):
|
def run_command(self, days=None):
|
||||||
if days:
|
if days:
|
||||||
|
@ -632,32 +634,25 @@ class TestPurgeRevisionsCommand(TestCase):
|
||||||
return management.call_command("purge_revisions", stdout=StringIO())
|
return management.call_command("purge_revisions", stdout=StringIO())
|
||||||
|
|
||||||
def test_latest_revision_not_purged(self):
|
def test_latest_revision_not_purged(self):
|
||||||
|
revision_1 = self.object.save_revision()
|
||||||
revision_1 = self.page.save_revision()
|
revision_2 = self.object.save_revision()
|
||||||
|
|
||||||
revision_2 = self.page.save_revision()
|
|
||||||
|
|
||||||
self.run_command()
|
self.run_command()
|
||||||
|
|
||||||
# revision 1 should be deleted, revision 2 should not be
|
# revision 1 should be deleted, revision 2 should not be
|
||||||
self.assertNotIn(
|
self.assertFalse(Revision.objects.filter(id=revision_1.id).exists())
|
||||||
revision_1, Revision.page_revisions.filter(object_id=self.page.id)
|
self.assertTrue(Revision.objects.filter(id=revision_2.id).exists())
|
||||||
)
|
|
||||||
self.assertIn(
|
|
||||||
revision_2, Revision.page_revisions.filter(object_id=self.page.id)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_revisions_in_moderation_not_purged(self):
|
def test_revisions_in_moderation_not_purged(self):
|
||||||
|
revision = self.object.save_revision(submitted_for_moderation=True)
|
||||||
|
|
||||||
self.page.save_revision(submitted_for_moderation=True)
|
# Save a new revision to ensure that the moderated revision
|
||||||
|
# is not the latest one
|
||||||
|
self.object.save_revision()
|
||||||
|
|
||||||
self.run_command()
|
self.run_command()
|
||||||
|
|
||||||
self.assertTrue(
|
self.assertTrue(Revision.objects.filter(id=revision.id).exists())
|
||||||
Revision.page_revisions.filter(
|
|
||||||
object_id=self.page.id, submitted_for_moderation=True
|
|
||||||
).exists()
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from wagtail.models import Task, Workflow, WorkflowTask
|
from wagtail.models import Task, Workflow, WorkflowTask
|
||||||
|
@ -667,46 +662,43 @@ class TestPurgeRevisionsCommand(TestCase):
|
||||||
user = get_user_model().objects.first()
|
user = get_user_model().objects.first()
|
||||||
WorkflowTask.objects.create(workflow=workflow, task=task_1, sort_order=1)
|
WorkflowTask.objects.create(workflow=workflow, task=task_1, sort_order=1)
|
||||||
|
|
||||||
snippet = FullFeaturedSnippet.objects.create(text="Initial", live=False)
|
revision = self.object.save_revision()
|
||||||
page_revision = self.page.save_revision()
|
workflow.start(self.object, user)
|
||||||
snippet_revision = snippet.save_revision()
|
|
||||||
workflow.start(self.page, user)
|
# Save a new revision to ensure that the revision in the workflow
|
||||||
workflow.start(snippet, user)
|
# is not the latest one
|
||||||
|
self.object.save_revision()
|
||||||
|
|
||||||
self.run_command()
|
self.run_command()
|
||||||
|
|
||||||
# even though they're no longer the latest revisions, the old revisions
|
# even though they're no longer the latest revisions, the old revisions
|
||||||
# should stay as they are attached to an in progress workflow
|
# should stay as they are attached to an in progress workflow
|
||||||
self.assertTrue(Revision.objects.filter(id=page_revision.id).exists())
|
self.assertTrue(Revision.objects.filter(id=revision.id).exists())
|
||||||
self.assertTrue(Revision.objects.filter(id=snippet_revision.id).exists())
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def test_revisions_with_approve_go_live_not_purged(self):
|
def test_revisions_with_approve_go_live_not_purged(self):
|
||||||
|
revision = self.object.save_revision(
|
||||||
approved_revision = self.page.save_revision(
|
|
||||||
approved_go_live_at=timezone.now() + timedelta(days=1)
|
approved_go_live_at=timezone.now() + timedelta(days=1)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.page.save_revision()
|
# Save a new revision to ensure that the approved revision
|
||||||
|
# is not the latest one
|
||||||
|
self.object.save_revision()
|
||||||
|
|
||||||
self.run_command()
|
self.run_command()
|
||||||
|
|
||||||
self.assertIn(
|
self.assertTrue(Revision.objects.filter(id=revision.id).exists())
|
||||||
approved_revision, Revision.page_revisions.filter(object_id=self.page.id)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_purge_revisions_with_date_cutoff(self):
|
def test_purge_revisions_with_date_cutoff(self):
|
||||||
|
old_revision = self.object.save_revision()
|
||||||
|
|
||||||
old_revision = self.page.save_revision()
|
self.object.save_revision()
|
||||||
|
|
||||||
self.page.save_revision()
|
|
||||||
|
|
||||||
self.run_command(days=30)
|
self.run_command(days=30)
|
||||||
|
|
||||||
# revision should not be deleted, as it is younger than 30 days
|
# revision should not be deleted, as it is younger than 30 days
|
||||||
self.assertIn(
|
self.assertTrue(Revision.objects.filter(id=old_revision.id).exists())
|
||||||
old_revision, Revision.page_revisions.filter(object_id=self.page.id)
|
|
||||||
)
|
|
||||||
|
|
||||||
old_revision.created_at = timezone.now() - timedelta(days=31)
|
old_revision.created_at = timezone.now() - timedelta(days=31)
|
||||||
old_revision.save()
|
old_revision.save()
|
||||||
|
@ -714,9 +706,12 @@ class TestPurgeRevisionsCommand(TestCase):
|
||||||
self.run_command(days=30)
|
self.run_command(days=30)
|
||||||
|
|
||||||
# revision is now older than 30 days, so should be deleted
|
# revision is now older than 30 days, so should be deleted
|
||||||
self.assertNotIn(
|
self.assertFalse(Revision.objects.filter(id=old_revision.id).exists())
|
||||||
old_revision, Revision.page_revisions.filter(object_id=self.page.id)
|
|
||||||
)
|
|
||||||
|
class TestPurgeRevisionsCommandForSnippets(TestPurgeRevisionsCommandForPages):
|
||||||
|
def get_object(self):
|
||||||
|
return FullFeaturedSnippet.objects.create(text="Hello world!")
|
||||||
|
|
||||||
|
|
||||||
class TestPurgeEmbedsCommand(TestCase):
|
class TestPurgeEmbedsCommand(TestCase):
|
||||||
|
|
Ładowanie…
Reference in New Issue