Projet

Général

Profil

0001-formdata-add-live-view-of-item-field-linked-card-dat.patch

Frédéric Péters, 13 juillet 2020 22:34

Télécharger (3,85 ko)

Voir les différences:

Subject: [PATCH] formdata: add live view of item field linked card data
 (#45094)

 tests/test_formdata.py | 45 ++++++++++++++++++++++++++++++++++++++++++
 wcs/variables.py       | 14 +++++++++++++
 2 files changed, 59 insertions(+)
tests/test_formdata.py
16 16
from wcs.qommon.http_request import HTTPRequest
17 17
from wcs import fields, formdef
18 18
from wcs.blocks import BlockDef
19
from wcs.carddef import CardDef
19 20
from wcs.categories import Category
20 21
from wcs.conditions import Condition
21 22
from wcs.formdef import FormDef
......
783 784
    assert lazy_formdata.var.foo_foo == 'baz'  # 2nd value
784 785

  
785 786

  
787
def test_lazy_formdata_live_item(pub):
788
    CardDef.wipe()
789
    carddef = CardDef()
790
    carddef.name = 'items'
791
    carddef.digest_template = '{{form_var_name}}'
792
    carddef.fields = [
793
        fields.StringField(id='0', label='string', varname='name'),
794
        fields.StringField(id='1', label='string', varname='attr'),
795
    ]
796
    carddef.store()
797
    for i, value in enumerate(['foo', 'bar', 'baz']):
798
        carddata = carddef.data_class()()
799
        carddata.data = {
800
            '0': value,
801
            '1': 'attr%s' % i,
802
        }
803
        carddata.just_created()
804
        carddata.store()
805

  
806
    ds = {'type': 'carddef:%s' % carddef.url_name}
807
    formdef = FormDef()
808
    formdef.name = 'foobar'
809
    formdef.fields = [fields.ItemField(id='0', label='string', type='item',
810
        varname='foo', data_source=ds, display_disabled_items=True)]
811
    formdef.store()
812

  
813
    formdata = formdef.data_class()()
814
    formdata.data = {
815
        '0': str(carddata.id),
816
    }
817
    pub.substitutions.feed(pub)
818
    pub.substitutions.feed(formdef)
819
    pub.substitutions.feed(formdata)
820

  
821
    context = pub.substitutions.get_context_variables(mode='lazy')
822
    assert context['form_var_foo_live_name'] == 'baz'
823
    assert context['form_var_foo_live_attr'] == 'attr2'
824

  
825
    CardDef.wipe()
826
    context = pub.substitutions.get_context_variables(mode='lazy')
827
    with pytest.raises(KeyError):
828
        context['form_var_foo_live_name']
829

  
830

  
786 831
def test_lazy_formdata_queryset(pub, variable_test_data):
787 832
    lazy_formdata = variable_test_data
788 833
    data_class = lazy_formdata._formdef.data_class()
wcs/variables.py
607 607
            return ['raw']
608 608

  
609 609
        keys = ['raw', 'structured']
610
        if self._field.data_source and self._field.data_source.get('type', '').startswith('carddef:'):
611
            keys.append('live')
610 612

  
611 613
        def walk(base, value):
612 614
            if isinstance(value, dict):
......
632 634
    def structured(self):
633 635
        return self._field.get_structured_value(self._data)
634 636

  
637
    @property
638
    def live(self):
639
        if not (self._field.data_source and self._field.data_source.get('type', '').startswith('carddef:')):
640
            raise AttributeError('live')
641
        from wcs.carddef import CardDef
642
        try:
643
            carddef = CardDef.get_by_urlname(self._field.data_source['type'][8:])
644
            carddata = carddef.data_class().get(self.raw)
645
        except KeyError:
646
            raise AttributeError('live')
647
        return LazyFormDataVar(carddef.fields, carddata.data, formdata=carddata)
648

  
635 649
    def __getitem__(self, key):
636 650
        try:
637 651
            return super(LazyFieldVarStructured, self).__getitem__(key)
638
-