Projet

Général

Profil

0001-wcs-use-category_slugs-filter-in-wcs-calls-53376.patch

Lauréline Guérin, 29 avril 2021 08:55

Télécharger (16,8 ko)

Voir les différences:

Subject: [PATCH] wcs: use category_slugs filter in wcs calls (#53376)

 combo/apps/wcs/models.py |  62 +++++----------
 tests/test_wcs.py        | 164 +++++++++++++++++++++++++--------------
 2 files changed, 128 insertions(+), 98 deletions(-)
combo/apps/wcs/models.py
430 430
        self.mark_as_valid()
431 431

  
432 432

  
433
class CategoriesFilteringMixin(object):
434
    def get_api_url_for_site(self, context, wcs_slug):
435
        url = self.get_api_url(context)
436

  
437
        if self.categories and self.categories.get('data') or []:
438
            categories_by_site = collections.defaultdict(list)
439
            for category in self.categories['data']:
440
                key, slug = category.split(':')
441
                categories_by_site[key].append(slug)
442
            if not categories_by_site.get(wcs_slug):
443
                return None
444
            separator = '?' if '?' not in url else '&'
445
            url += '%scategory_slugs=%s' % (separator, ','.join(categories_by_site.get(wcs_slug)))
446

  
447
        return url
448

  
449

  
433 450
@register_cell_class
434
class WcsCurrentFormsCell(WcsUserDataBaseCell, CategoriesValidityMixin):
451
class WcsCurrentFormsCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsUserDataBaseCell):
435 452
    variable_name = 'user_forms'
436 453

  
437 454
    categories = JSONField(_('Categories'), blank=True)
......
490 507
    def get_cell_extra_context(self, context):
491 508
        context = super(WcsCurrentFormsCell, self).get_cell_extra_context(context)
492 509

  
493
        categories_filter = {}
494
        if self.categories:
495
            for category in self.categories.get('data', []):
496
                categories_filter[tuple(category.split(':'))] = True
497

  
498 510
        for wcs_site in context['user_forms']:
499 511
            if not context['user_forms'].get(wcs_site):
500 512
                continue
501 513
            if not context['user_forms'][wcs_site].get('data'):
502 514
                continue
503 515
            forms = context['user_forms'][wcs_site]['data']
504
            if categories_filter:
505
                forms = [x for x in forms if (wcs_site, x.get('category_slug')) in categories_filter]
506 516
            if self.current_forms and self.done_forms:
507 517
                pass  # keep them all
508 518
            elif self.current_forms:
......
528 538

  
529 539

  
530 540
@register_cell_class
531
class WcsCurrentDraftsCell(WcsUserDataBaseCell, CategoriesValidityMixin):
541
class WcsCurrentDraftsCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsUserDataBaseCell):
532 542
    variable_name = 'current_drafts'
533 543
    template_name = 'combo/wcs/current_drafts.html'
534 544

  
......
553 563
    def get_cell_extra_context(self, context):
554 564
        context = super(WcsCurrentDraftsCell, self).get_cell_extra_context(context)
555 565

  
556
        categories_filter = {}
557
        if self.categories:
558
            for category in self.categories.get('data', []):
559
                categories_filter[tuple(category.split(':'))] = True
560

  
561 566
        for wcs_site in context['current_drafts']:
562 567
            if not context['current_drafts'].get(wcs_site):
563 568
                continue
564 569
            if not context['current_drafts'][wcs_site].get('data'):
565 570
                continue
566 571
            forms = context['current_drafts'][wcs_site]['data']
567
            if categories_filter:
568
                forms = [x for x in forms if (wcs_site, x.get('category_slug')) in categories_filter]
569 572
            context['current_drafts'][wcs_site]['data'] = forms  # put it back
570 573

  
571 574
        # regroup all forms in a flat list
......
702 705

  
703 706

  
704 707
@register_cell_class
705
class WcsCareFormsCell(WcsDataBaseCell, CategoriesValidityMixin):
708
class WcsCareFormsCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsDataBaseCell):
706 709
    categories = JSONField(_('Categories'), blank=True)
