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

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"