Initial commit

This commit is contained in:
2024-08-27 20:33:44 +02:00
commit 1f1832267d
14794 changed files with 1599592 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
class APIAction:
serializer = None
def __init__(self, view, request):
self.view = view
self.request = request

View File

@@ -0,0 +1,30 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework import status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.convert_alias import ConvertAliasPageAction, ConvertAliasPageError
from wagtail.api.v2.utils import BadRequestError
from .base import APIAction
class ConvertAliasPageAPIAction(APIAction):
serializer = Serializer
def _action_from_data(self, instance, data):
return ConvertAliasPageAction(instance, user=self.request.user)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
new_page = action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
except ConvertAliasPageError as e:
raise BadRequestError(e.args[0])
serializer = self.view.get_serializer(new_page)
return Response(serializer.data, status=status.HTTP_200_OK)

View File

@@ -0,0 +1,67 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from django.shortcuts import get_object_or_404
from rest_framework import fields, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.copy_page import CopyPageAction, CopyPageIntegrityError
from wagtail.api.v2.utils import BadRequestError
from wagtail.coreutils import find_available_slug
from wagtail.models import Page
from .base import APIAction
class CopyPageAPIActionSerializer(Serializer):
# Note: CopyPageAction will validate the destination page
destination_page_id = fields.IntegerField(required=False)
recursive = fields.BooleanField(default=False, required=False)
keep_live = fields.BooleanField(default=True, required=False)
slug = fields.CharField(required=False)
title = fields.CharField(required=False)
class CopyPageAPIAction(APIAction):
serializer = CopyPageAPIActionSerializer
def _action_from_data(self, instance, data):
destination_page_id = data.get("destination_page_id")
if destination_page_id is None:
destination = instance.get_parent()
else:
destination = get_object_or_404(Page, id=destination_page_id)
update_attrs = {}
if "slug" in data:
update_attrs["slug"] = data["slug"]
else:
# If user didn't specify a particular slug, find an available one
available_slug = find_available_slug(destination, instance.slug)
if available_slug != instance.slug:
update_attrs["slug"] = available_slug
if "title" in data:
update_attrs["title"] = data["title"]
return CopyPageAction(
page=instance,
to=destination,
recursive=data["recursive"],
keep_live=data["keep_live"],
update_attrs=update_attrs,
user=self.request.user,
)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
new_page = action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
except CopyPageIntegrityError as e:
raise BadRequestError(e.args[0])
serializer = self.view.get_serializer(new_page)
return Response(serializer.data, status=status.HTTP_201_CREATED)

View File

@@ -0,0 +1,51 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from django.shortcuts import get_object_or_404
from rest_framework import fields, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.copy_for_translation import (
CopyPageForTranslationAction,
ParentNotTranslatedError,
)
from wagtail.api.v2.utils import BadRequestError
from wagtail.models.i18n import Locale
from .base import APIAction
class CopyForTranslationAPIActionSerializer(Serializer):
locale = fields.CharField(max_length=100)
copy_parents = fields.BooleanField(default=False, required=False)
alias = fields.BooleanField(default=False, required=False)
recursive = fields.BooleanField(default=False, required=False)
class CopyForTranslationAPIAction(APIAction):
serializer = CopyForTranslationAPIActionSerializer
def _action_from_data(self, instance, data):
locale = get_object_or_404(Locale, language_code=data["locale"])
return CopyPageForTranslationAction(
page=instance,
locale=locale,
copy_parents=data["copy_parents"],
alias=data["alias"],
user=self.request.user,
include_subtree=data["recursive"],
)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
translated_page = action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
except ParentNotTranslatedError as e:
raise BadRequestError(e.args[0])
serializer = self.view.get_serializer(translated_page)
return Response(serializer.data, status=status.HTTP_201_CREATED)

View File

@@ -0,0 +1,51 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from django.shortcuts import get_object_or_404
from rest_framework import fields, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.create_alias import (
CreatePageAliasAction,
CreatePageAliasIntegrityError,
)
from wagtail.api.v2.utils import BadRequestError
from wagtail.models import Page
from .base import APIAction
class CreatePageAliasAPIActionSerializer(Serializer):
destination_page_id = fields.IntegerField(required=False)
recursive = fields.BooleanField(default=False, required=False)
update_slug = fields.CharField(required=False)
class CreatePageAliasAPIAction(APIAction):
serializer = CreatePageAliasAPIActionSerializer
def _action_from_data(self, instance, data):
parent, destination_page_id = None, data.get("destination_page_id")
if destination_page_id:
parent = get_object_or_404(Page, id=destination_page_id).specific
return CreatePageAliasAction(
page=instance,
recursive=data["recursive"],
parent=parent,
update_slug=data.get("update_slug"),
user=self.request.user,
)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
new_page = action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
except CreatePageAliasIntegrityError as e:
raise BadRequestError(e.args[0])
serializer = self.view.get_serializer(new_page)
return Response(serializer.data, status=status.HTTP_201_CREATED)

