Files
old-saburly-wagtail-web/env/lib/python3.10/site-packages/wagtail/images/rich_text/contentstate.py
2024-08-27 20:33:44 +02:00

66 lines
1.9 KiB
Python

"""
Draftail / contentstate conversion
"""
from draftjs_exporter.dom import DOM
from wagtail.admin.rich_text.converters.contentstate_models import Entity
from wagtail.admin.rich_text.converters.html_to_contentstate import (
AtomicBlockEntityElementHandler,
)
from wagtail.images import get_image_model
from wagtail.images.formats import get_image_format
from wagtail.images.shortcuts import get_rendition_or_not_found
def image_entity(props):
"""
Helper to construct elements of the form
<embed alt="Right-aligned image" embedtype="image" format="right" id="1"/>
when converting from contentstate data
"""
return DOM.create_element(
"embed",
{
"embedtype": "image",
"format": props.get("format"),
"id": props.get("id"),
"alt": props.get("alt"),
},
)
class ImageElementHandler(AtomicBlockEntityElementHandler):
"""
Rule for building an image entity when converting from database representation
to contentstate
"""
def create_entity(self, name, attrs, state, contentstate):
Image = get_image_model()
try:
image = Image.objects.get(id=attrs["id"])
image_format = get_image_format(attrs["format"])
rendition = get_rendition_or_not_found(image, image_format.filter_spec)
src = rendition.url
except Image.DoesNotExist:
src = ""
return Entity(
"IMAGE",
"IMMUTABLE",
{
"id": attrs["id"],
"src": src,
"alt": attrs.get("alt"),
"format": attrs["format"],
},
)
ContentstateImageConversionRule = {
"from_database_format": {
'embed[embedtype="image"]': ImageElementHandler(),
},
"to_database_format": {"entity_decorators": {"IMAGE": image_entity}},
}