Skip to content

Commit 28f9f53

Browse files
authored
Merge pull request #7 from torchbox-forks/support/wagtail-60
Wagtail 7.0
2 parents ad7dd97 + dcb3383 commit 28f9f53

File tree

14 files changed

+118
-62
lines changed

14 files changed

+118
-62
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ StreamField([
125125
### Customizing the widget's display and behaviour
126126

127127
```python
128-
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
128+
from wagtail_modeladmin.options import ModelAdmin, modeladmin_register
129129
from instance_selector.registry import registry
130130
from instance_selector.selectors import ModelAdminInstanceSelector
131131
from .models import MyModel

example/example_app/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
default_app_config = "%s.apps.AppConfig" % __name__

example/example_app/wagtail_hooks.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from django.utils.safestring import mark_safe
2-
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
2+
from wagtail_modeladmin.options import ModelAdmin, modeladmin_register
3+
34
from instance_selector.registry import registry
45
from instance_selector.selectors import ModelAdminInstanceSelector
5-
from .models import Shop, Product, Image
6+
7+
from .models import Image, Product, Shop
68

79

810
@modeladmin_register

example/example_project/settings.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
# SECURITY WARNING: don't run with debug turned on in production!
2626
DEBUG = True
2727

28-
ALLOWED_HOSTS = []
28+
ALLOWED_HOSTS = ["*"]
2929

3030

3131
# Application definition
@@ -39,7 +39,7 @@
3939
"django.contrib.staticfiles",
4040
"wagtail.admin",
4141
"wagtail",
42-
"wagtail.contrib.modeladmin",
42+
"wagtail_modeladmin",
4343
"wagtail.contrib.settings",
4444
"wagtail.users",
4545
"wagtail.documents",
@@ -113,7 +113,6 @@
113113

114114
USE_I18N = True
115115

116-
USE_L10N = True
117116

118117
USE_TZ = True
119118

example/requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
django>=3.2
2-
wagtail>=4.1
1+
django>=4.2
2+
wagtail>=6.3
3+
wagtail-modeladmin>=2.0
34
wagtail-instance-selector

instance_selector/blocks.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django import forms
12
from django.utils.functional import cached_property, lazy
23

34
from instance_selector.widgets import InstanceSelectorWidget
@@ -11,6 +12,7 @@
1112

1213

1314
class InstanceSelectorBlock(ChooserBlock):
15+
widget = forms.TextInput # Dummy widget to satisfy Wagtail internals
1416
class Meta:
1517
icon = "placeholder"
1618

@@ -28,12 +30,9 @@ def __init__(self, target_model, **kwargs):
2830
def target_model(self):
2931
return resolve_model_string(self._target_model)
3032

31-
@cached_property
32-
def widget(self):
33-
return InstanceSelectorWidget(self.target_model)
34-
3533
def get_form_state(self, value):
36-
return self.widget.get_value_data(value)
34+
widget = InstanceSelectorWidget(self.target_model)
35+
return widget.get_value_data(value)
3736

3837
def get_instance_selector_icon(self):
3938
instance_selector = registry.get_instance_selector(self.target_model)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class InstanceSelectorController extends window.StimulusModule.Controller {
2+
static values = { config: Object };
3+
4+
connect() {
5+
create_instance_selector_widget(this.configValue);
6+
console.log(this.configValue);
7+
}
8+
}
9+
10+
window.wagtail.app.register('instance-selector', InstanceSelectorController);

instance_selector/widgets.py

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import json
2+
23
from django.forms import widgets
34
from django.template.loader import render_to_string
45
from django.urls import reverse
56
from django.utils.translation import gettext_lazy as _
6-
from instance_selector.constants import OBJECT_PK_PARAM
7-
from instance_selector.registry import registry
8-
97
from wagtail.telepath import register
10-
from wagtail.utils.widgets import WidgetWithScript
118
from wagtail.widget_adapters import WidgetAdapter
129

10+
from instance_selector.constants import OBJECT_PK_PARAM
11+
from instance_selector.registry import registry
12+
13+
from django.forms import Media
14+
from django.utils.safestring import mark_safe
1315

14-
class InstanceSelectorWidget(WidgetWithScript, widgets.Input):
16+
class InstanceSelectorWidget(widgets.Input):
1517
# when looping over form fields, this one should appear in visible_fields, not hidden_fields
1618
# despite the underlying input being type="hidden"
1719
input_type = "hidden"
@@ -30,6 +32,23 @@ def __init__(self, model, **kwargs):
3032

3133
super().__init__(**kwargs)
3234

35+
def render(self, name, value, attrs=None, renderer=None):
36+
# no point trying to come up with sensible semantics for when 'id' is missing from attrs,
37+
# so let's make sure it fails early in the process
38+
39+
self.name = name
40+
try:
41+
self.id_ = attrs["id"]
42+
except (KeyError, TypeError):
43+
raise TypeError(
44+
"InstanceSelectorWidget cannot be rendered without an 'id' attribute"
45+
)
46+
47+
value_data = self.get_value_data(value)
48+
widget_html = self.render_html(name, value_data, attrs)
49+
50+
return mark_safe(widget_html)
51+
3352
def get_value_data(self, value):
3453
# Given a data value (which may be None, a model instance, or a PK here),
3554
# extract the necessary data for rendering the widget with that value.
@@ -38,7 +57,7 @@ def get_value_data(self, value):
3857
# cannot include model instances. Instead, we return the raw values used in rendering -
3958
# namely: pk, display_markup and edit_url
4059

41-
if not str(value).strip(): # value might be "" (Wagtail 5.0+)
60+
if not str(value).strip(): # value might be "" (Wagtail 5.0+)
4261
value = None
4362

4463
if value is None or isinstance(value, self.target_model):
@@ -61,8 +80,8 @@ def get_value_data(self, value):
6180

6281
def render_html(self, name, value, attrs):
6382
value_data = value
64-
65-
original_field_html = super().render_html(name, value_data["pk"], attrs)
83+
84+
original_field_html = super().render(name, value_data["pk"], attrs)
6685

6786
app_label = self.target_model._meta.app_label
6887
model_name = self.target_model._meta.model_name
@@ -122,10 +141,20 @@ def get_js_config(self, id_, name):
122141
"OBJECT_PK_PARAM": OBJECT_PK_PARAM,
123142
}
124143

125-
def render_js_init(self, id_, name, value):
126-
config = self.get_js_config(id_, name)
127-
return "create_instance_selector_widget({config});".format(
128-
config=json.dumps(config)
144+
def build_attrs(self, *args, **kwargs):
145+
attrs = super().build_attrs(*args, **kwargs)
146+
attrs["data-controller"] = "instance-selector"
147+
attrs["data-instance-selector-config-value"] = json.dumps(
148+
self.get_js_config(self.id_, self.name)
149+
)
150+
return attrs
151+
152+
@property
153+
def media(self):
154+
return Media(
155+
js=[
156+
"instance_selector/instance-selector-controller.js",
157+
]
129158
)
130159

131160

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
django>=3.2
22
django-webtest>=1.9.5,<2.0
3-
wagtail>=4.1
3+
wagtail>=6.3
44
black==24.3.0
55
ipdb>=0.12,<1.0
66

runtests.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import sys
2+
23
from django.conf import settings
34

45
settings.configure(
@@ -16,7 +17,7 @@
1617
"django.contrib.messages",
1718
"wagtail.admin",
1819
"wagtail",
19-
"wagtail.contrib.modeladmin",
20+
"wagtail_modeladmin",
2021
"wagtail.contrib.settings",
2122
"wagtail.users",
2223
"wagtail.documents",

0 commit comments

Comments
 (0)