feat(blocks): add RadioShowChooserBlock rendered as <select>
Parent
04020eef09
révision
1596b4884f
|
@ -0,0 +1,90 @@
|
|||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from wagtail.core.blocks.field_block import FieldBlockAdapter
|
||||
|
||||
import pytest
|
||||
|
||||
from wagtail_webradio.blocks import RadioShowChooserBlock
|
||||
|
||||
from .factories import RadioShowFactory
|
||||
|
||||
|
||||
class TestRadioShowChooserBlock:
|
||||
def test_serialize(self):
|
||||
block = RadioShowChooserBlock()
|
||||
radio_show = RadioShowFactory()
|
||||
|
||||
assert block.get_prep_value(radio_show) == radio_show.id
|
||||
assert block.get_prep_value(None) is None
|
||||
|
||||
def test_deserialize(self):
|
||||
block = RadioShowChooserBlock()
|
||||
radio_show = RadioShowFactory()
|
||||
|
||||
assert block.to_python(radio_show.id) == radio_show
|
||||
assert block.to_python(None) is None
|
||||
|
||||
def test_adapt(self):
|
||||
block = RadioShowChooserBlock(help_text="pick a radio show")
|
||||
block.set_name('test_radioshowchooserblock')
|
||||
|
||||
js_args = FieldBlockAdapter().js_args(block)
|
||||
assert js_args[0] == 'test_radioshowchooserblock'
|
||||
assert type(js_args[1]) is forms.Select
|
||||
assert js_args[2] == {
|
||||
'label': 'Radio show',
|
||||
'required': True,
|
||||
'icon': 'microphone',
|
||||
'helpText': 'pick a radio show',
|
||||
'classname': (
|
||||
'field model_choice_field widget-select '
|
||||
'fieldname-test_radioshowchooserblock'
|
||||
),
|
||||
'showAddCommentButton': True,
|
||||
'strings': {'ADD_COMMENT': 'Add Comment'},
|
||||
}
|
||||
|
||||
def test_form_response(self):
|
||||
block = RadioShowChooserBlock()
|
||||
radio_show = RadioShowFactory()
|
||||
|
||||
value = block.value_from_datadict(
|
||||
{'radio_show': str(radio_show.id)}, {}, 'radio_show'
|
||||
)
|
||||
assert value == radio_show
|
||||
|
||||
empty_value = block.value_from_datadict(
|
||||
{'radio_show': ''}, {}, 'radio_show'
|
||||
)
|
||||
assert empty_value is None
|
||||
|
||||
def test_clean(self):
|
||||
required_block = RadioShowChooserBlock()
|
||||
nonrequired_block = RadioShowChooserBlock(required=False)
|
||||
radio_show = RadioShowFactory()
|
||||
|
||||
assert required_block.clean(radio_show) == radio_show
|
||||
with pytest.raises(ValidationError):
|
||||
required_block.clean(None)
|
||||
|
||||
assert nonrequired_block.clean(radio_show) == radio_show
|
||||
assert nonrequired_block.clean(None) is None
|
||||
|
||||
def test_field_queryset(self):
|
||||
block = RadioShowChooserBlock()
|
||||
radio_shows = RadioShowFactory.create_batch(2)
|
||||
|
||||
assert set(block.field.queryset) == set(radio_shows)
|
||||
|
||||
def test_widget_choices(self):
|
||||
RadioShowFactory.reset_sequence()
|
||||
radio_shows = RadioShowFactory.create_batch(2)
|
||||
|
||||
block = RadioShowChooserBlock()
|
||||
js_args = FieldBlockAdapter().js_args(block)
|
||||
assert [c for c in js_args[1].choices] == [
|
||||
('', '---------'),
|
||||
(radio_shows[0].pk, "Radio Show #1"),
|
||||
(radio_shows[1].pk, "Radio Show #2"),
|
||||
]
|
|
@ -0,0 +1,25 @@
|
|||
from django import forms
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from wagtail.core import blocks
|
||||
from wagtail.core.utils import resolve_model_string
|
||||
|
||||
|
||||
class RadioShowChooserBlock(blocks.ChooserBlock):
|
||||
class Meta:
|
||||
label = _("Radio show")
|
||||
icon = 'microphone'
|
||||
|
||||
@cached_property
|
||||
def target_model(self):
|
||||
return resolve_model_string('wagtail_webradio.RadioShow')
|
||||
|
||||
@cached_property
|
||||
def widget(self):
|
||||
return forms.Select()
|
||||
|
||||
def value_from_form(self, value):
|
||||
if value == '':
|
||||
return None
|
||||
return super().value_from_form(value)
|
Référencer dans un nouveau ticket