revert_to_page_revision.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from django.core.exceptions import PermissionDenied
  2. class RevertToPageRevisionError(RuntimeError):
  3. """
  4. Raised when the revision revert cannot be performed for data reasons.
  5. """
  6. pass
  7. class RevertToPageRevisionPermissionError(PermissionDenied):
  8. """
  9. Raised when the revision revert cannot be performed due to insufficient permissions.
  10. """
  11. pass
  12. class RevertToPageRevisionAction:
  13. def __init__(
  14. self,
  15. page,
  16. revision,
  17. user=None,
  18. log_action="wagtail.revert",
  19. submitted_for_moderation=False,
  20. approved_go_live_at=None,
  21. changed=True,
  22. clean=True,
  23. ):
  24. self.page = page
  25. self.revision = revision
  26. self.user = user
  27. self.log_action = log_action
  28. self.submitted_for_moderation = submitted_for_moderation
  29. self.approved_go_live_at = approved_go_live_at
  30. self.changed = changed
  31. self.clean = clean
  32. def check(self, skip_permission_checks=False):
  33. if self.page.alias_of_id:
  34. raise RevertToPageRevisionError(
  35. "Revisions are not required for alias pages as they are an exact copy of another page."
  36. )
  37. # Permission checks
  38. if (
  39. self.user
  40. and not skip_permission_checks
  41. and not self.page.permissions_for_user(self.user).can_edit()
  42. ):
  43. raise RevertToPageRevisionPermissionError(
  44. "You do not have permission to edit this page"
  45. )
  46. def execute(self, skip_permission_checks=False):
  47. self.check(skip_permission_checks=skip_permission_checks)
  48. return self.revision.as_page_object().save_revision(
  49. previous_revision=self.revision,
  50. user=self.user,
  51. log_action=self.log_action,
  52. submitted_for_moderation=self.submitted_for_moderation,
  53. approved_go_live_at=self.approved_go_live_at,
  54. changed=self.changed,
  55. clean=self.clean,
  56. )