wscalls: preview unflattened payload (#66916)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Serghei Mihai 2024-02-28 14:01:48 +01:00 committed by serghei
parent a016545d48
commit 236fdd8f49
5 changed files with 70 additions and 1 deletions

View File

@ -443,7 +443,7 @@ class WorkflowUI:
class WorkflowItemPage(Directory):
_q_exports = ['', 'delete', 'copy']
_q_exports = ['', 'delete', 'copy', ('payload-eval', 'payload_eval')]
def __init__(self, workflow, parent, component):
try:
@ -493,6 +493,7 @@ class WorkflowItemPage(Directory):
return redirect('..')
get_response().set_title('%s - %s' % (_('Workflow'), self.workflow.name))
get_response().add_javascript(['jquery-ui.js'])
r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % self.item.description
r += form.render()

View File

@ -191,6 +191,7 @@ class NamedWsCallPage(Directory):
return redirect('../%s/' % self.wscall.id)
get_response().breadcrumb.append(('edit', _('Edit')))
get_response().add_javascript(['jquery-ui.js'])
get_response().set_title(_('Edit webservice call'))
r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Edit webservice call')

View File

@ -303,6 +303,27 @@ $(function() {
$window.trigger('scroll');
}
$('div.WidgetDict[data-widget-name*="post_data"] div.dict-key input').on('change', function() {
if (!$(this).val().includes('/')) return;
var $widget = $(this).parents('div.WidgetDict');
var url = '/preview-json-payload?' + $('input', $widget).serialize();
var preview_button_id = 'payload-preview-button';
var preview_button_selector = 'a#' + preview_button_id;
if (!$widget.find(preview_button_selector).length) {
var eval_link = document.createElement('a');
eval_link.setAttribute('rel', 'popup');
eval_link.setAttribute('href', url);
eval_link.setAttribute('id', preview_button_id);
eval_link.setAttribute('class', 'pk-button');
eval_link.setAttribute('data-selector', 'div.payload-preview');
eval_link.setAttribute('data-title-selector', 'h2');
eval_link.innerHTML = WCS_I18N.preview_json_payload;
$widget.append(eval_link);
} else {
$widget.find(preview_button_selector).attr('href', url);
}
}).trigger('change');
$('#inspect-test-tools form').on('submit', function() {
var data = $(this).serialize();
$.ajax({url: 'inspect-tool',

View File

@ -21,8 +21,11 @@ from importlib import import_module
from quixote import get_publisher, get_request, get_response, get_session, get_session_manager, redirect
from quixote.directory import Directory
from quixote.html import TemplateIO, htmltext
from quixote.util import StaticDirectory
from wcs.wscalls import UnflattenKeysException, unflatten_keys
from . import portfolio
from .api import ApiDirectory
from .categories import Category
@ -213,6 +216,7 @@ class RootDirectory(Directory):
'fargo',
'static',
'actions',
('preview-json-payload', 'preview_json_payload'),
('r', 'tiny_redirect'),
]
@ -300,6 +304,47 @@ class RootDirectory(Directory):
get_response().set_content_type('text/plain')
return json.dumps(results, cls=misc.JSONEncoder)
def preview_json_payload(self):
def parse_payload():
payload = {}
for param, value in get_request().form.items():
# skip elements which are not part of payload
if 'post_data$element' not in param or param.endswith('value_python'):
continue
prefix, order, field = re.split(r'(\d)(?!\d)', param) # noqa pylint: disable=unused-variable
# skip elements that aren't ordered
if not order:
continue
if order not in payload:
payload[order] = []
if field == 'key':
# skip empty keys
if not value:
continue
# insert key on first position
payload[order].insert(0, value)
else:
payload[order].append(value)
return dict([v for v in payload.values() if len(v) > 1])
r = TemplateIO(html=True)
payload = parse_payload()
r += htmltext('<h2>%s</h2>') % _('Payload preview')
r += htmltext('<div class="payload-preview">')
try:
dump = json.dumps(unflatten_keys(payload), ensure_ascii=False, indent=2)
r += htmltext('<pre>%s</pre>') % dump.replace('"{{', '{{').replace('}}"', '}}')
except UnflattenKeysException as e:
r += htmltext('<div class="errornotice"><p>%s</p><p>%s%s</p></div>') % (
_('Unable to unflatten payload.'),
_('Error message: '),
e,
)
r += htmltext('</div>')
return r.getvalue()
def feed_substitution_parts(self):
get_publisher().substitutions.feed(get_session())
get_publisher().substitutions.feed(get_request().user)

View File

@ -88,6 +88,7 @@ def i18n_js(request):
'close': _('Close'),
'email_domain_suggest': _('Did you want to write'),
'email_domain_fix': _('Apply fix'),
'preview_json_payload': _('Preview produced payload'),
}
return HttpResponse(
'WCS_I18N = %s;\n' % json.dumps(strings, cls=misc.JSONEncoder), content_type='application/javascript'