Projet

Général

Profil

0001-wscall-allow-extra-data-on-POST-6622.patch

Thomas Noël, 31 août 2015 15:49

Télécharger (4,58 ko)

Voir les différences:

Subject: [PATCH] wscall: allow extra data on POST (#6622)

 wcs/formdata.py  |  5 ++++-
 wcs/wf/wscall.py | 35 +++++++++++++++++++++++++++++------
 2 files changed, 33 insertions(+), 7 deletions(-)
wcs/formdata.py
545 545
                evo.parts = None
546 546
        self.store()
547 547

  
548
    def export_to_json(self, include_files=True):
548
    def export_to_json(self, include_files=True, extra=None):
549 549
        data = {}
550 550
        data['id'] = '%s/%s' % (self.formdef.url_name, self.id)
551 551
        data['display_id'] = self.get_display_id()
......
581 581
        if self.workflow_data:
582 582
            data['workflow']['data'] = self.workflow_data
583 583

  
584
        if extra is not None:
585
            data['extra'] = extra
586

  
584 587
        return json.dumps(data,
585 588
                cls=qommon.misc.JSONEncoder,
586 589
                encoding=get_publisher().site_charset)
wcs/wf/wscall.py
16 16

  
17 17
import json
18 18

  
19
from qommon import get_logger
19 20
from qommon.form import *
20
from qommon.misc import http_get_page, http_post_request, get_variadic_url
21
from qommon.misc import http_get_page, http_post_request, get_variadic_url, JSONEncoder
21 22
from wcs.workflows import WorkflowStatusItem, register_item_class, template_on_formdata
22 23
from wcs.api import sign_url
23 24

  
......
32 33
    varname = None
33 34
    post = True
34 35
    request_signature_key = None
36
    post_data = None
35 37

  
36 38
    def get_parameters(self):
37
        return ('url', 'post', 'varname', 'request_signature_key')
39
        return ('url', 'post', 'varname', 'request_signature_key',
40
                'post_data')
38 41

  
39 42
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
40 43
        if 'url' in parameters:
......
45 48
            form.add(CheckboxWidget, '%spost' % prefix,
46 49
                    title=_('Post formdata (JSON)'),
47 50
                    value=self.post)
51
        if 'post_data' in parameters:
52
            form.add(WidgetDict, '%spost_data' % prefix,
53
                    title=_('Post data (Python expressions)'),
54
                    value=self.post_data or {})
48 55
        if 'varname' in parameters:
49 56
            form.add(VarnameWidget, '%svarname' % prefix,
50 57
                     title=_('Variable Name'), value=self.varname)
51
        if 'request_signature_key':
58
        if 'request_signature_key' in parameters:
52 59
            form.add(StringWidget, '%srequest_signature_key' % prefix,
53 60
                    title=_('Request Signature Key'),
54 61
                    value=self.request_signature_key)
......
69 76

  
70 77
        headers = {'Content-type': 'application/json',
71 78
                'Accept': 'application/json'}
72
        if self.post:
73
            formdata_as_json = formdata.export_to_json()
79
        if self.post or self.post_data:
80
            post_data = None
81
            if self.post_data:
82
                post_data = {}
83
                eval_globals = get_publisher().get_global_eval_dict()
84
                eval_locals = get_publisher().substitutions.get_context_variables()
85
                for (key, expression) in self.post_data.items():
86
                    try:
87
                        post_data[key] = eval(expression, eval_globals, eval_locals)
88
                    except:
89
                        get_logger().warn('Failed to eval() Python expression in webservice call (%r) ' \
90
                                '(workflow %s, status %s)' % (expression,
91
                                self.parent.parent.name, self.parent.name))
92
                if not self.post:
93
                    post_data = json.dumps(post_data, cls=JSONEncoder,
94
                            encoding=get_publisher().site_charset)
95
            if self.post:
96
                post_data = formdata.export_to_json(extra=post_data)
74 97
            response, status, data, auth_header = http_post_request(
75
                    url, formdata_as_json, headers=headers, timeout=TIMEOUT)
98
                    url, post_data, headers=headers, timeout=TIMEOUT)
76 99
        else:
77 100
            response, status, data, auth_header = http_get_page(
78 101
                    url, headers=headers, timeout=TIMEOUT)
79
-