Projet

Général

Profil

0001-fields-ItemsField-items-datasource-in-admin-form-499.patch

Lauréline Guérin, 08 janvier 2021 14:41

Télécharger (9,51 ko)

Voir les différences:

Subject: [PATCH] fields: ItemsField & items/datasource in admin form (#49953)

 tests/admin_pages/test_form.py |  25 +++++++-
 wcs/fields.py                  | 105 +++++++++++++++------------------
 2 files changed, 72 insertions(+), 58 deletions(-)
tests/admin_pages/test_form.py
1621 1621
    resp = resp.form.submit('submit').follow()
1622 1622
    resp = app.get('/backoffice/forms/1/')
1623 1623

  
1624
    # change configuration for items
1625
    resp = app.get('/backoffice/forms/1/fields/1/')
1626
    resp.form['data_mode'].value = 'simple-list'
1627
    resp.form['items$element0'] = 'XXX'
1628
    resp = resp.form.submit('submit').follow()
1629
    assert FormDef.get(1).fields[0].data_source is None
1630
    assert FormDef.get(1).fields[0].items == ['XXX']
1631

  
1624 1632

  
1625 1633
def test_form_edit_item_field_geojson_data_source(pub, http_requests):
1626 1634
    NamedDataSource.wipe()
......
1691 1699
    resp = resp.follow()
1692 1700

  
1693 1701
    assert FormDef.get(1).fields[0].label == 'changed field'
1694
    assert FormDef.get(1).fields[0].required == False
1702
    assert FormDef.get(1).fields[0].required is False
1695 1703
    assert FormDef.get(1).fields[0].items is None
1696 1704

  
1697 1705
    # edit and fill with one item
......
1708 1716
    assert resp.forms[0]['prefill$type'].options == [
1709 1717
            (u'None', True, u'None'), (u'Python Expression', False, u'Python Expression')]
1710 1718

  
1719
    # change configuration for datasource
1720
    resp = app.get('/backoffice/forms/1/fields/1/')
1721
    resp.form['data_mode'].value = 'data-source'
1722
    resp.form['data_source$type'].value = 'json'
1723
    resp.form['data_source$value'].value = 'http://whatever'
1724
    resp = resp.form.submit('submit').follow()
1725
    assert FormDef.get(1).fields[0].data_source == {'type': 'json', 'value': 'http://whatever'}
1726

  
1727
    # change configuration for items
1728
    resp = app.get('/backoffice/forms/1/fields/1/')
1729
    resp.form['data_mode'].value = 'simple-list'
1730
    resp = resp.form.submit('submit').follow()
1731
    assert FormDef.get(1).fields[0].data_source is None
1732
    assert FormDef.get(1).fields[0].items == ['XXX']
1733

  
1711 1734

  
1712 1735
def test_form_edit_page_field(pub):
1713 1736
    create_superuser(pub)
wcs/fields.py
1475 1475
                        _('Initial zoom level must be between minimal and maximal zoom levels.'))
1476 1476

  
1477 1477

  
1478
class ItemField(WidgetField, MapOptionsMixin):
1478
class ItemFieldMixin(object):
1479
    def add_items_fields_admin_form(self, form):
1480
        real_data_source = data_sources.get_real(self.data_source)
1481
        form.add(RadiobuttonsWidget, 'data_mode',
1482
                 title=_('Data'),
1483
                 options=[('simple-list', _('Simple List'), 'simple-list'),
1484
                          ('data-source', _('Data Source'), 'data-source')],
1485
                 value='data-source' if real_data_source else 'simple-list',
1486
                 attrs={'data-dynamic-display-parent': 'true'},
1487
                 extra_css_class='no-bottom-margin')
1488
        form.add(WidgetList, 'items', element_type=StringWidget,
1489
                 value=self.items,
1490
                 required=False,
1491
                 element_kwargs={'render_br': False, 'size': 50},
1492
                 add_element_label=_('Add item'),
1493
                 attrs={'data-dynamic-display-child-of': 'data_mode',
1494
                        'data-dynamic-display-value': 'simple-list'}
1495
                 )
1496
        form.add(data_sources.DataSourceSelectionWidget, 'data_source',
1497
                 value=self.data_source,
1498
                 required=False,
1499
                 hint=_('This will get the available items from an external source.'),
1500
                 attrs={'data-dynamic-display-child-of': 'data_mode',
1501
                        'data-dynamic-display-value': 'data-source'}
1502
                 )
1503

  
1504
    def check_items_admin_form(self, form):
1505
        data_mode = form.get_widget('data_mode').parse()
1506
        if data_mode == 'simple-list':
1507
            items = form.get_widget('items').parse()
1508
            d = {}
1509
            for v in (items or []):
1510
                if v in d:
1511
                    form.set_error('items', _('Duplicated Items'))
1512
                    return
1513
                d[v] = None
1514

  
1515
            data_source_type = form.get_widget('data_source').get_widget('type')
1516
            data_source_type.set_value(None)
