Projet

Général

Profil

0001-workflows-allow-set-backoffice-field-action-to-work-.patch

Frédéric Péters, 21 juin 2016 16:46

Télécharger (4,44 ko)

Voir les différences:

Subject: [PATCH] workflows: allow set backoffice field action to work with
 files (#11440)

 tests/test_workflows.py     | 58 +++++++++++++++++++++++++++++++++++++++++++++
 wcs/wf/backoffice_fields.py | 14 +++++++----
 2 files changed, 68 insertions(+), 4 deletions(-)
tests/test_workflows.py
1675 1675

  
1676 1676
    formdata = formdef.data_class().get(formdata.id)
1677 1677
    assert formdata.data['bo1'] == 'HELLO'
1678

  
1679
def test_set_backoffice_field_file(pub):
1680
    Workflow.wipe()
1681
    wf = Workflow(name='xxx')
1682
    wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
1683
    wf.backoffice_fields_formdef.fields = [
1684
        FileField(id='bo1', label='1st backoffice field',
1685
            type='file', varname='backoffice_file'),
1686
    ]
1687
    st1 = wf.add_status('Status1')
1688
    wf.store()
1689

  
1690
    formdef = FormDef()
1691
    formdef.name = 'baz'
1692
    formdef.fields = [
1693
        StringField(id='1', label='File', type='file', varname='file'),
1694
    ]
1695
    formdef.workflow_id = wf.id
1696
    formdef.store()
1697

  
1698
    upload = PicklableUpload('test.jpeg', 'image/jpeg')
1699
    upload.receive([open(os.path.join(os.path.dirname(__file__), 'image-with-gps-data.jpeg')).read()])
1700

  
1701
    formdata = formdef.data_class()()
1702
    formdata.data = {'1': upload}
1703
    formdata.just_created()
1704
    formdata.store()
1705

  
1706
    pub.substitutions.feed(formdata)
1707
    item = SetBackofficeFieldsWorkflowStatusItem()
1708
    item.fields = [{'field_id': 'bo1', 'value': '=form_var_file_raw'}]
1709
    item.perform(formdata)
1710

  
1711
    formdata = formdef.data_class().get(formdata.id)
1712
    assert formdata.data['bo1'].base_filename == 'test.jpeg'
1713

  
1714
    # check storing response as attachment
1715
    pub.substitutions.feed(formdata)
1716
    item = WebserviceCallStatusItem()
1717
    item.url = 'http://remote.example.net/xml'
1718
    item.post = False
1719
    item.varname = 'xxx'
1720
    item.response_type = 'attachment'
1721
    item.record_errors = True
1722
    item.perform(formdata)
1723
    attachment = formdata.evolution[-1].parts[-1]
1724
    assert isinstance(attachment, AttachmentEvolutionPart)
1725
    assert attachment.base_filename == 'xxx.xml'
1726
    assert attachment.content_type == 'text/xml'
1727

  
1728
    formdata = formdef.data_class().get(formdata.id)
1729
    pub.substitutions.feed(formdata)
1730
    item = SetBackofficeFieldsWorkflowStatusItem()
1731
    item.fields = [{'field_id': 'bo1', 'value': '=attachments.xxx'}]
1732
    item.perform(formdata)
1733

  
1734
    formdata = formdef.data_class().get(formdata.id)
1735
    assert formdata.data['bo1'].base_filename == 'xxx.xml'
wcs/wf/backoffice_fields.py
20 20
from quixote import get_publisher
21 21

  
22 22
from qommon import get_logger
23
from qommon.form import WidgetListAsTable, CompositeWidget, SingleSelectWidget, ComputedExpressionWidget
23
from qommon.form import (WidgetListAsTable, CompositeWidget, SingleSelectWidget,
24
        ComputedExpressionWidget, PicklableUpload)
24 25
from wcs.fields import WidgetField
25
from wcs.workflows import XmlSerialisable, WorkflowStatusItem, register_item_class
26
from wcs.workflows import (XmlSerialisable, WorkflowStatusItem,
27
        register_item_class, NamedAttachmentsSubstitutionProxy)
26 28
from wcs.wf.profile import FieldNode
27 29

  
28 30

  
......
86 88
            return
87 89
        for field in self.fields:
88 90
            try:
89
                formdata.data['%s' % field['field_id']] = self.compute(
90
                        field['value'], raises=True)
91
                new_value = self.compute(field['value'], raises=True)
91 92
            except:
92 93
                get_publisher().notify_of_exception(sys.exc_info())
94
            if isinstance(new_value, NamedAttachmentsSubstitutionProxy):
95
                upload = PicklableUpload(new_value.filename, new_value.content_type)
96
                upload.receive([new_value.content])
97
                new_value = upload
98
            formdata.data['%s' % field['field_id']] = new_value
93 99
        formdata.store()
94 100

  
95 101
    def fields_export_to_xml(self, item, charset, include_id=False):
96
-