Projet

Général

Profil

0001-wcs-cards-custom-views-46865.patch

Lauréline Guérin, 30 octobre 2020 15:14

Télécharger (12,8 ko)

Voir les différences:

Subject: [PATCH] wcs: cards & custom views (#46865)

 combo/apps/wcs/forms.py  | 16 ++++++--
 combo/apps/wcs/models.py | 48 +++++++++++++++++------
 combo/apps/wcs/utils.py  |  5 ++-
 tests/test_wcs.py        | 85 +++++++++++++++++++++++++++++++++++++---
 4 files changed, 133 insertions(+), 21 deletions(-)
combo/apps/wcs/forms.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import django
18 17
from django import forms
19 18
from django.utils.datastructures import MultiValueDict
20
from django.utils.safestring import mark_safe
21 19
from django.utils.translation import ugettext_lazy as _
22 20

  
23 21
from combo.utils.forms import MultiSortWidget
24 22

  
25 23
from .models import (WcsFormCell, WcsCategoryCell, WcsFormsOfCategoryCell,
26
                     WcsCurrentFormsCell, WcsCurrentDraftsCell, WcsCardsCell)
24
                     WcsCurrentFormsCell, WcsCurrentDraftsCell, WcsCardsCell,
25
                     WcsCardInfosCell)
27 26
from .utils import get_wcs_options, get_wcs_services
28 27

  
29 28

  
......
43 42
        model = WcsCardsCell
44 43
        fields = ('carddef_reference',)
45 44

  
45
    def __init__(self, *args, **kwargs):
46
        super().__init__(*args, **kwargs)
47
        card_models = get_wcs_options('/api/cards/@list', include_custom_views=True)
48
        self.fields['carddef_reference'].widget = forms.Select(choices=card_models)
49

  
50

  
51
class WcsCardInfoCellForm(forms.ModelForm):
52
    class Meta:
53
        model = WcsCardInfosCell
54
        fields = ('carddef_reference',)
55

  
46 56
    def __init__(self, *args, **kwargs):
47 57
        super().__init__(*args, **kwargs)
48 58
        card_models = get_wcs_options('/api/cards/@list')
combo/apps/wcs/models.py
713 713
    def is_relevant(self, context):
714 714
        return bool(self.carddef_reference)
715 715

  
716
    def get_default_form_class(self):
717
        from .forms import WcsCardsCellForm
718
        return WcsCardsCellForm
719

  
720 716
    @property
721 717
    def wcs_site(self):
722 718
        return self.carddef_reference.split(':')[0]
......
747 743

  
748 744
        def populate_cache():
749 745
            if self.carddef_reference:
750
                wcs_key, card_slug = self.carddef_reference.split(':')
746
                parts = self.carddef_reference.split(':')
747
                wcs_key, card_slug = parts[:2]
751 748
                wcs_site = get_wcs_services().get(wcs_key)
752 749
                card_models = get_wcs_json(wcs_site, 'api/cards/@list')
753 750

  
......
759 756
                card_found = False
760 757
                for card in card_models.get('data') or []:
761 758
                    slug = card['slug']
762
                    if slug == card_slug:
763
                        self.cached_title = card['title']
764
                        self.save(update_fields=['cached_title'])
765
                        card_found = True
766
                        break
759

  
760
                    if slug != card_slug:
761
                        continue
762

  
763
                    card_title = card['title']
764

  
765
                    if len(parts) > 2:
766
                        custom_view = None
767

  
768
                        for v in card.get('custom_views') or []:
769
                            if v['id'] == parts[2]:
770
                                custom_view = v
771
                                break
772

  
773
                        if custom_view is None:
774
                            continue
775

  
776
                        card_title = '%s - %s' % (card_title, custom_view['text'])
777

  
778
                    self.cached_title = card_title
779
                    self.save(update_fields=['cached_title'])
780
                    card_found = True
781
                    break
767 782
                if card_found:
768 783
                    self.mark_as_valid()
769 784
                    return
......
775 790
        populate_cache()
776 791

  
777 792
    def get_api_url(self, context):
778
        return 'api/cards/%s/list' % self.carddef_reference.split(':')[1]
793
        parts = self.carddef_reference.split(':')
794
        if len(parts) > 2:
795
            return 'api/cards/%s/list/%s' % (parts[1], parts[2])
796
        return 'api/cards/%s/list' % parts[1]
