wscalls: preview unflattened payload (#66916)
gitea/wcs/pipeline/head This commit looks good
Details
gitea/wcs/pipeline/head This commit looks good
Details
This commit is contained in:
parent
183f886f88
commit
4df0449045
|
@ -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()
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -303,6 +303,28 @@ $(function() {
|
|||
$window.trigger('scroll');
|
||||
}
|
||||
|
||||
$('div.WidgetDict[data-widget-name*="post_data"] input[type="text"]').on('change', function() {
|
||||
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) {
|
||||
$widget.find(preview_button_selector).attr('href', url);
|
||||
} else {
|
||||
if ($(this).parents('div.dict-key').length < 0) return;
|
||||
if (!$(this).val().includes('/')) return;
|
||||
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);
|
||||
}
|
||||
}).trigger('change');
|
||||
|
||||
$('#inspect-test-tools form').on('submit', function() {
|
||||
var data = $(this).serialize();
|
||||
$.ajax({url: 'inspect-tool',
|
||||
|
|
45
wcs/root.py
45
wcs/root.py
|
@ -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<code>%s</code></p></div>') % (
|
||||
_('Unable to generate payload.'),
|
||||
_('Following error occured: '),
|
||||
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)
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue