Skip to content

Commit 43c3b40

Browse files
Merge branch 'global-forms' into deploy
2 parents c582843 + de03c07 commit 43c3b40

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

src/collective/volto/formsupport/adapters/post.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
from plone.restapi.serializer.converters import json_compatible
2626

2727

28+
GLOBAL_FORM_REGISTRY_RECORD_ID = (
29+
"collective.volto.formsupport.interfaces.IGlobalFormStore.global_forms_config"
30+
)
31+
32+
2833
@implementer(IPostAdapter)
2934
@adapter(Interface, Interface)
3035
class PostAdapter:
@@ -36,8 +41,12 @@ def __init__(self, context, request):
3641
self.request = request
3742
self.form_data = self.extract_data_from_request()
3843
self.block_id = self.form_data.get("block_id", "")
44+
self.global_form_id = self.extract_data_from_request().get("global_form_id", "")
3945
if self.block_id:
40-
self.block = self.get_block_data(block_id=self.block_id)
46+
self.block = self.get_block_data(
47+
block_id=self.block_id,
48+
global_form_id=self.form_data.get("global_form_id"),
49+
)
4150

4251
def __call__(self):
4352
"""
@@ -98,7 +107,10 @@ def extract_data_from_request(self):
98107
fixed_fields = []
99108
transforms = api.portal.get_tool(name="portal_transforms")
100109

101-
block = self.get_block_data(block_id=form_data.get("block_id", ""))
110+
block = self.get_block_data(
111+
block_id=form_data.get("block_id", ""),
112+
global_form_id=form_data.get("global_form_id"),
113+
)
102114
block_fields = [x.get("field_id", "") for x in block.get("subblocks", [])]
103115
custom_block_fields = [
104116
block.get(field_id) for field_id in block_fields if block.get(field_id)
@@ -120,12 +132,23 @@ def extract_data_from_request(self):
120132

121133
return form_data
122134

123-
def get_block_data(self, block_id):
135+
def get_block_data(self, block_id, global_form_id):
124136
blocks = get_blocks(self.context)
125137
if not blocks:
126-
return {}
138+
global_form_id = global_form_id
139+
if global_form_id:
140+
global_forms = api.portal.get_registry_record(
141+
GLOBAL_FORM_REGISTRY_RECORD_ID
142+
)
143+
if global_forms:
144+
blocks = global_forms
145+
else:
146+
return {}
147+
else:
148+
return {}
127149
for id, block in blocks.items():
128-
if id != block_id:
150+
# Prefer local forms it they're available, fall back to global form
151+
if id != block_id and id != global_form_id:
129152
continue
130153
block_type = block.get("@type", "")
131154
if block_type != "form":

src/collective/volto/formsupport/interfaces.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from plone.restapi.controlpanels.interfaces import IControlpanel
2+
from plone.schema import JSONField
13
from zope.interface import Attribute
24
from zope.interface import Interface
35
from zope.interface.interfaces import IObjectEvent
@@ -69,3 +71,9 @@ def data():
6971
class IDataAdapter(Interface):
7072
def __call__(result, block_id=None):
7173
pass
74+
75+
76+
class IGlobalFormStore(IControlpanel):
77+
global_forms_config = JSONField(
78+
title="Global forms", description="", required=True, default={}
79+
)

src/collective/volto/formsupport/profiles/default/registry/main.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
>
55

66
<!-- -*- extra stuff goes here -*- -->
7+
<records interface="collective.volto.formsupport.interfaces.IGlobalFormStore" />
78

89
</registry>

src/collective/volto/formsupport/restapi/deserializer/blocks.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,34 @@
1+
from plone.api.portal import get_registry_record
2+
from plone.api.portal import set_registry_record
13
from plone.dexterity.interfaces import IDexterityContent
24
from plone.restapi.bbb import IPloneSiteRoot
35
from plone.restapi.interfaces import IBlockFieldDeserializationTransformer
46
from Products.PortalTransforms.transforms.safe_html import SafeHTML
7+
from uuid import uuid4
58
from zope.component import adapter
69
from zope.interface import implementer
710
from zope.publisher.interfaces.browser import IBrowserRequest
811

912

13+
GLOBAL_FORM_REGISTRY_RECORD_ID = (
14+
"collective.volto.formsupport.interfaces.IGlobalFormStore.global_forms_config"
15+
)
16+
17+
18+
def update_global_forms(value):
19+
global_form_id = value.get("global_form_id")
20+
21+
if not global_form_id:
22+
global_form_id = str(uuid4())
23+
24+
global_forms_record = get_registry_record(GLOBAL_FORM_REGISTRY_RECORD_ID)
25+
global_forms_record[global_form_id] = value
26+
set_registry_record(GLOBAL_FORM_REGISTRY_RECORD_ID, global_forms_record)
27+
28+
value["global_form_id"] = global_form_id
29+
return value
30+
31+
1032
class FormBlockDeserializerBase:
1133
"""FormBlockDeserializerBase."""
1234

@@ -25,6 +47,7 @@ def __call__(self, value):
2547
if value.get("send_message", ""):
2648
transform = SafeHTML()
2749
value["send_message"] = transform.scrub_html(value["send_message"])
50+
value = update_global_forms(value)
2851
return value
2952

3053

src/collective/volto/formsupport/restapi/services/submit_form/post.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,10 @@ def __init__(self, context, request):
5959
self.form_data_adapter = getMultiAdapter(
6060
(self.context, self.request), IPostAdapter
6161
)
62-
self.form_data = self.get_form_data()
63-
self.block_id = self.form_data.get("block_id", "")
64-
65-
if self.block_id:
66-
self.block = self.get_block_data(block_id=self.block_id)
62+
# We've already done all the work to get this data, let's reuse it.
63+
self.form_data = self.form_data_adapter.form_data
64+
self.block_id = self.form_data_adapter.block_id
65+
self.block = self.form_data_adapter.block
6766

6867
def reply(self):
6968
store_action = self.block.get("store", False)

0 commit comments

Comments
 (0)