wcs: use internal_id for links to cards (#87119)
gitea/combo/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-02-22 10:38:28 +01:00
parent 03361bfbb9
commit 3e09731bd8
3 changed files with 95 additions and 19 deletions

View File

@ -20,7 +20,7 @@
{% if custom_schema %}
{% include "combo/wcs/cards-field.html" with item=custom_schema.cells.0 ul_display=True %}
{% else %}
<a href="{% if card_page_base_url %}{{ card_page_base_url }}{{ card.id }}/{% else %}{{ card.url }}{% endif %}"><span class="card-title">{{ card.text }}</span></a>
<a href="{% if card_page_base_url %}{{ card_page_base_url }}{{ card.internal_id }}/{% else %}{{ card.url }}{% endif %}"><span class="card-title">{{ card.text }}</span></a>
{% endif %}
{% endspaceless %}
</li>

View File

@ -1376,6 +1376,55 @@ def test_card_cell_table_list_mode_render_all_cards(mock_send, nocache, app, dis
assert 'filter-internal-id' not in mock_send.call_args_list[0][0][0].url
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_list_mode_render_all_cards_custom_id(mock_send, nocache, app):
page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
cell = WcsCardCell.objects.create(
page=page,
placeholder='content',
order=0,
display_mode='list',
carddef_reference='default:card_with_custom_id',
related_card_path='__all__',
)
cell_url = reverse(
'combo-public-ajax-page-cell',
kwargs={'page_pk': page.pk, 'cell_reference': cell.get_reference()},
)
# check url called
mock_send.reset_mock()
resp = app.get(page.get_online_url())
assert len(resp.context['cells']) == 1
extra_ctx = re.findall(r'data-extra-context="(.*)"', resp.text)
app.get(cell_url + '?ctx=' + extra_ctx[0])
assert len(mock_send.call_args_list) == 1
# cell rendering
assert '/api/cards/card_with_custom_id/list' in mock_send.call_args_list[0][0][0].url
assert 'filter-internal-id' not in mock_send.call_args_list[0][0][0].url
cell_div = resp.pyquery('.wcs-card-cell')[0]
cell_url = cell_div.attrib['data-ajax-cell-url']
extra_ctx = cell_div.attrib['data-extra-context']
resp = app.get(cell_url + '?ctx=' + extra_ctx)
assert [(PyQuery(x).text(), x.attrib['href']) for x in resp.pyquery('li a')] == [
('foo', 'http://127.0.0.1:8999/backoffice/data/card_with_custom_id/42/'),
('bar', 'http://127.0.0.1:8999/backoffice/data/card_with_custom_id/44/'),
]
# add a combo page for card
card_page = Page.objects.create(title='card', slug='card', template_name='standard')
card_page.sub_slug = '(?P<card_with_custom_id_id>[a-z0-9]+)'
card_page.save()
resp = app.get(cell_url + '?ctx=' + extra_ctx)
assert [(PyQuery(x).text(), x.attrib['href']) for x in resp.pyquery('li a')] == [
('foo', '/card/42/'),
('bar', '/card/44/'),
]
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
@pytest.mark.parametrize('display_mode', ['table', 'list'])
def test_card_cell_table_list_mode_render_identifier(mock_send, nocache, app, display_mode):

View File

@ -104,7 +104,8 @@ WCS_CARDDEFS_DATA = [
WCS_CARDS_DATA = {
'card_model_1': [
{
'id': 11,
'id': '11',
'internal_id': '11',
'display_id': '10-11',
'display_name': 'Card Model 1 - n°10-11',
'digest': 'a a a',
@ -156,7 +157,8 @@ WCS_CARDS_DATA = {
},
},
{
'id': 12,
'id': '12',
'internal_id': '12',
'display_id': '10-12',
'display_name': 'Card Model 1 - n°10-12',
'digest': 'b b b',
@ -178,7 +180,8 @@ WCS_CARDS_DATA = {
},
},
{
'id': 13,
'id': '13',
'internal_id': '13',
'display_id': '10-13',
'display_name': 'Card Model 1 - n°10-13',
'digest': 'c c c',
@ -195,7 +198,8 @@ WCS_CARDS_DATA = {
],
'card_a': [
{
'id': 1,
'id': '1',
'internal_id': '1',
'fields': {
'cardb_raw': 1,
'cardsb_raw': [2, 3],
@ -210,7 +214,8 @@ WCS_CARDS_DATA = {
},
},
{
'id': 2,
'id': '2',
'internal_id': '2',
'fields': {
'cardb_raw': 1,
'cardsb_raw': [2, 3],
@ -219,14 +224,16 @@ WCS_CARDS_DATA = {
},
},
{
'id': 3,
'id': '3',
'internal_id': '3',
'fields': {
# some missing fields
'blockb_raw': [{}],
},
},
{
'id': 4,
'id': '4',
'internal_id': '4',
'fields': {
# some empty fields
'cardb_raw': None,
@ -236,10 +243,11 @@ WCS_CARDS_DATA = {
},
},
],
'card_b': [{'id': i, 'fields': {}} for i in range(1, 12) if i != 6],
'card_b': [{'id': str(i), 'internal_id': str(i), 'fields': {}} for i in range(1, 12) if i != 6],
'card_c': [
{
'id': 6,
'id': '6',
'internal_id': '6',
'fields': {
'cardb_raw': 7,
'cardsb_raw': [8, 9],
@ -247,25 +255,43 @@ WCS_CARDS_DATA = {
},
},
{
'id': 7,
'id': '7',
'internal_id': '7',
'fields': {},
},
],
'card_f': [
{'id': 41, 'fields': {'cardh_raw': 42}},
{'id': '41', 'internal_id': '41', 'fields': {'cardh_raw': 42}},
],
'card_g': [
{'id': 43, 'fields': {'cardh_raw': 44}},
{'id': '43', 'internal_id': '43', 'fields': {'cardh_raw': 44}},
],
'card_h': [
{'id': 42, 'fields': {}},
{'id': 44, 'fields': {}},
{'id': '42', 'internal_id': '42', 'fields': {}},
{'id': '44', 'internal_id': '44', 'fields': {}},
],
'card_with_custom_id': [
{
'id': 'foo',
'internal_id': '42',
'text': 'foo',
'url': '/backoffice/data/card_with_custom_id/42/',
'fields': {},
},
{
'id': 'bar',
'internal_id': '44',
'text': 'bar',
'url': '/backoffice/data/card_with_custom_id/44/',
'fields': {},
},
],
}
WCS_CARDS_CUSTOM_VIEW_DATA = [
{
'id': 11,
'id': '11',
'internal_id': '11',
'display_id': '10-11',
'display_name': 'Card Model 1 - n°10-11',
'digest': 'a a a',
@ -274,7 +300,8 @@ WCS_CARDS_CUSTOM_VIEW_DATA = [
'url': '/backoffice/data/card_model_1/11/',
},
{
'id': 12,
'id': '12',
'internal_id': '12',
'display_id': '10-12',
'display_name': 'Card Model 1 - n°10-12',
'digest': 'b b b',
@ -614,13 +641,13 @@ def get_data_from_url(url):
m_card = re.match(r'/api/cards/([a-z0-9_]+)/(\d+)/', url)
if m_card:
try:
return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == int(m_card.group(2))][0]
return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == m_card.group(2)][0]
except IndexError:
return {}
m_card = re.match(r'/api/cards/([a-z0-9_]+)/([a-z0-9_]+)/(\d+)/', url) # model/custom-view/id
if m_card:
try:
return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == int(m_card.group(3))][0]
return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == m_card.group(3)][0]
except IndexError:
return {}
if 'api/cards/card_model_1/list/foo' in url: