Protect published snapshots and concurrent edits

This commit is contained in:
2026-09-27 10:20:38 +03:30
parent b8e79c950a
commit f529f85bf0
3 changed files with 59 additions and 1 deletions

View File

@@ -109,6 +109,8 @@ def save_page_draft(actor, page: EditorialPage, fields: dict, sections: list[dic
base_revision = PageRevision.objects.get(pk=base_revision.pk)
if base_revision.page_id != page.pk:
raise ValidationError("Base revision belongs to another page.")
if base_revision.pk != page.revisions.order_by("-number").values_list("pk", flat=True).first():
raise PublishConflict("A newer revision exists. Reload the draft before editing.")
if not isinstance(sections, list):
raise ValidationError("Sections must be a list.")
revision = PageRevision(page=page, number=_next_number(page), created_by=actor, **_fields(fields, PAGE_FIELDS))
@@ -132,6 +134,8 @@ def save_site_draft(actor, site: SiteIdentity, fields: dict, *, base_revision=No
base_revision = SiteRevision.objects.get(pk=base_revision.pk)
if base_revision.site_id != site.pk:
raise ValidationError("Base revision belongs to another site.")
if base_revision.pk != site.revisions.order_by("-number").values_list("pk", flat=True).first():
raise PublishConflict("A newer revision exists. Reload the draft before editing.")
revision = SiteRevision(site=site, number=_next_number(site), created_by=actor, **_fields(fields, SITE_FIELDS))
revision.full_clean()
revision.content_checksum = _site_checksum(revision)