707 710

  
708 711
    api_url = '/api/forms/?limit=10'
......
719 722

  
720 723
        return WcsCareFormsCellForm
721 724

  
722
    def get_api_url_for_site(self, context, wcs_slug):
723
        url = self.get_api_url(context)
724

  
725
        if self.categories and self.categories.get('data') or []:
726
            categories_by_site = collections.defaultdict(list)
727
            for category in self.categories['data']:
728
                key, slug = category.split(':')
729
                categories_by_site[key].append(slug)
730
            if not categories_by_site.get(wcs_slug):
731
                return None
732
            url += '&category_slugs=%s' % ','.join(categories_by_site.get(wcs_slug))
733

  
734
        return url
735

  
736 725
    def get_cell_extra_context(self, context):
737 726
        context = super().get_cell_extra_context(context)
738 727

  
......
1019 1008

  
1020 1009

  
1021 1010
@register_cell_class
1022
class BackofficeSubmissionCell(WcsDataBaseCell, CategoriesValidityMixin):
1011
class BackofficeSubmissionCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsDataBaseCell):
1023 1012
    api_url = '/api/formdefs/?backoffice-submission=on'
1024 1013
    variable_name = 'all_formdefs'
1025 1014
    template_name = 'combo/wcs/backoffice_submission.html'
......
1047 1036
        all_formdefs = context.pop('all_formdefs')
1048 1037
        formdefs = {}
1049 1038

  
1050
        categories_filter = {}
1051
        if self.categories:
1052
            for category in self.categories.get('data', []):
1053
                categories_filter[tuple(category.split(':'))] = True
1054

  
1055 1039
        # add a fake category where it's missing
1056 1040
        for key, site_formdefs in all_formdefs.items():
1057 1041
            if not site_formdefs.get('data'):
1058 1042
                continue
1059
            if categories_filter:
1060
                site_formdefs['data'] = [
1061
                    x for x in site_formdefs['data'] if (key, x.get('category_slug')) in categories_filter
1062
                ]
1063 1043
            formdefs[key] = site_formdefs
1064 1044
            for formdef in site_formdefs['data']:
1065 1045
                if 'category' not in formdef:
tests/test_wcs.py
516 516
    assert 'http://127.0.0.2:8999/form/1/' not in result  # wip
517 517
    assert 'http://127.0.0.2:8999/form/4/' in result  # done
518 518

  
519
    # limit to a category
520
    cell.categories = {'data': ['default:test-3']}
521
    extra_context = cell.get_cell_extra_context(context)
522
    assert len(extra_context['forms']) == 0
523
    cell.categories = {'data': ['default:test-9']}
524
    extra_context = cell.get_cell_extra_context(context)
525
    assert len(extra_context['forms']) == 1
526

  
527
    # check both category limit and all forms
528
    cell.current_forms = True
529
    cell.done_forms = True
530
    extra_context = cell.get_cell_extra_context(context)
531
    assert len(extra_context['forms']) == 2
532

  
533
    # check both category limit and no forms
534
    cell.current_forms = False
535
    cell.done_forms = False
536
    extra_context = cell.get_cell_extra_context(context)
537
    assert len(extra_context['forms']) == 0
519
    # limit to categories
520
    cell.categories = {'data': ['default:test-3', 'other:test-6']}
521
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
522
        mock_json = mock.Mock(status_code=200)
523
        requests_get.return_value = mock_json
524
        cell.get_cell_extra_context(context)
525
    assert len(requests_get.call_args_list) == 2
526
    assert requests_get.call_args_list[0][0][0] == '/api/user/forms?limit=100&sort=desc&category_slugs=test-3'
527
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
528
    assert requests_get.call_args_list[1][0][0] == '/api/user/forms?limit=100&sort=desc&category_slugs=test-6'
529
    assert requests_get.call_args_list[1][1]['remote_service']['url'] == 'http://127.0.0.2:8999/'
538 530

  
539 531
    # check include drafts
532
    cell.categories = None
540 533
    cell.include_drafts = False
