Commit b721dfa0 authored by Rafael Monnerat's avatar Rafael Monnerat

Improve and speedup transfer actions on panel

See merge request nexedi/slapos.core!534
parents 4ba8324e ece0f1de
""" """
Create an internal Packing List and attach the compute_node Create an internal Packing List and attach the compute_node
""" """
context.requestTransfer( tag = "transfer_compute_node_%s" % context.getUid()
context.activate(activity="SQLQueue", tag=tag).requestTransfer(
destination=destination, destination=destination,
destination_project=destination_project, destination_project=destination_project,
destination_section=destination_section destination_section=destination_section
......
""" """
Create an internal Packing List and attach the compute_node Create an internal Packing List and attach the computer network
""" """
context.requestTransfer( tag = "transfer_compute_network_%s" % context.getUid()
context.activate(activity="SQLQueue", tag=tag).requestTransfer(
destination_project=destination_project, destination_project=destination_project,
destination_section=destination_section destination_section=destination_section
) )
""" """
Create an internal Packing List and attach the compute_node Create an internal Packing List and attach the compute_node
""" """
context.requestTransfer( tag = "transfer_instance_tree_%s" % context.getUid()
context.activate(activity="SQLQueue",tag=tag).requestTransfer(
destination=destination, destination=destination,
destination_project=destination_project destination_project=destination_project
) )
...@@ -214,7 +214,7 @@ ...@@ -214,7 +214,7 @@
"title": results[2][4], "title": results[2][4],
"default": gadget.state.doc.title, "default": gadget.state.doc.title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "title", "key": "title",
"hidden": 0, "hidden": 0,
...@@ -225,7 +225,7 @@ ...@@ -225,7 +225,7 @@
"title": results[2][5], "title": results[2][5],
"default": gadget.state.doc.reference, "default": gadget.state.doc.reference,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "reference", "key": "reference",
"hidden": 0, "hidden": 0,
...@@ -237,7 +237,7 @@ ...@@ -237,7 +237,7 @@
"default": gadget.state.doc.subordination, "default": gadget.state.doc.subordination,
"css_class": "", "css_class": "",
"items": computer_network_list, "items": computer_network_list,
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"key": "subordination", "key": "subordination",
"hidden": 0, "hidden": 0,
...@@ -249,7 +249,7 @@ ...@@ -249,7 +249,7 @@
"default": gadget.state.doc.allocation_scope, "default": gadget.state.doc.allocation_scope,
"css_class": "", "css_class": "",
"items": allocation_scope_list, "items": allocation_scope_list,
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"key": "allocation_scope", "key": "allocation_scope",
"hidden": 0, "hidden": 0,
...@@ -261,7 +261,7 @@ ...@@ -261,7 +261,7 @@
"default": gadget.state.doc.monitor_scope, "default": gadget.state.doc.monitor_scope,
"css_class": "", "css_class": "",
"items": monitor_scope_list, "items": monitor_scope_list,
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"key": "monitor_scope", "key": "monitor_scope",
"hidden": 0, "hidden": 0,
...@@ -273,7 +273,7 @@ ...@@ -273,7 +273,7 @@
"default": gadget.state.doc.upgrade_scope, "default": gadget.state.doc.upgrade_scope,
"css_class": "", "css_class": "",
"items": upgrade_scope_list, "items": upgrade_scope_list,
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"key": "upgrade_scope", "key": "upgrade_scope",
"hidden": 0, "hidden": 0,
...@@ -284,10 +284,10 @@ ...@@ -284,10 +284,10 @@
"title": results[2][27], "title": results[2][27],
"default": gadget.state.doc.source_title, "default": gadget.state.doc.source_title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "", "key": "",
"hidden": 0, "hidden": gadget.state.doc.source_title ? 0 : 1,
"type": "StringField" "type": "StringField"
}, },
"my_source_project": { "my_source_project": {
...@@ -295,10 +295,10 @@ ...@@ -295,10 +295,10 @@
"title": results[2][28], "title": results[2][28],
"default": gadget.state.doc.source_project_title, "default": gadget.state.doc.source_project_title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "", "key": "",
"hidden": 0, "hidden": gadget.state.doc.source_project_title ? 0 : 1,
"type": "StringField" "type": "StringField"
}, },
"my_monitoring_status": { "my_monitoring_status": {
...@@ -308,7 +308,7 @@ ...@@ -308,7 +308,7 @@
result: gadget.state.doc.news, result: gadget.state.doc.news,
portal_type: "Compute Node"}, portal_type: "Compute Node"},
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"url": "gadget_slapos_status.html", "url": "gadget_slapos_status.html",
"sandbox": "", "sandbox": "",
......
...@@ -267,7 +267,7 @@ ...@@ -267,7 +267,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1006.58340.40727.23620</string> </value> <value> <string>1008.49947.49157.41540</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -287,7 +287,7 @@ ...@@ -287,7 +287,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1680014283.61</float> <float>1685554088.09</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
"title": result[1][1], "title": result[1][1],
"default": gadget.state.doc.title, "default": gadget.state.doc.title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": editable, "editable": editable,
"key": "title", "key": "title",
"hidden": 0, "hidden": 0,
...@@ -142,7 +142,7 @@ ...@@ -142,7 +142,7 @@
"title": result[1][2], "title": result[1][2],
"default": gadget.state.doc.reference, "default": gadget.state.doc.reference,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "reference", "key": "reference",
"hidden": 0, "hidden": 0,
...@@ -154,7 +154,7 @@ ...@@ -154,7 +154,7 @@
"default": {jio_key: gadget.state.jio_key, "default": {jio_key: gadget.state.jio_key,
result: gadget.state.doc.news}, result: gadget.state.doc.news},
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"url": "gadget_slapos_status.html", "url": "gadget_slapos_status.html",
"sandbox": "", "sandbox": "",
...@@ -170,7 +170,7 @@ ...@@ -170,7 +170,7 @@
"required": 0, "required": 0,
"editable": 0, "editable": 0,
"key": "", "key": "",
"hidden": 0, "hidden": gadget.state.doc.source_project_title ? 0 : 1,
"type": "StringField" "type": "StringField"
}, },
"my_source_section": { "my_source_section": {
...@@ -178,10 +178,10 @@ ...@@ -178,10 +178,10 @@
"title": result[1][8], "title": result[1][8],
"default": gadget.state.doc.source_section_title, "default": gadget.state.doc.source_section_title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "", "key": "",
"hidden": 0, "hidden": gadget.state.doc.source_section_title ? 0 : 1,
"type": "StringField" "type": "StringField"
}, },
"listbox": { "listbox": {
......
...@@ -238,7 +238,7 @@ ...@@ -238,7 +238,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1001.44818.54264.13038</string> </value> <value> <string>1008.49948.50158.41267</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -258,7 +258,7 @@ ...@@ -258,7 +258,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1658167069.0</float> <float>1685554128.59</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -244,7 +244,7 @@ ...@@ -244,7 +244,7 @@
"title": result[1][3], "title": result[1][3],
"default": gadget.state.doc.title, "default": gadget.state.doc.title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "title", "key": "title",
"hidden": 0, "hidden": 0,
...@@ -255,7 +255,7 @@ ...@@ -255,7 +255,7 @@
"title": result[1][15], "title": result[1][15],
"default": gadget.state.doc.short_title, "default": gadget.state.doc.short_title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"key": "short_title", "key": "short_title",
"hidden": 0, "hidden": 0,
...@@ -266,7 +266,7 @@ ...@@ -266,7 +266,7 @@
"title": result[1][16], "title": result[1][16],
"default": gadget.state.doc.description, "default": gadget.state.doc.description,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"key": "description", "key": "description",
"hidden": 0, "hidden": 0,
...@@ -277,7 +277,7 @@ ...@@ -277,7 +277,7 @@
"title": result[1][4], "title": result[1][4],
"default": gadget.state.doc.reference, "default": gadget.state.doc.reference,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "reference", "key": "reference",
"hidden": 0, "hidden": 0,
...@@ -288,7 +288,7 @@ ...@@ -288,7 +288,7 @@
"title": result[1][11], "title": result[1][11],
"default": gadget.state.doc.slap_state_title, "default": gadget.state.doc.slap_state_title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "slap_state_title", "key": "slap_state_title",
"hidden": 0, "hidden": 0,
...@@ -301,7 +301,7 @@ ...@@ -301,7 +301,7 @@
"<a target=_blank href=" + gadget.state.doc.url_string + ">" + "<a target=_blank href=" + gadget.state.doc.url_string + ">" +
gadget.state.doc.url_string + "</a>", gadget.state.doc.url_string + "</a>",
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "url_string", "key": "url_string",
"hidden": 0, "hidden": 0,
...@@ -312,7 +312,7 @@ ...@@ -312,7 +312,7 @@
"title": result[1][19], "title": result[1][19],
"default": parameter_dict, "default": parameter_dict,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 1, "editable": 1,
"url": "gadget_erp5_page_slap_parameter_form.html", "url": "gadget_erp5_page_slap_parameter_form.html",
"sandbox": "", "sandbox": "",
...@@ -325,10 +325,10 @@ ...@@ -325,10 +325,10 @@
"title": result[1][21], "title": result[1][21],
"default": gadget.state.doc.source_project_title, "default": gadget.state.doc.source_project_title,
"css_class": "", "css_class": "",
"required": 1, "required": 0,
"editable": 0, "editable": 0,
"key": "source_project_title", "key": "source_project_title",
"hidden": 0, "hidden": gadget.state.doc.source_project_title ? 0 : 1,
"type": "StringField" "type": "StringField"
}, },
"my_source": { "my_source": {
...@@ -339,7 +339,7 @@ ...@@ -339,7 +339,7 @@
"required": 0, "required": 0,
"editable": 0, "editable": 0,
"key": "source_title", "key": "source_title",
"hidden": 0, "hidden": gadget.state.doc.source_title ? 0 : 1,
"type": "StringField" "type": "StringField"
}, },
"my_monitoring_status": { "my_monitoring_status": {
......
...@@ -238,7 +238,7 @@ ...@@ -238,7 +238,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1008.19588.59182.15291</string> </value> <value> <string>1008.49946.40563.64597</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -258,7 +258,7 @@ ...@@ -258,7 +258,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1683727059.58</float> <float>1685554267.16</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -48,7 +48,8 @@ ...@@ -48,7 +48,8 @@
.push(function () { .push(function () {
// Workaround, find a way to open document without break gadget. // Workaround, find a way to open document without break gadget.
return gadget.redirect({"command": "change", return gadget.redirect({"command": "change",
"options": {"jio_key": doc.relative_url, "page": "slap_controller"}}); "options": {"jio_key": doc.relative_url,
"page": "slap_controller"}});
}); });
}); });
}); });
...@@ -62,7 +63,7 @@ ...@@ -62,7 +63,7 @@
var gadget = this, var gadget = this,
page_translation, page_translation,
translation_list = [ translation_list = [
"Compute Node is transferred.", "Compute Node will be transferred soon.",
"The name of a document in ERP5", "The name of a document in ERP5",
"Title", "Title",
"Reference", "Reference",
......
...@@ -283,7 +283,7 @@ ...@@ -283,7 +283,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1008.21059.49463.39441</string> </value> <value> <string>1008.51243.24992.18807</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -303,7 +303,7 @@ ...@@ -303,7 +303,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1683828388.72</float> <float>1685561703.38</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
"Organisation", "Organisation",
"Parent Relative Url", "Parent Relative Url",
"Transfer Computer Network", "Transfer Computer Network",
"Computer Network is transferred." "Computer Network will be transferred soon."
]; ];
return new RSVP.Queue() return new RSVP.Queue()
...@@ -125,7 +125,7 @@ ...@@ -125,7 +125,7 @@
} }
for (i = 0; i < organisation_len; i += 1) { for (i = 0; i < organisation_len; i += 1) {
if (result[3].data.rows[i].value.title === doc.source_project_title) { if (result[3].data.rows[i].value.title === doc.source_section_title) {
default_organisation = result[3].data.rows[i].id; default_organisation = result[3].data.rows[i].id;
} }
organisation_list.push([ organisation_list.push([
......
...@@ -281,7 +281,7 @@ ...@@ -281,7 +281,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1008.22397.35734.62054</string> </value> <value> <string>1008.51185.52212.36676</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -301,7 +301,7 @@ ...@@ -301,7 +301,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1683828480.9</float> <float>1685559938.59</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
url + doc.relative_url + "/InstanceTree_createMovement", doc); url + doc.relative_url + "/InstanceTree_createMovement", doc);
}) })
.push(function () { .push(function () {
return gadget.notifySubmitted({message: 'Service is transferred.', status: 'success'}) return gadget.notifySubmitted({message: gadget.message_translation, status: 'success'})
.push(function () { .push(function () {
// Workaround, find a way to open document without break gadget. // Workaround, find a way to open document without break gadget.
return gadget.redirect({"command": "change", return gadget.redirect({"command": "change",
...@@ -66,7 +66,8 @@ ...@@ -66,7 +66,8 @@
"Project", "Project",
"Organisation", "Organisation",
"Parent Relative Url", "Parent Relative Url",
"Transfer Service" "Transfer Service",
"Service will be transferred soon."
]; ];
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
...@@ -101,6 +102,7 @@ ...@@ -101,6 +102,7 @@
]); ]);
}) })
.push(function (result) { .push(function (result) {
gadget.message_translation = result[4][7];
gadget.page_title_translation = result[4][6]; gadget.page_title_translation = result[4][6];
var doc = result[1], var doc = result[1],
default_organisation = "", default_organisation = "",
......
...@@ -281,7 +281,7 @@ ...@@ -281,7 +281,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1008.21052.42055.18432</string> </value> <value> <string>1008.51256.61372.5495</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -301,7 +301,7 @@ ...@@ -301,7 +301,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1683829095.25</float> <float>1685561516.62</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Computer Network is transferred.'}"> 'text': 'Computer Network will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Computer Network is transferred.'}"> 'text': 'Computer Network will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -152,7 +152,7 @@ ...@@ -152,7 +152,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Compute Node is transferred.'}"> 'text': 'Compute Node will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -97,7 +97,7 @@ ...@@ -97,7 +97,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Compute Node is transferred.'}"> 'text': 'Compute Node will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Compute Node is transferred.'}"> 'text': 'Compute Node will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -260,7 +260,7 @@ ...@@ -260,7 +260,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Service is transferred.'}"> 'text': 'Service will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -260,7 +260,7 @@ ...@@ -260,7 +260,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Service is transferred.'}"> 'text': 'Service will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
...@@ -158,7 +158,7 @@ ...@@ -158,7 +158,7 @@
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/click_proceed" />
<tal:block tal:define="notification_configuration python: {'class': 'success', <tal:block tal:define="notification_configuration python: {'class': 'success',
'text': 'Compute Node is transferred.'}"> 'text': 'Compute Node will be transferred soon.'}">
<tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" /> <tal:block metal:use-macro="here/Zuite_SlapOSCommonTemplate/macros/wait_for_notification" />
</tal:block> </tal:block>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment