0001-workflows-use-a-simple-file-widget-to-set-model-docu.patch
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 |
- |