angrybeanie_wagtail/env/lib/python3.12/site-packages/wagtailmedia/edit_handlers.py
2025-07-25 21:32:16 +10:00

68 lines
2 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING
from django.template.loader import render_to_string
from wagtail.admin.compare import ForeignObjectComparison
from wagtail.admin.panels import FieldPanel
from .models import MediaType
from .utils import format_audio_html, format_video_html
from .widgets import AdminAudioChooser, AdminMediaChooser, AdminVideoChooser
if TYPE_CHECKING:
from .models import AbstractMedia
class MediaChooserPanel(FieldPanel):
object_type_name = "media"
def __init__(self, field_name, *args, media_type=None, **kwargs):
super().__init__(field_name, *args, **kwargs)
self.media_type = media_type
def clone_kwargs(self):
kwargs = super().clone_kwargs()
kwargs.update(media_type=self.media_type)
return kwargs
@property
def _widget_class(self):
if self.media_type == "audio":
return AdminAudioChooser
elif self.media_type == "video":
return AdminVideoChooser
return AdminMediaChooser
def get_form_options(self) -> dict:
opts = super().get_form_options()
if "widgets" in opts:
opts["widgets"][self.field_name] = self._widget_class
else:
opts["widgets"] = {self.field_name: self._widget_class}
return opts
class MediaFieldComparison(ForeignObjectComparison):
def htmldiff(self) -> str:
media_item_a, media_item_b = self.get_objects()
if not all([media_item_a, media_item_b]):
return ""
return render_to_string(
"wagtailmedia/widgets/compare.html",
{
"media_item_a": self.render_media_item(media_item_a),
"media_item_b": self.render_media_item(media_item_b),
},
)
@staticmethod
def render_media_item(item: AbstractMedia) -> str:
if item.type == MediaType.AUDIO:
return format_audio_html(item)
else:
return format_video_html(item)