134 lines
3.7 KiB
Python
134 lines
3.7 KiB
Python
from typing import TYPE_CHECKING
|
|
|
|
from django.forms import ModelChoiceField
|
|
from django.template.loader import render_to_string
|
|
from django.utils.functional import cached_property
|
|
from wagtail.admin.compare import BlockComparison
|
|
from wagtail.blocks import ChooserBlock
|
|
|
|
from .utils import format_audio_html, format_video_html
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
from .widgets import AdminAudioChooser, AdminVideoChooser
|
|
|
|
|
|
class AbstractMediaChooserBlock(ChooserBlock):
|
|
def __init__(
|
|
self, required=True, help_text=None, validators=(), media_type=None, **kwargs
|
|
):
|
|
super().__init__(
|
|
required=required, help_text=help_text, validators=validators, **kwargs
|
|
)
|
|
self.media_type = media_type
|
|
|
|
@cached_property
|
|
def target_model(self):
|
|
from wagtailmedia.models import get_media_model
|
|
|
|
return get_media_model()
|
|
|
|
@cached_property
|
|
def field(self):
|
|
if not self.media_type:
|
|
return super().field
|
|
|
|
return ModelChoiceField(
|
|
queryset=self.target_model.objects.filter(type=self.media_type),
|
|
widget=self.widget,
|
|
required=self._required,
|
|
validators=self._validators,
|
|
help_text=self._help_text,
|
|
)
|
|
|
|
@cached_property
|
|
def widget(self):
|
|
from wagtailmedia.widgets import AdminMediaChooser
|
|
|
|
return AdminMediaChooser()
|
|
|
|
def render_basic(self, value, context=None):
|
|
raise NotImplementedError(
|
|
f"You need to implement {self.__class__.__name__}.render_basic"
|
|
)
|
|
|
|
def get_comparison_class(self) -> type["MediaChooserBlockComparison"]:
|
|
return MediaChooserBlockComparison
|
|
|
|
|
|
class MediaChooserBlockComparison(BlockComparison):
|
|
def htmlvalue(self, value) -> str:
|
|
return render_to_string(
|
|
"wagtailmedia/widgets/compare.html",
|
|
{
|
|
"media_item_a": self.block.render_basic(value),
|
|
"media_item_b": self.block.render_basic(value),
|
|
},
|
|
)
|
|
|
|
def htmldiff(self) -> str:
|
|
return render_to_string(
|
|
"wagtailmedia/widgets/compare.html",
|
|
{
|
|
"media_item_a": self.block.render_basic(self.val_a),
|
|
"media_item_b": self.block.render_basic(self.val_b),
|
|
},
|
|
)
|
|
|
|
|
|
class AudioChooserBlock(AbstractMediaChooserBlock):
|
|
def __init__(self, required=True, help_text=None, validators=(), **kwargs):
|
|
super().__init__(
|
|
required=required,
|
|
help_text=help_text,
|
|
validators=validators,
|
|
media_type="audio",
|
|
**kwargs,
|
|
)
|
|
|
|
@cached_property
|
|
def widget(self) -> "AdminAudioChooser":
|
|
from wagtailmedia.widgets import AdminAudioChooser
|
|
|
|
return AdminAudioChooser()
|
|
|
|
def render_basic(self, value, context=None) -> str:
|
|
if not value:
|
|
return ""
|
|
|
|
if value.type != self.media_type:
|
|
return ""
|
|
|
|
return format_audio_html(value)
|
|
|
|
class Meta:
|
|
icon = "wagtailmedia-audio"
|
|
|
|
|
|
class VideoChooserBlock(AbstractMediaChooserBlock):
|
|
def __init__(self, required=True, help_text=None, validators=(), **kwargs):
|
|
super().__init__(
|
|
required=required,
|
|
help_text=help_text,
|
|
validators=validators,
|
|
media_type="video",
|
|
**kwargs,
|
|
)
|
|
|
|
@cached_property
|
|
def widget(self) -> "AdminVideoChooser":
|
|
from wagtailmedia.widgets import AdminVideoChooser
|
|
|
|
return AdminVideoChooser()
|
|
|
|
def render_basic(self, value, context=None) -> str:
|
|
if not value:
|
|
return ""
|
|
|
|
if value.type != self.media_type:
|
|
return ""
|
|
|
|
return format_video_html(value)
|
|
|
|
class Meta:
|
|
icon = "wagtailmedia-video"
|