69 lines
2 KiB
Python
69 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)
|