541 534
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
542 535
        mock_json = mock.Mock(status_code=200)
543 536
        requests_get.return_value = mock_json
544 537
        cell.get_cell_extra_context(context)
538
    assert len(requests_get.call_args_list) == 2
545 539
    assert requests_get.call_args_list[0][0][0] == '/api/user/forms?limit=100&sort=desc'
540
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
541
    assert requests_get.call_args_list[1][0][0] == '/api/user/forms?limit=100&sort=desc'
542
    assert requests_get.call_args_list[1][1]['remote_service']['url'] == 'http://127.0.0.2:8999/'
546 543

  
547 544
    cell.include_drafts = True
548 545
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
549 546
        mock_json = mock.Mock(status_code=200)
550 547
        requests_get.return_value = mock_json
551 548
        cell.get_cell_extra_context(context)
549
    assert len(requests_get.call_args_list) == 2
552 550
    assert requests_get.call_args_list[0][0][0] == '/api/user/forms?limit=100&sort=desc&include-drafts=on'
551
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
552
    assert requests_get.call_args_list[1][0][0] == '/api/user/forms?limit=100&sort=desc&include-drafts=on'
553
    assert requests_get.call_args_list[1][1]['remote_service']['url'] == 'http://127.0.0.2:8999/'
553 554

  
554
    # check empty messages
555 555
    cell.categories = {'data': ['default:test-3']}
556
    cell.current_forms = True
557
    cell.done_forms = False
558
    cell.include_drafts = False
559
    result = cell.render(context)
560
    assert 'There are no current forms.' in result
561
    cell.done_forms = True
562
    result = cell.render(context)
563
    assert 'There are no forms.' in result
564
    cell.current_forms = False
565
    result = cell.render(context)
566
    assert 'There are no done forms' in result
556
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
557
        mock_json = mock.Mock(status_code=200)
558
        requests_get.return_value = mock_json
559
        cell.get_cell_extra_context(context)
560
    assert len(requests_get.call_args_list) == 1
561
    assert (
562
        requests_get.call_args_list[0][0][0]
563
        == '/api/user/forms?limit=100&sort=desc&include-drafts=on&category_slugs=test-3'
564
    )
565
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
566

  
567
    cell.categories = {'data': []}
568
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
569
        mock_json = mock.Mock(status_code=200)
570
        requests_get.return_value = mock_json
571
        cell.get_cell_extra_context(context)
572
    assert len(requests_get.call_args_list) == 2
573

  
574
    # check empty messages
575
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
576
        mock_json = mock.Mock(status_code=200)
577
        requests_get.return_value = mock_json
578
        cell.current_forms = True
579
        cell.done_forms = False
580
        cell.include_drafts = False
581
        result = cell.render(context)
582
        assert 'There are no current forms.' in result
583
        cell.done_forms = True
584
        result = cell.render(context)
585
        assert 'There are no forms.' in result
586
        cell.current_forms = False
587
        result = cell.render(context)
588
        assert 'There are no done forms' in result
567 589

  
568 590

  
569 591
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
......
1071 1093
    assert len([x for x in extra_context['drafts'] if x['site_slug'] == 'default']) == 4
1072 1094
    assert len([x for x in extra_context['drafts'] if x['site_slug'] == 'other']) == 4
1073 1095

  
1074
    # limit to a category
1096
    # limit to categories
1097
    cell.categories = {'data': ['default:test-3', 'other:test-6']}
1098
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1099
        mock_json = mock.Mock(status_code=200)
1100
        requests_get.return_value = mock_json
1101
        cell.get_cell_extra_context(context)
1102
    assert len(requests_get.call_args_list) == 2
1103
    assert requests_get.call_args_list[0][0][0] == '/api/user/drafts?category_slugs=test-3'
1104
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
1105
    assert requests_get.call_args_list[1][0][0] == '/api/user/drafts?category_slugs=test-6'
1106
    assert requests_get.call_args_list[1][1]['remote_service']['url'] == 'http://127.0.0.2:8999/'
1107

  
1075 1108
    cell.categories = {'data': ['default:test-3']}
