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