Projet

Général

Profil

0001-wcs-for-card-cell-with-multiple-ids-get-all-cards-in.patch

Lauréline Guérin, 08 août 2022 18:02

Télécharger (14 ko)

Voir les différences:

Subject: [PATCH] wcs: for card cell with multiple ids, get all cards in one
 request (#68015)

 combo/apps/wcs/models.py | 46 ++++++++++++++++++++++-
 tests/test_wcs.py        | 81 +++++++++++++++++++++++++---------------
 2 files changed, 95 insertions(+), 32 deletions(-)
combo/apps/wcs/models.py
1024 1024
    def get_repeat_template(self, context):
1025 1025
        return len(context.get(self.global_context_key) or [])
1026 1026

  
1027
    def get_card_data_from_ids(self, card_id, context):
1028
        card_ids = context.get(self.global_context_key)
1029
        if not card_ids:
1030
            return None
1031

  
1032
        api_url = '/api/cards/%s/list?full=on' % (self.card_slug)
1033
        if self.card_custom_view:
1034
            api_url = '/api/cards/%s/list/%s?full=on' % (
1035
                self.card_slug,
1036
                self.card_custom_view,
1037
            )
1038
            user = self.get_concerned_user(context)
1039
            if user and not user.is_anonymous:
1040
                user_name_id = user.get_name_id()
1041
                if user_name_id:
1042
                    api_url += '&filter-user-uuid=%s' % user_name_id
1043
        api_url += '&%s' % '&'.join(['filter-internal-id=%s' % cid for cid in card_ids])
1044
        synchronous = bool(context.get('synchronous'))
1045
        wcs_site = get_wcs_services().get(self.wcs_site)
1046
        try:
1047
            response = requests.get(
1048
                api_url,
1049
                remote_service=wcs_site,
1050
                user=None if self.without_user else getattr(context.get('request'), 'user', None),
1051
                without_user=self.without_user,
1052
                cache_duration=5,
1053
                raise_if_not_cached=not synchronous,
1054
                log_errors=False,
1055
            )
1056
            response.raise_for_status()
1057
        except RequestException:
1058
            if self.card_custom_view:
1059
                # if there's a custom view consider the error is a 404 because
1060
                # the card was not found in that view, and mark it so.
1061
                context['card_not_found'] = True
1062
            return None
1063

  
1064
        if response.status_code == 200:
1065
            data = response.json()
1066
            for card_data in data.get('data') or []:
1067
                if str(card_data.get('id')) == str(card_id):
1068
                    return card_data
1069
        return None
1070

  
1027 1071
    def get_card_data(self, card_slug, card_custom_view, card_id, context, synchronous=False):
1028 1072
        api_url = '/api/cards/%s/%s/?include-files-content=off' % (card_slug, card_id)
1029 1073
        if card_custom_view:
......
1320 1364
                extra_context['card_not_found'] = True
1321 1365
            return extra_context
1322 1366

  
1323
        card_data = self.get_card_data(self.card_slug, self.card_custom_view, card_id, context)
1367
        card_data = self.get_card_data_from_ids(card_id, context)
1324 1368
        if not card_data:
1325 1369
            return extra_context
1326 1370

  
tests/test_wcs.py
3206 3206
    assert 'Card Model 1' in cell_resp
3207 3207
    assert '<p>Unknown Card</p>' not in cell_resp
3208 3208
    assert len(mock_send.call_args_list) == 1
3209
    assert '/api/cards/card_model_1/11/' in mock_send.call_args_list[0][0][0].url
3209
    assert '/api/cards/card_model_1/list' in mock_send.call_args_list[0][0][0].url
3210
    assert '&filter-internal-id=11&' in mock_send.call_args_list[0][0][0].url
3210 3211

  
3211 3212
    # with identifiers
3212 3213
    page.sub_slug = ''
......
3224 3225
    assert 'Card Model 1' in cell_resp
3225 3226
    assert '<p>Unknown Card</p>' in cell_resp
3226 3227
    assert len(mock_send.call_args_list) == 1
3227
    assert '/api/cards/card_model_1/42/' in mock_send.call_args_list[0][0][0].url
3228
    assert '/api/cards/card_model_1/list' in mock_send.call_args_list[0][0][0].url
3229
    assert '&filter-internal-id=42&' in mock_send.call_args_list[0][0][0].url
3228 3230

  
3229 3231
    cell.card_ids = '42, , 35'
3230 3232
    cell.save()
......
3240 3242
        assert 'Card Model 1' in cell_resp
3241 3243
        assert '<p>Unknown Card</p>' in cell_resp
3242 3244
    assert len(mock_send.call_args_list) == 2
3243
    assert '/api/cards/card_model_1/42/' in mock_send.call_args_list[0][0][0].url
3244
    assert '/api/cards/card_model_1/35/' in mock_send.call_args_list[1][0][0].url
3245
    for i in range(0, 2):
3246
        assert '/api/cards/card_model_1/list' in mock_send.call_args_list[i][0][0].url
3247
        assert '&filter-internal-id=42&filter-internal-id=35&' in mock_send.call_args_list[i][0][0].url
3245 3248

  
3246 3249
    cell.card_ids = '{% cards|objects:"card_model_1"|last|get:"id" %}'  # syntax error
3247 3250
    cell.save()
......
3267 3270
    assert '/api/cards/card_model_1/list' in mock_send.call_args_list[0][0][0].url
3268 3271
    # cell rendering
3269 3272
    assert '/api/cards/card_model_1/list' in mock_send.call_args_list[1][0][0].url
3270
    assert '/api/cards/card_model_1/13/' in mock_send.call_args_list[2][0][0].url
3273
    assert '/api/cards/card_model_1/list' in mock_send.call_args_list[2][0][0].url
3274
    assert '&filter-internal-id=13&' in mock_send.call_args_list[2][0][0].url
3271 3275

  
3272 3276
    def test_card_ids():
3273 3277
        mock_send.reset_mock()
......
3283 3287
        # page rendering
3284 3288
        assert '/api/cards/card_model_1/list' in mock_send.call_args_list[0][0][0].url
3285 3289
        # cell rendering
3290
        card_ids = [c['id'] for c in WCS_CARDS_DATA['card_model_1']]
3291
        filters = '&%s&' % '&'.join('filter-internal-id=%s' % cid for cid in card_ids)
3286 3292
        for i in range(0, 3):
3287 3293
            assert '/api/cards/card_model_1/list' in mock_send.call_args_list[i * 2 + 1][0][0].url
3288
            assert (
3289
                '/api/cards/card_model_1/%s/' % WCS_CARDS_DATA['card_model_1'][i]['id']
3290
                in mock_send.call_args_list[i * 2 + 2][0][0].url
3291
            )
3294
            assert '/api/cards/card_model_1/list' in mock_send.call_args_list[i * 2 + 2][0][0].url
3295
            assert filters in mock_send.call_args_list[i * 2 + 2][0][0].url
3292 3296

  
3293 3297
    for card_ids in [
3294 3298
        '{% for card in cards|objects:"card_model_1" %}{{ card.id }},{% endfor %}',
......
3361 3365
        cell_resp = app.get(cell2_url + '?ctx=' + extra_ctx[1])
3362 3366
        assert cell_resp.context['repeat_index'] == 0
3363 3367
        assert len(mock_send.call_args_list) == len(urls)
3364
        for j, url in enumerate(urls):
3365
            assert url in mock_send.call_args_list[j][0][0].url
3368
        for j, url_parts in enumerate(urls):
3369
            if not isinstance(url_parts, tuple):
3370
                url_parts = (url_parts,)
3371
            for url_part in url_parts:
3372
                assert url_part in mock_send.call_args_list[j][0][0].url
3366 3373

  
3367 3374
    def multiple(urls):
3368 3375
        resp = app.get(page.get_online_url())
......
3376 3383
            cell_resp = app.get(cell2_url + '?ctx=' + extra_ctx[i + 1])
3377 3384
            assert cell_resp.context['repeat_index'] == i
3378 3385
            assert len(mock_send.call_args_list) == len(urls)
3379
            for j, url in enumerate(urls):
3380
                if isinstance(url, list):
3381
                    assert url[i] in mock_send.call_args_list[j][0][0].url
3382
                else:
3383
                    assert url in mock_send.call_args_list[j][0][0].url
3386
            for j, url_parts in enumerate(urls):
3387
                if not isinstance(url_parts, tuple):
3388
                    url_parts = (url_parts,)
3389
                for url_part in url_parts:
3390
                    assert url_part in mock_send.call_args_list[j][0][0].url
3384 3391

  
3385 3392
    # no cell with this slug
3386 3393
    cell2.related_card_path = 'slugz/cardb'
......
3430 3437
            # get first cell data
3431 3438
            '/api/cards/card_a/1/',
3432 3439
            # and follow cardb relation
3433
            '/api/cards/card_b/1/',
3440
            ('/api/cards/card_b/list', '&filter-internal-id=1&'),
3434 3441
        ]
3435 3442
    )