1076
    extra_context = cell.get_cell_extra_context(context)
1077
    assert len(extra_context['drafts']) == 0
1078
    cell.categories = {'data': ['default:test-9']}
1079
    extra_context = cell.get_cell_extra_context(context)
1080
    assert len(extra_context['drafts']) == 2
1109
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1110
        mock_json = mock.Mock(status_code=200)
1111
        requests_get.return_value = mock_json
1112
        cell.get_cell_extra_context(context)
1113
    assert len(requests_get.call_args_list) == 1
1114
    assert requests_get.call_args_list[0][0][0] == '/api/user/drafts?category_slugs=test-3'
1115
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
1116

  
1117
    cell.categories = {'data': []}
1118
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1119
        mock_json = mock.Mock(status_code=200)
1120
        requests_get.return_value = mock_json
1121
        cell.get_cell_extra_context(context)
1122
    assert len(requests_get.call_args_list) == 2
1081 1123

  
1082 1124
    # check empty message
1083 1125
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
......
1893 1935
def test_backoffice_submission_cell_render(context):
1894 1936
    page = Page(title='xxx', slug='test_backoffice_submission_cell_render', template_name='standard')
1895 1937
    page.save()
1896
    cell = BackofficeSubmissionCell(page=page, placeholder='content', order=0)
1897
    cell.wcs_site = 'default'
1898
    cell.save()
1938
    cell = BackofficeSubmissionCell.objects.create(page=page, placeholder='content', order=0)
1899 1939

  
1900 1940
    context['synchronous'] = True  # to get fresh content
1901 1941

  
......
1922 1962
        )
1923 1963
        result = cell.render(context)
1924 1964
        assert '/backoffice/submission/a-private-form/' in result
1925
        assert list(context['all_formdefs'].keys()) == ['default']
1965
        assert list(context['all_formdefs'].keys()) == ['default', 'other']
1926 1966
        assert 'h2' in result
1927 1967

  
1928
        # limit to a category
1929
        cell.categories = {'data': ['default:test-3']}
1968
        # limit to categories
1969
        requests_get.reset_mock()
1970
        cell.categories = {'data': ['default:test-3', 'other:test-6']}
1930 1971

  
1931 1972
        result = cell.render(context)
1932
        assert '/backoffice/submission/a-private-form/' not in result
1973
        assert len(requests_get.call_args_list) == 2
1974
        assert (
1975
            requests_get.call_args_list[0][0][0]
1976
            == '/api/formdefs/?backoffice-submission=on&category_slugs=test-3'
1977
        )
1978
        assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
1979
        assert (
1980
            requests_get.call_args_list[1][0][0]
1981
            == '/api/formdefs/?backoffice-submission=on&category_slugs=test-6'
1982
        )
1983
        assert requests_get.call_args_list[1][1]['remote_service']['url'] == 'http://127.0.0.2:8999/'
1933 1984

  
1934
        requests_get.return_value = MockedRequestResponse(
1935
            content=json.dumps(
1936
                {
1937
                    'data': [
1938
                        {
1939
                            'backoffice_submission_url': '/backoffice/submission/a-private-form/',
1940
                            'title': 'Foo',
1941
                            'category_slug': 'test-3',
1942
                        }
1943
                    ]
1944
                }
1945
            )
1985
        requests_get.reset_mock()
1986
        cell.categories = {'data': ['default:test-3']}
1987
        result = cell.render(context)
1988
        assert len(requests_get.call_args_list) == 1
1989
        assert (
1990
            requests_get.call_args_list[0][0][0]
1991
            == '/api/formdefs/?backoffice-submission=on&category_slugs=test-3'
1946 1992
        )
1993
        assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
1994

  
1995
        requests_get.reset_mock()
1996
        cell.categories = {'data': []}
1947 1997
        result = cell.render(context)
1948
        assert '/backoffice/submission/a-private-form/' in result
1998
        assert len(requests_get.call_args_list) == 2
1949 1999

  
1950 2000

  
1951 2001
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1952
-