Projet

Général

Profil

0001-wcs-add-categories-field-to-CareForms-cell-53213.patch

Lauréline Guérin, 23 avril 2021 15:22

Télécharger (10,2 ko)

Voir les différences:

Subject: [PATCH] wcs: add categories field to CareForms cell (#53213)

 combo/apps/wcs/forms.py                       | 12 ++++
 .../migrations/0027_careforms_categories.py   | 17 +++++
 combo/apps/wcs/models.py                      | 30 +++++++-
 .../wcs/templates/combo/wcs/care_forms.html   |  2 +-
 tests/test_wcs.py                             | 69 +++++++++++++++++--
 5 files changed, 123 insertions(+), 7 deletions(-)
 create mode 100644 combo/apps/wcs/migrations/0027_careforms_categories.py
combo/apps/wcs/forms.py
23 23
from .models import (
24 24
    WcsCardInfosCell,
25 25
    WcsCardsCell,
26
    WcsCareFormsCell,
26 27
    WcsCategoryCell,
27 28
    WcsCurrentDraftsCell,
28 29
    WcsCurrentFormsCell,
......
153 154
        self._init_categories()
154 155

  
155 156

  
157
class WcsCareFormsCellForm(WcsFormsMixin, forms.ModelForm):
158
    class Meta:
159
        model = WcsCareFormsCell
160
        fields = ['wcs_site', 'categories']
161

  
162
    def __init__(self, *args, **kwargs):
163
        super().__init__(*args, **kwargs)
164
        self._init_wcs_site()
165
        self._init_categories()
166

  
167

  
156 168
class BackofficeSubmissionCellForm(WcsFormsMixin, forms.ModelForm):
157 169
    class Meta:
158 170
        model = WcsCurrentDraftsCell
combo/apps/wcs/migrations/0027_careforms_categories.py
1
import jsonfield.fields
2
from django.db import migrations
3

  
4

  
5
class Migration(migrations.Migration):
6

  
7
    dependencies = [
8
        ('wcs', '0026_text_to_jsonb'),
9
    ]
10

  
11
    operations = [
12
        migrations.AddField(
13
            model_name='wcscareformscell',
14
            name='categories',
15
            field=jsonfield.fields.JSONField(blank=True, default=dict, verbose_name='Categories'),
16
        ),
17
    ]
combo/apps/wcs/models.py
693 693

  
694 694

  
695 695
@register_cell_class
696
class WcsCareFormsCell(WcsDataBaseCell):
696
class WcsCareFormsCell(WcsDataBaseCell, CategoriesValidityMixin):
697
    categories = JSONField(_('Categories'), blank=True)
698

  
697 699
    api_url = '/api/forms/?limit=10'
698 700
    variable_name = 'care_forms'
699 701
    template_name = 'combo/wcs/care_forms.html'
......
703 705
    class Meta:
704 706
        verbose_name = _('Forms to process')
705 707

  
708
    def get_default_form_class(self):
709
        from .forms import WcsCareFormsCellForm
710

  
711
        return WcsCareFormsCellForm
712

  
713
    def get_cell_extra_context(self, context):
714
        context = super().get_cell_extra_context(context)
715

  
716
        categories_filter = []
717
        if self.categories:
718
            for category in self.categories.get('data', []):
719
                categories_filter.append(tuple(category.split(':')))
720

  
721
        for wcs_site in context['care_forms']:
722
            if not context['care_forms'].get(wcs_site):
723
                continue
724
            if not context['care_forms'][wcs_site].get('data'):
725
                continue
726
            forms = context['care_forms'][wcs_site]['data']
727
            if categories_filter:
728
                forms = [x for x in forms if (wcs_site, x.get('category_slug')) in categories_filter]
729
            context['care_forms'][wcs_site]['data'] = forms  # put it back
730
            context['care_forms'][wcs_site]['categories'] = [v for k, v in categories_filter if k == wcs_site]
731

  
732
        return context
733

  
706 734

  
707 735
@register_cell_class
708 736
class CategoriesCell(WcsDataBaseCell):
combo/apps/wcs/templates/combo/wcs/care_forms.html
26 26
    </tbody>
27 27
  </table>
28 28
  {% endif %}
29
  <p><a class="pk-button" href="{{ forms.url }}backoffice/management/">{% trans "See all forms" %}</a></p>
29
  <p><a class="pk-button" href="{{ forms.url }}backoffice/management/listing{% if forms.categories %}?category_slugs={{ forms.categories|join:"," }}{% endif %}">{% trans "See all forms" %}</a></p>
30 30
{% endfor %}
31 31
{% endblock %}
tests/test_wcs.py
96 96
    {
97 97
        'form_receipt_datetime': '2019-10-17T16:46:03',
98 98
        'form_url_backoffice': '/backoffice/management/foobar/1/',
99
        'category_slug': 'test-3',
99 100
    },
100 101
    {
101 102
        'form_receipt_datetime': '2019-10-17T16:46:04',
102 103
        'form_url_backoffice': '/backoffice/management/foobar/2/',
104
        'category_slug': 'test-4',
103 105
    },
104 106
]
105 107

  
......
719 721

  
720 722
    assert 'http://127.0.0.1:8999/backoffice/management/foobar/1' in result
721 723
    assert 'http://127.0.0.1:8999/backoffice/management/foobar/2' in result
722
    assert '"http://127.0.0.1:8999/backoffice/management/"' in result
724
    assert '"http://127.0.0.1:8999/backoffice/management/listing"' in result
723 725
    assert 'http://127.0.0.2:8999/backoffice/management/foobar/1' in result
724 726
    assert 'http://127.0.0.2:8999/backoffice/management/foobar/2' in result
725
    assert '"http://127.0.0.2:8999/backoffice/management/"' in result
727
    assert '"http://127.0.0.2:8999/backoffice/management/listing"' in result
726 728

  
727 729
    data = cell.get_data(context)
728 730
    assert 'default' in data
729 731
    assert 'other' in data
730 732

  
733
    # limit to a category
734
    cell.categories = {'data': ['default:test-3', 'other:test-4']}
735

  
736
    result = cell.render(context)
737
    assert 'http://127.0.0.1:8999/backoffice/management/foobar/1' in result
738
    assert 'http://127.0.0.1:8999/backoffice/management/foobar/2' not in result
739
    assert '"http://127.0.0.1:8999/backoffice/management/listing?category_slugs=test-3"' in result
740
    assert 'http://127.0.0.2:8999/backoffice/management/foobar/1' not in result
741
    assert 'http://127.0.0.2:8999/backoffice/management/foobar/2' in result
742
    assert '"http://127.0.0.2:8999/backoffice/management/listing?category_slugs=test-4"' in result
743

  
731 744

  
732 745
def test_care_forms_cell_validity(context):
733 746
    page = Page.objects.create(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
......
767 780
    assert validity_info.invalid_since is not None
768 781

  
769 782

  
783
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
784
def test_care_forms_cell_check_validity(mock_send, context):
785
    page = Page.objects.create(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
786
    cell = WcsCareFormsCell.objects.create(page=page, placeholder='content', order=0)
787

  
788
    # no category
789
    cell.check_validity()
790
    assert ValidityInfo.objects.exists() is False
791

  
792
    # valid categories
793
    cell.categories = {'data': ['default:test-3', 'default:test-9']}
794
    cell.save()
795
    cell.check_validity()
796
    assert ValidityInfo.objects.exists() is False
797

  
798
    # can not retrieve data, don't set cell as invalid
799
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
800
        mock_resp = Response()
801
        mock_resp.status_code = 500
802
        requests_get.return_value = mock_resp
803
        cell.check_validity()
804
    assert ValidityInfo.objects.exists() is False
805
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
806
        requests_get.side_effect = ConnectionError()
807
        cell.check_validity()
808
    assert ValidityInfo.objects.exists() is False
809

  
810
    # can not retrieve categories, don't set cell as invalid
811
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
812
        mock_resp = Response()
813
        mock_resp.status_code = 404
814
        requests_get.return_value = mock_resp
815
        cell.check_validity()
816
    assert ValidityInfo.objects.exists() is False
817

  
818
    # invalid category
819
    cell.categories = {'data': ['default:foobar', 'default:test-9']}
820
    cell.save()
821
    cell.check_validity()
822
    validity_info = ValidityInfo.objects.latest('pk')
823
    assert validity_info.invalid_reason_code == 'wcs_category_not_found'
824
    assert validity_info.invalid_since is not None
825

  
826

  
770 827
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
771 828
def test_care_forms_cell_render_single_site(mock_send, context):
772 829
    page = Page(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
......
785 842
    context['synchronous'] = True  # to get fresh content
786 843

  
787 844
    result = cell.render(context)
788
    assert '"http://127.0.0.1:8999/backoffice/management/"' in result
789
    assert '"http://127.0.0.2:8999/backoffice/management/"' not in result
845
    assert '"http://127.0.0.1:8999/backoffice/management/listing"' in result
846
    assert '"http://127.0.0.2:8999/backoffice/management/listing"' not in result
790 847

  
791 848
    data = cell.get_data(context)
792 849
    assert 'default' in data
......
1065 1122
    assert resp.status_int == 302
1066 1123

  
1067 1124

  
1068
def test_manager_current_forms(app, admin_user):
1125
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1126
def test_manager_current_forms(mock_send, app, admin_user):
1069 1127
    page = Page(title='One', slug='one', template_name='standard')
1070 1128
    page.save()
1071 1129
    app = login(app)
......
2017 2075
        klass.objects.create(page=page, placeholder='content', order=0)
2018 2076
    for klass in cell_classes:
2019 2077
        if klass in [
2078
            WcsCareFormsCell,
2020 2079
            WcsCurrentFormsCell,
2021 2080
            WcsCurrentDraftsCell,
2022 2081
            WcsFormsOfCategoryCell,
2023
-