1517
            data_source_type.transfer_form_value(get_request())
1518

  
1519

  
1520
class ItemField(WidgetField, MapOptionsMixin, ItemFieldMixin):
1479 1521
    key = 'item'
1480 1522
    description = N_('List')
1481 1523
    allow_complex = True
......
1695 1737
                options=options,
1696 1738
                value=self.display_mode,
1697 1739
                attrs={'data-dynamic-display-parent': 'true'})
1698
        real_data_source = data_sources.get_real(self.data_source)
1699
        form.add(RadiobuttonsWidget, 'data_mode',
1700
                title=_('Data'),
1701
                options=[('simple-list', _('Simple List'), 'simple-list'),
1702
                         ('data-source', _('Data Source'), 'data-source')],
1703
                value='data-source' if real_data_source else 'simple-list',
1704
                attrs={'data-dynamic-display-parent': 'true'},
1705
                extra_css_class='no-bottom-margin')
1706
        form.add(WidgetList, 'items', element_type=StringWidget,
1707
                value=self.items,
1708
                required=False,
1709
                element_kwargs={'render_br': False, 'size': 50},
1710
                add_element_label=_('Add item'),
1711
                attrs={'data-dynamic-display-child-of': 'data_mode',
1712
                       'data-dynamic-display-value': 'simple-list'}
1713
                )
1714
        form.add(data_sources.DataSourceSelectionWidget, 'data_source',
1715
                 value=self.data_source,
1716
                 required=False,
1717
                 hint=_('This will get the available items from an external source.'),
1718
                 attrs={'data-dynamic-display-child-of': 'data_mode',
1719
                        'data-dynamic-display-value': 'data-source'}
1720
                 )
1740
        self.add_items_fields_admin_form(form)
1721 1741
        form.add(CheckboxWidget, 'display_disabled_items',
1722 1742
                title=_('Display disabled items'),
1723 1743
                value=self.display_disabled_items,
......
1732 1752
                'display_disabled_items', 'initial_zoom', 'min_zoom', 'max_zoom']
1733 1753

  
1734 1754
    def check_admin_form(self, form):
1735
        data_mode = form.get_widget('data_mode').parse()
1736
        if data_mode == 'simple-list':
1737
            items = form.get_widget('items').parse()
1738
            d = {}
1739
            for v in (items or []):
1740
                if v in d:
1741
                    form.set_error('items', _('Duplicated Items'))
1742
                    return
1743
                d[v] = None
1744

  
1745
            data_source_type = form.get_widget('data_source').get_widget('type')
1746
            data_source_type.set_value(None)
1747
            data_source_type.transfer_form_value(get_request())
1748

  
1755
        self.check_items_admin_form(form)
1749 1756
        self.check_zoom_admin_form(form)
1750 1757

  
1751 1758
    def stats(self, values):
......
1785 1792
register_field_class(ItemField)
1786 1793

  
1787 1794

  
1788
class ItemsField(WidgetField):
1795
class ItemsField(WidgetField, ItemFieldMixin):
1789 1796
    key = 'items'
1790 1797
    description = N_('Multiple choice list')
1791 1798
    allow_complex = True
......
1831 1838
        WidgetField.fill_admin_form(self, form)
1832 1839
        form.add(CheckboxWidget, 'in_filters', title=_('Display in default filters'),
1833 1840
                value=self.in_filters, advanced=True)
1834
        form.add(WidgetList, 'items', title = _('Items'), element_type = StringWidget,
1835
                value = self.items, required = False,
1836
                element_kwargs = {'render_br': False, 'size': 50},
1837
                add_element_label = _('Add item'))
1841
        self.add_items_fields_admin_form(form)
1838 1842
        form.add(IntWidget, 'max_choices', title = _('Maximum number of choices'),
1839 1843
                value = self.max_choices, required = False, size = 4)
1840
        form.add(data_sources.DataSourceSelectionWidget, 'data_source',
1841
                 value=self.data_source,
1842
                 allow_jsonp=False,
1843
                 title=_('Data Source'),
1844
                 hint=_('This will get the available items from an external source.'),
1845
                 required=False,
1846
                 advanced=is_datasource_advanced(self.data_source))
1847 1844
        form.add(CheckboxWidget, 'display_disabled_items',
1848 1845
                title=_('Display disabled items'),
1849 1846
                value=self.display_disabled_items,
......
1855 1852
                'display_disabled_items']
1856 1853

  
1857 1854
    def check_admin_form(self, form):
1858
        items = form.get_widget('items').parse()
1859
        d = {}
1860
        for v in (items or []):
1861
            if v in d:
1862
                form.set_error('items', _('Duplicated Items'))
1863
                return
1864
            d[v] = None
1855
        self.check_items_admin_form(form)
1865 1856

  
1866 1857
    def get_prefill_value(self, user=None, force_string=True):
1867 1858
        return super(ItemsField, self).get_prefill_value(user=user, force_string=False)
1868
-