Refactor BaseChooser to standardise on `(id, opts)` as arguments to the JS constructor

pull/9445/head
Matt Westcott 2023-01-11 22:20:48 +00:00
rodzic 3dc3d37bbf
commit b70ae68566
5 zmienionych plików z 17 dodań i 25 usunięć

Wyświetl plik

@ -101,6 +101,7 @@ class BaseChooser(widgets.Input):
icon = None
classname = None
model = None
js_constructor = "Chooser"
# when looping over form fields, this one should appear in visible_fields, not hidden_fields
# despite the underlying input being type="hidden"
@ -231,8 +232,12 @@ class BaseChooser(widgets.Input):
out = "{0}<script>{1}</script>".format(widget_html, js)
return mark_safe(out)
def get_js_init_options(self, id_, name, value_data):
return {}
def render_js_init(self, id_, name, value_data):
return "new Chooser({0});".format(json.dumps(id_))
opts = self.get_js_init_options(id_, name, value_data)
return f"new {self.js_constructor}({json.dumps(id_)}, {json.dumps(opts)});"
@cached_property
def media(self):
@ -272,6 +277,7 @@ class AdminPageChooser(BaseChooser):
chooser_modal_url_name = "wagtailadmin_choose_page"
icon = "doc-empty-inverse"
classname = "page-chooser"
js_constructor = "PageChooser"
def __init__(
self, target_models=None, can_choose_root=False, user_perms=None, **kwargs
@ -342,16 +348,14 @@ class AdminPageChooser(BaseChooser):
data["parent_id"] = parent_page.pk if parent_page else None
return data
def render_js_init(self, id_, name, value_data):
def get_js_init_options(self, id_, name, value_data):
opts = super().get_js_init_options(id_, name, value_data)
opts.update(self.client_options)
value_data = value_data or {}
options = self.client_options
parent_id = value_data.get("parent_id")
if parent_id is not None:
options["parent_id"] = parent_id
return "new PageChooser({id}, {options});".format(
id=json.dumps(id_),
options=json.dumps(options),
)
opts["parent_id"] = parent_id
return opts
@property
def media(self):

Wyświetl plik

@ -1,5 +1,3 @@
import json
from django import forms
from django.urls import reverse
from django.utils.functional import cached_property
@ -150,14 +148,12 @@ class DocumentChooserUploadView(
class BaseAdminDocumentChooser(BaseChooser):
classname = "document-chooser"
js_constructor = "DocumentChooser"
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.model = get_document_model_string()
def render_js_init(self, id_, name, value_data):
return "new DocumentChooser({0});".format(json.dumps(id_))
@property
def media(self):
return forms.Media(

Wyświetl plik

@ -1,5 +1,3 @@
import json
from django import forms
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
@ -19,6 +17,7 @@ class AdminImageChooser(BaseChooser):
chooser_modal_url_name = "wagtailimages_chooser:choose"
icon = "image"
classname = "image-chooser"
js_constructor = "ImageChooser"
def __init__(self, **kwargs):
super().__init__(**kwargs)
@ -39,9 +38,6 @@ class AdminImageChooser(BaseChooser):
context["preview"] = value_data.get("preview", {})
return context
def render_js_init(self, id_, name, value_data):
return "new ImageChooser({0});".format(json.dumps(id_))
@property
def media(self):
return forms.Media(

Wyświetl plik

@ -3803,7 +3803,7 @@ class TestSnippetChooserPanel(TestCase, WagtailTestUtils):
def test_render_js(self):
self.assertIn(
'new SnippetChooser("id_advert");',
'new SnippetChooser("id_advert", {});',
self.snippet_chooser_panel.render_html(),
)
@ -5386,7 +5386,7 @@ class TestSnippetChooserPanelWithCustomPrimaryKey(TestCase, WagtailTestUtils):
def test_render_js(self):
self.assertIn(
'new SnippetChooser("id_advertwithcustomprimarykey");',
'new SnippetChooser("id_advertwithcustomprimarykey", {});',
self.snippet_chooser_panel.render_html(),
)

Wyświetl plik

@ -1,5 +1,3 @@
import json
from django import forms
from django.core.exceptions import ImproperlyConfigured
from django.urls import reverse
@ -17,6 +15,7 @@ class AdminSnippetChooser(BaseChooser):
display_title_key = "string"
icon = "snippet"
classname = "snippet-chooser"
js_constructor = "SnippetChooser"
def __init__(self, model, **kwargs):
self.model = model
@ -45,9 +44,6 @@ class AdminSnippetChooser(BaseChooser):
else:
raise
def render_js_init(self, id_, name, value_data):
return "new SnippetChooser({id});".format(id=json.dumps(id_))
@cached_property
def media(self):
return forms.Media(