|
| 1 | +from django.core.exceptions import ImproperlyConfigured |
| 2 | + |
| 3 | +from wagtail.core import blocks |
1 | 4 | from wagtail.core.fields import StreamField |
| 5 | +from wagtailstreamforms.fields import get_fields, BaseField |
2 | 6 |
|
3 | | -from wagtailstreamforms.fields import get_fields |
4 | 7 |
|
| 8 | +class FormFieldStreamBlock(blocks.StreamBlock): |
| 9 | + """ Add all registered instances of BaseField's get_form_block method to the streamfield. """ |
5 | 10 |
|
6 | | -class FormFieldsStreamField(StreamField): |
| 11 | + def __init__(self, local_blocks=None, **kwargs): |
| 12 | + self._constructor_kwargs = kwargs |
| 13 | + |
| 14 | + # Note, this is calling BaseStreamBlock's super __init__, not FormFieldStreamBlock's. |
| 15 | + # We don't want BaseStreamBlock.__init__() to run, because it tries to assign to self.child_blocks, |
| 16 | + # which we've overridden with a @property. But we DO want Block.__init__() to run. |
| 17 | + super(blocks.BaseStreamBlock, self).__init__() |
| 18 | + |
| 19 | + self._child_blocks = self.base_blocks.copy() |
| 20 | + |
| 21 | + for name, field_class in get_fields().items(): |
| 22 | + |
| 23 | + # ensure the field is a subclass of BaseField. |
| 24 | + if not issubclass(field_class, BaseField): |
| 25 | + raise ImproperlyConfigured("'%s' must be a subclass of '%s'" % (field_class, BaseField)) |
7 | 26 |
|
| 27 | + # assign the block |
| 28 | + block = field_class().get_form_block() |
| 29 | + block.set_name(name) |
| 30 | + self._child_blocks[name] = block |
| 31 | + |
| 32 | + self._dependencies = self._child_blocks.values() |
| 33 | + |
| 34 | + @property |
| 35 | + def child_blocks(self): |
| 36 | + return self._child_blocks |
| 37 | + |
| 38 | + @property |
| 39 | + def dependencies(self): |
| 40 | + return self._dependencies |
| 41 | + |
| 42 | + |
| 43 | +class FormFieldsStreamField(StreamField): |
8 | 44 | def __init__(self, block_types, **kwargs): |
9 | | - block_types = [(key, item().get_form_block()) for key, item in get_fields().items()] |
10 | 45 | super().__init__(block_types, **kwargs) |
| 46 | + self.stream_block = FormFieldStreamBlock(block_types, required=not self.blank) |
0 commit comments