779 797

  
780 798
    def get_cell_extra_context(self, context):
781 799
        extra_context = super().get_cell_extra_context(context)
......
796 814

  
797 815
        return extra_context
798 816

  
817
    def get_default_form_class(self):
818
        from .forms import WcsCardsCellForm
819
        return WcsCardsCellForm
820

  
799 821
    def render_for_search(self):
800 822
        return ''
801 823

  
......
878 900

  
879 901
        return extra_context
880 902

  
903
    def get_default_form_class(self):
904
        from .forms import WcsCardInfoCellForm
905
        return WcsCardInfoCellForm
906

  
881 907

  
882 908
@register_cell_class
883 909
class TrackingCodeInputCell(CellBase):
combo/apps/wcs/utils.py
46 46
    return response.json()
47 47

  
48 48

  
49
def get_wcs_options(url, include_category_slug=False):
49
def get_wcs_options(url, include_category_slug=False, include_custom_views=False):
50 50
    references = []
51 51
    for wcs_key, wcs_site in sorted(get_wcs_services().items(), key=lambda x: x[1]['title']):
52 52
        site_title = wcs_site.get('title')
......
68 68
            else:
69 69
                reference = '%s:%s' % (wcs_key, slug)
70 70
            references.append((reference, label))
71
            if include_custom_views:
72
                for custom_view in element.get('custom_views') or []:
73
                    references.append(('%s:%s' % (reference, custom_view['id']), '%s - %s' % (label, custom_view['text'])))
71 74
    return references
tests/test_wcs.py
85 85
]
86 86

  
87 87
WCS_CARDDEFS_DATA = [
88
    {'title': 'Card Model 1', 'slug': 'card_model_1'},
88
    {'title': 'Card Model 1', 'slug': 'card_model_1', 'custom_views': [{'id': 'foo', 'text': 'bar'}]},
89 89
    {'title': 'Card Model 2', 'slug': 'card_model_2'},
90 90
    {'title': 'Card Model 3', 'slug': 'card_model_3'},
91 91
]
......
117 117
    },
