1""" 2Register Telepath adapters for core Django form widgets, so that they can 3have corresponding Javascript objects with the ability to render new instances 4and extract field values. 5""" 6 7from django import forms 8from django.core.exceptions import ValidationError 9from django.utils.functional import cached_property 10 11from wagtail.admin.staticfiles import versioned_static 12from wagtail.core.telepath import Adapter, register 13 14 15class WidgetAdapter(Adapter): 16 js_constructor = 'wagtail.widgets.Widget' 17 18 def js_args(self, widget): 19 return [ 20 widget.render('__NAME__', None, attrs={'id': '__ID__'}), 21 widget.id_for_label('__ID__'), 22 ] 23 24 def get_media(self, widget): 25 media = super().get_media(widget) 26 return media + widget.media 27 28 @cached_property 29 def media(self): 30 return forms.Media(js=[ 31 versioned_static('wagtailadmin/js/telepath/widgets.js'), 32 ]) 33 34 35register(WidgetAdapter(), forms.widgets.Input) 36register(WidgetAdapter(), forms.Textarea) 37register(WidgetAdapter(), forms.Select) 38register(WidgetAdapter(), forms.CheckboxSelectMultiple) 39 40 41class CheckboxInputAdapter(WidgetAdapter): 42 js_constructor = 'wagtail.widgets.CheckboxInput' 43 44 45register(CheckboxInputAdapter(), forms.CheckboxInput) 46 47 48class RadioSelectAdapter(WidgetAdapter): 49 js_constructor = 'wagtail.widgets.RadioSelect' 50 51 52register(RadioSelectAdapter(), forms.RadioSelect) 53 54 55class ValidationErrorAdapter(Adapter): 56 js_constructor = 'wagtail.errors.ValidationError' 57 58 def js_args(self, error): 59 return [ 60 error.messages, 61 ] 62 63 @cached_property 64 def media(self): 65 return forms.Media(js=[ 66 versioned_static('wagtailadmin/js/telepath/widgets.js'), 67 ]) 68 69 70register(ValidationErrorAdapter(), ValidationError) 71