Projet

Général

Profil

0001-workflows-use-a-simple-file-widget-to-set-model-docu.patch

Frédéric Péters, 04 novembre 2022 18:51

Télécharger (8,5 ko)

Voir les différences:

Subject: [PATCH] workflows: use a simple file widget to set model document
 (#4281)

 tests/admin_pages/test_workflow.py | 12 +++++-----
 tests/workflow/test_all.py         |  4 ++--
 wcs/backoffice/deprecations.py     |  2 +-
 wcs/qommon/form.py                 | 35 ------------------------------
 wcs/wf/export_to_model.py          | 31 +++++++++++++++++++++++---
 5 files changed, 36 insertions(+), 48 deletions(-)
tests/admin_pages/test_workflow.py
534 534
    resp = resp.follow()
535 535

  
536 536
    resp = resp.click('Document Creation')
537
    resp.form['model_file$file'] = Upload('test.rtf', b'Model content')
537
    resp.form['model_file'] = Upload('test.rtf', b'Model content')
538 538
    resp = resp.form.submit('submit').follow().follow()
539 539
    resp = resp.click('Document Creation')
540 540
    resp_model_content = resp.click('test.rtf')
......
553 553
    # modify file in initial status
554 554
    resp = app.get('/backoffice/workflows/%s/status/%s/' % (workflow.id, st1.id))
555 555
    resp = resp.click('Document Creation')
556
    resp.form['model_file$file'] = Upload('test2.rtf', b'Something else')
557
    resp.form['model_file$orexisting'].checked = False
556
    resp.form['model_file'] = Upload('test2.rtf', b'Something else')
558 557
    resp = resp.form.submit('submit').follow().follow()
559 558

  
560 559
    resp = resp.click('Document Creation')
......
1676 1675
    resp = resp.click('Document Creation')
1677 1676
    with open(os.path.join(os.path.dirname(__file__), '../template.odt'), 'rb') as fd:
1678 1677
        model_content = fd.read()
1679
    resp.form['model_file$file'] = Upload('test.odt', model_content)
1678
    resp.form['model_file'] = Upload('test.odt', model_content)
1680 1679
    resp = resp.form.submit('submit')
1681 1680
    resp = resp.follow()
1682 1681
    resp = resp.follow()
......
3654 3653
    resp = resp.follow()
3655 3654

  
3656 3655
    resp = resp.click('Document Creation')
3657
    resp.form['model_file$file'] = Upload('test.rtf', b'Model content')
3656
    resp.form['model_file'] = Upload('test.rtf', b'Model content')
3658 3657
    resp = resp.form.submit('submit').follow().follow()
3659 3658
    resp = resp.click('Document Creation')
3660 3659
    resp_model_content = resp.click('test.rtf')
......
3673 3672
    # modify file in initial action
3674 3673
    resp = app.get('/backoffice/workflows/1/status/1/')
3675 3674
    resp = resp.click('Document Creation')
3676
    resp.form['model_file$file'] = Upload('test2.rtf', b'Something else')
3677
    resp.form['model_file$orexisting'].checked = False
3675
    resp.form['model_file'] = Upload('test2.rtf', b'Something else')
3678 3676
    resp = resp.form.submit('submit').follow().follow()
3679 3677

  
3680 3678
    resp = resp.click('Document Creation')
tests/workflow/test_all.py
46 46
from wcs.formdata import Evolution
47 47
from wcs.formdef import FormDef
48 48
from wcs.qommon.errors import ConnectionError
49
from wcs.qommon.form import Form, UploadedFile, UploadValidationError
49
from wcs.qommon.form import Form, UploadedFile
50 50
from wcs.qommon.http_request import HTTPRequest
51 51
from wcs.qommon.ident.password_accounts import PasswordAccount
52 52
from wcs.qommon.upload_storage import PicklableUpload
......
57 57
from wcs.wf.criticality import MODE_DEC, MODE_INC, MODE_SET, ModifyCriticalityWorkflowStatusItem
58 58
from wcs.wf.dispatch import DispatchWorkflowStatusItem
59 59
from wcs.wf.display_message import DisplayMessageWorkflowStatusItem
60
from wcs.wf.export_to_model import ExportToModel, transform_to_pdf
60
from wcs.wf.export_to_model import ExportToModel, UploadValidationError, transform_to_pdf
61 61
from wcs.wf.external_workflow import ManyExternalCallsPart
62 62
from wcs.wf.form import WorkflowFormFieldsFormDef
63 63
from wcs.wf.geolocate import GeolocateWorkflowStatusItem
wcs/backoffice/deprecations.py
27 27
from wcs.qommon import _, ezt, template
28 28
from wcs.qommon.afterjobs import AfterJob
29 29
from wcs.qommon.backoffice.menu import html_top
30
from wcs.qommon.form import UploadValidationError
30
from wcs.wf.export_to_model import UploadValidationError
31 31
from wcs.workflows import Workflow
32 32
from wcs.wscalls import NamedWsCall
33 33

  
wcs/qommon/form.py
752 752
        return self.get_file().read()
753 753

  
754 754

  
755
class UploadValidationError(Exception):
756
    pass
757

  
758

  
759
class UploadWidget(CompositeWidget):
760
    def __init__(self, name, value=None, directory=None, filename=None, validation=None, **kwargs):
761
        CompositeWidget.__init__(self, name, **kwargs)
762
        del kwargs['title']
763
        kwargs.pop('hint')
764
        self.value = value
765
        self.directory = directory or 'uploads'
766
        self.filename = filename
767
        self.validation = validation
768
        if value:
769
            self.add(CheckboxWidget, 'orexisting', title=_('Use previous file.'), value=True)
770
            self.widgets[-1].render_br = False
771
            self.add(FileWidget, 'file', title=_('Or upload a new one'), **kwargs)
772
        else:
773
            self.add(FileWidget, 'file', **kwargs)
774

  
775
    def _parse(self, request):
776
        if self.value and self.get('orexisting'):
777
            pass
778
        elif self.get('file'):
779
            upload = self.get('file')
780
            self.value = UploadedFile(self.directory, self.filename, upload)
781
            if self.validation:
782
                try:
783
                    self.validation(upload)
784
                except UploadValidationError as e:
785
                    self.error = str(e)
786
        else:
787
            self.value = None
788

  
789

  
790 755
class FileWithPreviewWidget(CompositeWidget):
791 756
    """Widget that proposes a File Upload widget but that stores the file
792 757
    ondisk so it has a "readonly" mode where the filename is shown."""
wcs/wf/export_to_model.py
50 50
from ..qommon.form import (
51 51
    CheckboxWidget,
52 52
    ComputedExpressionWidget,
53
    FileWidget,
53 54
    RadiobuttonsWidget,
54 55
    SingleSelectWidget,
55 56
    StringWidget,
56 57
    UploadedFile,
57
    UploadValidationError,
58
    UploadWidget,
59 58
    VarnameWidget,
60 59
    WidgetList,
61 60
    WysiwygTextWidget,
......
231 230
        return self.wfstatusitem.apply_template_to_formdata(self.formdata).read()
232 231

  
233 232

  
233
class UploadValidationError(Exception):
234
    pass
235

  
236

  
237
class ModelFileWidget(FileWidget):
238
    def __init__(self, name, value=None, directory=None, filename=None, validation=None, **kwargs):
239
        super().__init__(name, value=value, **kwargs)
240
        self.existing_value = self.value = value
241
        self.directory = directory or 'uploads'
242
        self.filename = filename
243
        self.validation = validation
244

  
245
    def _parse(self, request):
246
        super()._parse(request=request)
247
        if self.value:
248
            try:
249
                self.validation(self.value)
250
            except UploadValidationError as e:
251
                self.error = str(e)
252
            else:
253
                self.value = UploadedFile(self.directory, self.filename, self.value)
254
        else:
255
            # keep existing value
256
            self.value = self.existing_value
257

  
258

  
234 259
class ExportToModel(WorkflowStatusItem):
235 260
    description = _('Document Creation')
236 261
    key = 'export_to_model'
......
381 406
                )
382 407
                hint = hint_prefix + force_text(hint)
383 408
            form.add(
384
                UploadWidget,
409
                ModelFileWidget,
385 410
                widget_name,
386 411
                directory='models',
387 412
                filename=filename,
388
-