3436 3443
    cell3.delete()  # reset
......
3446 3453
            # follow cardc relation
3447 3454
            '/api/cards/card_c/6/',
3448 3455
            # and follow cardb relation
3449
            '/api/cards/card_b/7/',
3456
            ('/api/cards/card_b/list', '&filter-internal-id=7&'),
3450 3457
        ]
3451 3458
    )
3452 3459

  
......
3466 3473
        # follow cardc relation
3467 3474
        '/api/cards/card_c/6/',
3468 3475
        # and follow cardb relation
3469
        '/api/cards/card_b/7/',
3476
        ('/api/cards/card_b/list', '&filter-internal-id=7&'),
3470 3477
    ]
3471 3478
    resp = app.get(page.get_online_url())
3472 3479
    assert len(resp.context['cells']) == 2
......
3478 3485
    cell_resp = app.get(cell2_url + '?ctx=' + extra_ctx[0])
3479 3486
    assert cell_resp.context['repeat_index'] == 0
3480 3487
    assert len(mock_send.call_args_list) == len(urls)
3481
    for j, url in enumerate(urls):
3482
        assert url in mock_send.call_args_list[j][0][0].url
3488
    for j, url_parts in enumerate(urls):
3489
        if not isinstance(url_parts, tuple):
3490
            url_parts = (url_parts,)
