Projet

Général

Profil

0001-misc-allow-picking-a-custom-view-on-card-cell-58878.patch

Frédéric Péters, 11 février 2022 17:07

Télécharger (6,51 ko)

Voir les différences:

Subject: [PATCH] misc: allow picking a custom view on card cell (#58878)

 combo/apps/wcs/forms.py  |  2 +-
 combo/apps/wcs/models.py | 25 ++++++++++++++++++++++++-
 tests/test_wcs.py        | 34 ++++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 2 deletions(-)
combo/apps/wcs/forms.py
96 96
        initial = kwargs.pop('initial', {})
97 97
        initial['with_user'] = not instance.without_user
98 98
        super().__init__(initial=initial, *args, **kwargs)
99
        card_models = get_wcs_options('/api/cards/@list')
99
        card_models = get_wcs_options('/api/cards/@list', include_custom_views=True)
100 100
        self.fields['carddef_reference'].widget = forms.Select(choices=card_models)
101 101
        if self.instance.custom_schema:
102 102
            self.initial['customize_display'] = True
combo/apps/wcs/models.py
782 782
    def card_slug(self):
783 783
        return self.carddef_reference.split(':')[1]
784 784

  
785
    @property
786
    def card_custom_view(self):
787
        try:
788
            return self.carddef_reference.split(':')[2]
789
        except IndexError:
790
            return None
791

  
785 792
    def get_additional_label(self):
786 793
        if not self.cached_title:
787 794
            return
......
948 955

  
949 956
        def populate_cache():
950 957
            if self.carddef_reference:
951
                wcs_key, card_slug = self.carddef_reference.split(':')
958
                parts = self.carddef_reference.split(':')
959
                wcs_key, card_slug = parts[:2]
952 960
                wcs_site = get_wcs_services().get(wcs_key)
953 961
                card_schema = get_wcs_json(wcs_site, 'api/cards/%s/@schema' % card_slug, log_errors='warn')
954 962

  
......
996 1004

  
997 1005
    def get_card_data(self, card_slug, card_id, context, synchronous=False):
998 1006
        api_url = '/api/cards/%s/%s/?include-files-content=off' % (card_slug, card_id)
1007
        if self.card_custom_view:
1008
            api_url = '/api/cards/%s/%s/%s/?include-files-content=off' % (
1009
                card_slug,
1010
                self.card_custom_view,
1011
                card_id,
1012
            )
1013
            user = self.get_concerned_user(context)
1014
            if user:
1015
                user_name_id = user.get_name_id()
1016
                if user_name_id:
1017
                    api_url += '&filter-user-uuid=%s' % user_name_id
999 1018
        if not synchronous:
1000 1019
            synchronous = bool(context.get('synchronous'))
1001 1020
        wcs_site = get_wcs_services().get(self.wcs_site)
......
1011 1030
            )
1012 1031
            response.raise_for_status()
1013 1032
        except RequestException:
1033
            if self.card_custom_view:
1034
                # if there's a custom view consider the error is a 404 because
1035
                # the card was not found in that view, and mark it so.
1036
                context['card_not_found'] = True
1014 1037
            return {}
1015 1038

  
1016 1039
        if response.status_code == 200:
tests/test_wcs.py
417 417
            return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == int(m_card.group(2))][0]
418 418
        except IndexError:
419 419
            return {}
420
    m_card = re.match(r'/api/cards/([a-z0-9_]+)/([a-z0-9_]+)/(\d+)/', url)  # model/custom-view/id
421
    if m_card:
422
        try:
423
            return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == int(m_card.group(3))][0]
424
        except IndexError:
425
            return {}
420 426
    if 'api/cards/card_model_1/list/foo' in url:
421 427
        return WCS_CARDS_CUSTOM_VIEW_DATA
422 428
    m_list = re.match(r'/api/cards/([a-z0-9_]+)/list', url)
......
1861 1867
    form = form_class(instance=cell)
1862 1868
    assert form.fields['carddef_reference'].widget.choices == [
1863 1869
        ('default:card_model_1', 'test : Card Model 1'),
1870
        ('default:card_model_1:foo', 'test : Card Model 1 - bar'),
1864 1871
        ('default:card_model_2', 'test : Card Model 2'),
1865 1872
        ('default:card_model_3', 'test : Card Model 3'),
1866 1873
        ('default:card_a', 'test : Card A'),
......
1869 1876
        ('default:card_d', 'test : Card D'),
1870 1877
        ('default:card_e', 'test : Card E'),
1871 1878
        ('other:card_model_1', 'test2 : Card Model 1'),
1879
        ('other:card_model_1:foo', 'test2 : Card Model 1 - bar'),
1872 1880
        ('other:card_model_2', 'test2 : Card Model 2'),
1873 1881
        ('other:card_model_3', 'test2 : Card Model 3'),
1874 1882
        ('other:card_a', 'test2 : Card A'),
......
1892 1900
    assert 'customize_display' not in form.initial
1893 1901
    assert form.initial['custom_schema'] == {}
1894 1902

  
1903
    cell.carddef_reference = 'default:card_model_1:foo'
1904
    cell.save()
1905
    form = form_class(instance=cell)
1906
    assert 'customize_display' in form.fields
1907
    assert 'custom_schema' in form.fields
1908
    assert 'customize_display' not in form.initial
1909
    assert form.initial['custom_schema'] == {}
1910

  
1911
    cell.carddef_reference = 'default:card_model_1'
1912
    cell.save()
1913

  
1895 1914
    cell.custom_schema = {'cells': [{'varname': 'foo', 'display_mode': 'value'}]}
1896 1915
    cell.save()
1897 1916
    form = form_class(instance=cell)
......
2475 2494
    for i in range(0, 3):
2476 2495
        assert '<h2>Foo bar X%sY</h2>' % i in resp
2477 2496

  
2497
    # using custom view
2498
    cell.carddef_reference = 'default:card_model_1:foo'
2499
    cell.save()
2500
    result = cell.render(context)
2501
    assert 'Foo bar X0Y' in result
2502

  
2503
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
2504
        mock_resp = Response()
2505
        mock_resp.status_code = 404
2506
        requests_get.return_value = mock_resp
2507
        result = cell.render(context)
2508

  
2509
    # nothing, hide cell
2510
    assert not result.strip()
2511

  
2478 2512

  
2479 2513
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
2480 2514
def test_card_cell_render_text_field(mock_send, context):
2481
-