118 118
]
119 119

  
120
WCS_CARDS_CUSTOM_VIEW_DATA = [
121
    {
122
        'id': 11,
123
        'display_id': '10-11',
124
        'display_name': 'Card Model 1 - n°10-11',
125
        'digest': 'a a a',
126
        'text': 'aa',
127
        'url': '/backoffice/data/card_model_1/11/'
128
    },
129
    {
130
        'id': 12,
131
        'display_id': '10-12',
132
        'display_name': 'Card Model 1 - n°10-12',
133
        'digest': 'b b b',
134
        'text': 'bb',
135
        'url': '/backoffice/data/card_model_1/12/'
136
    },
137
]
138

  
120 139
WCS_CARDDEF_SCHEMA = {
121 140
    'name': 'Card Model 1',
122 141
    'fields': [
......
187 206
        return WCS_CARDDEF_SCHEMA
188 207
    if 'api/cards/card_model_1/11/' in url:
189 208
        return WCS_CARD_DATA
209
    if 'api/cards/card_model_1/list/foo' in url:
210
        return WCS_CARDS_CUSTOM_VIEW_DATA
190 211
    if 'api/cards/card_model_1/list' in url:
191 212
        return WCS_CARDS_DATA
192 213
    return []
......
1018 1039
        settings.KNOWN_SERVICES = temp_settings
1019 1040

  
1020 1041

  
1021
@pytest.mark.parametrize('cell_class', [WcsCardsCell, WcsCardInfosCell])
1022 1042
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1023
def test_card_cells_setup(mock_send, cell_class):
1024
    cell = cell_class()
1043
def test_cards_cell_setup(mock_send):
1044
    cell = WcsCardsCell()
1025 1045
    form_class = cell.get_default_form_class()
1026 1046
    form = form_class()
1027 1047
    assert form.fields['carddef_reference'].widget.choices == [
1028 1048
        ('default:card_model_1', 'test : Card Model 1'),
1049
        ('default:card_model_1:foo', 'test : Card Model 1 - bar'),
1029 1050
        ('default:card_model_2', 'test : Card Model 2'),
1030 1051
        ('default:card_model_3', 'test : Card Model 3'),
1031 1052
        ('other:card_model_1', 'test2 : Card Model 1'),
1053
        ('other:card_model_1:foo', 'test2 : Card Model 1 - bar'),
1032 1054
        ('other:card_model_2', 'test2 : Card Model 2'),
1033 1055
        ('other:card_model_3', 'test2 : Card Model 3'),
1034 1056
    ]
......
1046 1068
    # make sure cached attributes are removed from serialized pages
1047 1069
    assert 'cached_' not in json.dumps(page.get_serialized_page())
1048 1070

  
1071
    cell.carddef_reference = 'default:card_model_1:foo'
1072
    cell.save()
1073
    assert cell.cached_title == 'Card Model 1 - bar'
1074
    assert cell.get_additional_label() == 'Card Model 1 - bar'
1075

  
1049 1076
    # check content provided to search engine
1050 1077
    assert cell.render_for_search() == ''
1051 1078

  
......
1055 1082
    # run update db cache
1056 1083
    appconfig = apps.get_app_config('wcs')
1057 1084
    appconfig.update_db_cache()
1058
    assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1'
1085
    assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1 - bar'
1059 1086

  
1060 1087

  
1061 1088
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
......
1096 1123
    assert validity_info.invalid_reason_code == 'wcs_card_not_found'
1097 1124
    assert validity_info.invalid_since is not None
1098 1125

  
1126
    cell.carddef_reference = 'default:card_model_1:foo'
1127
    cell.save()
1128
    assert ValidityInfo.objects.exists() is False
1129

  
1130
    cell.carddef_reference = 'default:card_model_1:bar'
1131
    cell.save()
1132
    validity_info = ValidityInfo.objects.latest('pk')
1133
    assert validity_info.invalid_reason_code == 'wcs_card_not_found'
1134
    assert validity_info.invalid_since is not None
1135

  
1099 1136

  
1100 1137
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1101 1138
def test_cards_cell_load(mock_send):
......
1113 1150
    cell = cells[0]
1114 1151
    assert cell.cached_title == 'Card Model 1'
1115 1152

  
1153
    cell.carddef_reference = 'default:card_model_1:foo'
1154
    cell.save()
1155
    site_export = [page.get_serialized_page()]
1156
    cell.delete()
1157
    assert not Page.objects.get(pk=page.pk).get_cells()
1158
    Page.load_serialized_pages(site_export)
1159
    page = Page.objects.get(slug='test_cards')
1160
    cells = page.get_cells()
1161
    assert len(cells) == 1
1162
    cell = cells[0]
1163
    assert cell.cached_title == 'Card Model 1 - bar'
1164

  
1116 1165

  
1117 1166
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1118 1167
def test_cards_cell_render(mock_send, context):
......
1143 1192
    assert '<a href="/foo/12"><span class="card-title">bb</span></a>' in result
1144 1193
    assert '<a href="/foo/13"><span class="card-title">cc</span></a>' in result
1145 1194

  
1195
    cell.carddef_reference = u'default:card_model_1:foo'
1196
    cell.save()
1197

  
1198
    result = cell.render(context)
1199
    assert '<h2>Card Model 1 - bar</h2>' in result
1200
    assert '<a href="/foo/11"><span class="card-title">aa</span></a>' in result
1201
    assert '<a href="/foo/12"><span class="card-title">bb</span></a>' in result
1202
    assert '<a href="/foo/13"><span class="card-title">cc</span></a>' not in result
1203

  
1204

  
1205
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1206
def test_card_cell_setup(mock_send):
1207
    cell = WcsCardInfosCell()
1208
    form_class = cell.get_default_form_class()
1209
    form = form_class()
1210
    assert form.fields['carddef_reference'].widget.choices == [
1211
        ('default:card_model_1', 'test : Card Model 1'),
1212
        ('default:card_model_2', 'test : Card Model 2'),
1213
        ('default:card_model_3', 'test : Card Model 3'),
1214
        ('other:card_model_1', 'test2 : Card Model 1'),
1215
        ('other:card_model_2', 'test2 : Card Model 2'),
1216
        ('other:card_model_3', 'test2 : Card Model 3'),
1217
    ]
1218

  
1146 1219

  
1147 1220
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1148 1221
def test_card_cell_save_cache(mock_send):
1149
    page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
1222
    page = Page.objects.create(title='xxx', slug='test_card_cell_save_cache', template_name='standard')
1150 1223
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
1151 1224
    assert cell.get_additional_label() is None
1152 1225
    cell.carddef_reference = 'default:card_model_1'
1153
-