3491
        for url_part in url_parts:
3492
            assert url_part in mock_send.call_args_list[j][0][0].url
3483 3493

  
3484 3494
    # reset
3485 3495
    cell.order = 0  # reset
......
3499 3509
            # follow cardc relation
3500 3510
            '/api/cards/card_c/6/',
3501 3511
            # and follow cardb relation
3502
            '/api/cards/card_b/a-custom-view/7/',
3512
            ('/api/cards/card_b/list/a-custom-view', '&filter-internal-id=7&'),
3503 3513
        ]
3504 3514
    )
3505 3515

  
......
3512 3522
            # get first cell data
3513 3523
            '/api/cards/card_a/1/',
3514 3524
            # and follow cardb relation
3515
            ['/api/cards/card_b/2/', '/api/cards/card_b/3/'],
3525
            ('/api/cards/card_b/list', '&filter-internal-id=2&filter-internal-id=3&'),
3516 3526
        ]
3517 3527
    )
3518 3528

  
......
3527 3537
            # follow cardc relation
3528 3538
            '/api/cards/card_c/6/',
3529 3539
            # and follow cardb relation
3530
            ['/api/cards/card_b/8/', '/api/cards/card_b/9/'],
3540
            ('/api/cards/card_b/list', '&filter-internal-id=8&filter-internal-id=9&'),
3531 3541
        ]
3532 3542
    )
3533 3543

  
......
3539 3549
            # get first cell data
3540 3550
            '/api/cards/card_a/1/',
3541 3551
            # and follow cardb relation
3542
            ['/api/cards/card_b/4/', '/api/cards/card_b/5/'],
3552
            ('/api/cards/card_b/list', '&filter-internal-id=4&filter-internal-id=5&'),
3543 3553
        ]
3544 3554
    )
3545 3555

  
......
3554 3564
            # follow cardc relation
3555 3565
            '/api/cards/card_c/6/',
3556 3566
            # and follow cardb relation
3557
            ['/api/cards/card_b/10/', '/api/cards/card_b/11/'],
3567
            ('/api/cards/card_b/list', '&filter-internal-id=10&filter-internal-id=11&'),
3558 3568
        ]
3559 3569
    )
3560 3570

  
......
3716 3726
            # get list of card_a with cardb=1
3717 3727
            '/api/cards/card_a/list?orig=combo&filter-cardb=1',
3718 3728
            # and follow carda reverse relation
3719
            ['/api/cards/card_a/%s/' % i for i in range(1, 5)],
3729
            (
3730
                '/api/cards/card_a/list',
3731
                '&filter-internal-id=1&filter-internal-id=2&filter-internal-id=3&filter-internal-id=4&',
3732
            ),
3720 3733
        ]
3721 3734
    )
3722 3735

  
......
3730 3743
            # get list of card_a with cardsb=1
3731 3744
            '/api/cards/card_a/list?orig=combo&filter-cardsb=1',
3732 3745
            # and follow carda reverse relation
3733
            ['/api/cards/card_a/%s/' % i for i in range(1, 5)],
3746
            (
3747
                '/api/cards/card_a/list',
3748
                '&filter-internal-id=1&filter-internal-id=2&filter-internal-id=3&filter-internal-id=4&',
3749
            ),
3734 3750
        ]
3735 3751
    )
3736 3752

  
......
3744 3760
            # get list of card_a with cardsb=1
3745 3761
            '/api/cards/card_a/list?orig=combo&filter-blockb_cardb=1',
3746 3762
            # and follow carda reverse relation
3747
            ['/api/cards/card_a/%s/' % i for i in range(1, 5)],
3763
            (
3764
                '/api/cards/card_a/list',
3765
                '&filter-internal-id=1&filter-internal-id=2&filter-internal-id=3&filter-internal-id=4&',
3766
            ),
3748 3767
        ]
3749 3768
    )
3750 3769

  
......
3786 3805
            # get list of card_f with cardf=42
3787 3806
            '/api/cards/card_f/list?orig=combo&filter-cardh=42',
3788 3807
            # and follow cardf reverse relation
3789
            ['/api/cards/card_f/41/'],
3808
            ('/api/cards/card_f/list', '&filter-internal-id=41&'),
3790 3809
        ]
3791 3810
    )
3792 3811

  
......
3805 3824
            # get list of card_g with cardf=44
3806 3825
            '/api/cards/card_g/list?orig=combo&filter-cardh=44',
3807 3826
            # and follow cardf reverse relation
3808
            ['/api/cards/card_g/43/'],
3827
            ('/api/cards/card_g/list', '&filter-internal-id=43&'),
3809 3828
        ]
3810 3829
    )
3811 3830

  
3812
-