Projet

Général

Profil

0001-misc-allow-lazy-fields-to-be-used-for-attachments-41.patch

Frédéric Péters, 08 avril 2020 13:44

Télécharger (4,07 ko)

Voir les différences:

Subject: [PATCH] misc: allow lazy fields to be used for attachments (#41451)

 tests/test_fields.py | 39 ++++++++++++++++++++++++++++++++++++++-
 wcs/fields.py        |  3 +++
 wcs/variables.py     |  6 ++++++
 3 files changed, 47 insertions(+), 1 deletion(-)
tests/test_fields.py
11 11
from wcs.qommon.http_request import HTTPRequest
12 12
from wcs.qommon import sessions
13 13
from wcs import fields
14
from wcs.qommon.form import Form
14
from wcs.qommon.form import Form, PicklableUpload
15 15
from wcs.formdef import FormDef
16
from wcs.variables import LazyFormData
16 17

  
17 18
from utilities import create_temporary_pub, MockSubstitutionVariables
18 19

  
......
554 555
    assert fields.DateField().convert_value_from_str('04/01/2015') is not None
555 556
    assert fields.DateField().convert_value_from_str('') is None
556 557
    assert fields.DateField().convert_value_from_str('not a date') is None
558

  
559

  
560
def test_file_convert_from_anything():
561
    assert fields.FileField().convert_value_from_anything(None) is None
562

  
563
    value = fields.FileField().convert_value_from_anything(
564
            {'content': 'hello', 'filename': 'test.txt'})
565
    assert value.base_filename == 'test.txt'
566
    assert value.get_file_pointer().read() == b'hello'
567

  
568
    value = fields.FileField().convert_value_from_anything(
569
            {'b64_content': 'aGVsbG8=', 'filename': 'test.txt'})
570
    assert value.base_filename == 'test.txt'
571
    assert value.get_file_pointer().read() == b'hello'
572

  
573
    formdef = FormDef()
574
    formdef.name = 'foobarlazy'
575
    formdef.fields = [fields.FileField(id='5', label='file', varname='filefield')]
576
    formdef.store()
577
    formdef.data_class().wipe()
578
    formdata = formdef.data_class()()
579
    formdata.data = {
580
        '5': PicklableUpload('test.txt', 'text/plain'),
581
    }
582
    formdata.data['5'].receive([b'hello'])
583
    formdata.store()
584

  
585
    value = fields.FileField().convert_value_from_anything(
586
            formdef.data_class().get(formdata.id).data['5'])
587
    assert value.base_filename == 'test.txt'
588
    assert value.get_file_pointer().read() == b'hello'
589

  
590
    value = fields.FileField().convert_value_from_anything(
591
            LazyFormData(formdef.data_class().get(formdata.id)).var.filefield)
592
    assert value.base_filename == 'test.txt'
593
    assert value.get_file_pointer().read() == b'hello'
wcs/fields.py
1077 1077
    def convert_value_from_anything(cls, value):
1078 1078
        if value is None:
1079 1079
            return None
1080
        from wcs.variables import LazyFieldVarFile
1081
        if isinstance(value, LazyFieldVarFile):
1082
            value = value.get_value()  # unbox
1080 1083
        if hasattr(value, 'base_filename'):
1081 1084
            upload = PicklableUpload(value.base_filename,
1082 1085
                                     value.content_type or 'application/octet-stream')
wcs/variables.py
508 508
            return LazyFieldVarMap(self._data, field, self._formdata)
509 509
        if field.key == 'password':
510 510
            return LazyFieldVarPassword(self._data, field, self._formdata)
511
        if field.key == 'file':
512
            return LazyFieldVarFile(self._data, field, self._formdata)
511 513
        if field.store_structured_value:
512 514
            return LazyFieldVarStructured(self._data, field, self._formdata)
513 515

  
......
767 769
        return super(LazyFieldVarPassword, self)._getitem__(key)
768 770

  
769 771

  
772
class LazyFieldVarFile(LazyFieldVar):
773
    pass
774

  
775

  
770 776
class LazyUser(object):
771 777
    def __init__(self, user):
772 778
        self._user = user
773
-