0001-wcs-cards-custom-views-46865.patch
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 |
- |