View File

@@ -0,0 +1,26 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework import status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.delete_page import DeletePageAction
from .base import APIAction
class DeletePageAPIAction(APIAction):
serializer = Serializer
def _action_from_data(self, instance, data):
return DeletePageAction(page=instance, user=self.request.user)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
return Response(status=status.HTTP_204_NO_CONTENT)

View File

@@ -0,0 +1,53 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from django.shortcuts import get_object_or_404
from rest_framework import fields, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.move_page import MovePageAction
from wagtail.models import Page
from .base import APIAction
class MovePageAPIActionSerializer(Serializer):
destination_page_id = fields.IntegerField(required=True)
position = fields.ChoiceField(
required=False,
choices=[
"left",
"right",
"first-child",
"last-child",
"first-sibling",
"last-sibling",
],
)
class MovePageAPIAction(APIAction):
serializer = MovePageAPIActionSerializer
def _action_from_data(self, instance, data):
destination_page_id = data["destination_page_id"]
target = get_object_or_404(Page, id=destination_page_id)
return MovePageAction(
page=instance,
target=target,
pos=data.get("position"),
user=self.request.user,
)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
instance.refresh_from_db()
serializer = self.view.get_serializer(instance)
return Response(serializer.data, status=status.HTTP_200_OK)

View File

@@ -0,0 +1,34 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework import status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.publish_page_revision import PublishPageRevisionAction
from wagtail.api.v2.utils import BadRequestError
from .base import APIAction
class PublishPageAPIAction(APIAction):
serializer = Serializer
def _action_from_data(self, instance, data):
user = self.request.user
revision = instance.get_latest_revision() or instance.save_revision(user=user)
return PublishPageRevisionAction(revision, user=user)
def execute(self, instance, data):
try:
action = self._action_from_data(instance, data)
except RuntimeError as e:
raise BadRequestError(e.args[0])
try:
action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
new_page = instance.specific_class.objects.get(pk=instance.pk)
serializer = self.view.get_serializer(new_page)
return Response(serializer.data, status=status.HTTP_200_OK)

View File

@@ -0,0 +1,42 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from django.shortcuts import get_object_or_404
from rest_framework import fields, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.revert_to_page_revision import (
RevertToPageRevisionAction,
RevertToPageRevisionError,
)
from wagtail.api.v2.utils import BadRequestError
from .base import APIAction
class RevertToPageRevisionAPIActionSerializer(Serializer):
revision_id = fields.IntegerField()
class RevertToPageRevisionAPIAction(APIAction):
serializer = RevertToPageRevisionAPIActionSerializer
def _action_from_data(self, instance, data):
revision = get_object_or_404(instance.revisions, id=data["revision_id"])
return RevertToPageRevisionAction(
page=instance, revision=revision, user=self.request.user
)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
new_revision = action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
except RevertToPageRevisionError as e:
raise BadRequestError(e.args[0])
serializer = self.view.get_serializer(new_revision.as_object())
return Response(serializer.data, status=status.HTTP_200_OK)

View File

@@ -0,0 +1,35 @@
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework import fields, status
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from wagtail.actions.unpublish_page import UnpublishPageAction
from .base import APIAction
class UnpublishPageAPIActionSerializer(Serializer):
recursive = fields.BooleanField(default=False, required=False)
class UnpublishPageAPIAction(APIAction):
serializer = UnpublishPageAPIActionSerializer
def _action_from_data(self, instance, data):
return UnpublishPageAction(
page=instance,
user=self.request.user,
include_descendants=data["recursive"],
)
def execute(self, instance, data):
action = self._action_from_data(instance, data)
try:
action.execute()
except DjangoValidationError as e:
raise ValidationError(e.message_dict)
serializer = self.view.get_serializer(instance)
return Response(serializer.data, status=status.HTTP_200_OK)