misc: make card linked to page update page title (#74073) #201

Merged
fpeters merged 1 commits from wip/74073-card-page-title into main 2023-12-18 13:20:07 +01:00
5 changed files with 68 additions and 5 deletions

View File

@ -1683,6 +1683,21 @@ class WcsCardCell(CardMixin, CellBase):
}
)
if not (self.related_card_path or self.card_ids) and (
card_data.get('digest') or card_data.get('digests')
):
# card linked to page, set attribute to have card title in page <title>
page_title_from_cell = card_data.get('digest')
Review

Dans le cas qui nous intéresse, page liée à un modèle de fiche, on cherche un titre (soit le digest, général, soit digests['default'], soit digests['custom-view:XXX']).

Dans le cas qui nous intéresse, page liée à un modèle de fiche, on cherche un titre (soit le digest, général, soit digests['default'], soit digests['custom-view:XXX']).
if card_data.get('digests', {}).get('default'):
page_title_from_cell = card_data['digests']['default']
parts = self.carddef_reference.split(':')
if len(parts) == 3:
digest_name = f'custom-view:{parts[-1]}'
if card_data.get('digests', {}).get(digest_name):
page_title_from_cell = card_data['digests'][digest_name]
if page_title_from_cell:
custom_context['request'].page_title_from_cell = page_title_from_cell
Review

C'est plutôt moche pour transporter l'information tout du long l'endroit facile c'est l'objet request.

C'est plutôt moche pour transporter l'information tout du long l'endroit facile c'est l'objet request.
def set_data_from_repeated_cell(self, cell, context):
if not hasattr(cell, '_cards_data'):
cell._cards_data = None

View File

@ -22,7 +22,7 @@ function combo_load_cell(elem) {
async: true,
dataType: 'html',
crossDomain: true,
success: function(data) {
success: function(data, text_status, xhr) {
if (data == 'retry') {
setTimeout(
function() {
@ -31,6 +31,13 @@ function combo_load_cell(elem) {
1000)
return;
}
var page_title = xhr.getResponseHeader('X-Page-Title');
if (page_title) {
if (document.original_title === undefined) {
document.original_title = document.title
}
document.title = page_title + ' | ' + document.original_title;
Review

en js, on met à jour.

en js, on met à jour.
}
$elem.addClass('ajax-loaded');
$elem.find('> div').nextAll().remove();
if (data == '') {

View File

@ -37,7 +37,7 @@ from django.http import (
HttpResponseRedirect,
)
from django.shortcuts import render, resolve_url
from django.template import engines
from django.template import engines, loader
from django.template.loader import TemplateDoesNotExist, get_template
from django.utils import lorem_ipsum, timezone, translation
from django.utils.encoding import force_str
@ -198,8 +198,12 @@ def render_cell(request, cell):
# Cell can pass data through its own __dict__
cell.modify_global_context(context, request)
template = engines['django'].from_string('{% render_cell cell %}')
return HttpResponse(template.render(context, request), content_type='text/html')
response_content = engines['django'].from_string('{% render_cell cell %}').render(context, request)
response = HttpResponse(response_content, content_type='text/html')
if hasattr(request, 'page_title_from_cell'):
# cell request a change to page title, pass info in response header
response.headers['X-Page-Title'] = request.page_title_from_cell
Review

Lors du rendu ajax de la cellule, on met l'info dans un entête custom.

Lors du rendu ajax de la cellule, on met l'info dans un entête custom.
return response
def extend_with_parent_cells(cells, hierarchy):
@ -615,7 +619,11 @@ def publish_page(request, page, status=200, template_name=None):
except TemplateDoesNotExist:
template_name = settings.COMBO_PUBLIC_TEMPLATES['standard'].get('template')
return render(request, template_name, ctx, status=status)
response_content = loader.render_to_string(template_name, ctx, request)
if hasattr(request, 'page_title_from_cell'):
# a synchronous cell requested a change to page <title>, do it.
response_content = response_content.replace('<title>', f'<title>{request.page_title_from_cell} | ', 1)
Review

Pour le cas du rendu synchrone, on va modifier direct le <title>.

En passant je note que la manière dont c'est affiché se base sur ce qu'on a aujourd'hui dans publik-base-theme, à savoir "titre de page | titre de site" (i.e. | comme séparateur, le plus spécifique à gauche).

Pour le cas du rendu synchrone, on va modifier direct le `<title>`. En passant je note que la manière dont c'est affiché se base sur ce qu'on a aujourd'hui dans publik-base-theme, à savoir "titre de page | titre de site" (i.e. | comme séparateur, le plus spécifique à gauche).
return HttpResponse(response_content, status=status)
def error404(request, *args, **kwargs):

View File

@ -1914,6 +1914,37 @@ def test_card_cell_card_mode_render(mock_send, context, app):
# nothing, hide cell
assert not result.strip()
# link page to model
page.slug = 'plop'
page.sub_slug = '(?P<card_model_1_id>[a-z0-9]+)'
page.save()
cell.related_card_path = ''
cell.carddef_reference = 'default:card_model_1'
cell.card_ids = ''
cell.save()
resp = app.get(page.get_online_url() + '11/')
cell_resp = app.get(
resp.pyquery('.wcs-card-cell').attr['data-ajax-cell-url']
+ '?ctx='
+ resp.pyquery('.wcs-card-cell').attr['data-extra-context']
)
assert cell_resp.headers['X-Page-Title'] == 'a a a'
cell.carddef_reference = 'default:card_model_1:foo'
cell.save()
resp = app.get(page.get_online_url() + '11/')
cell_resp = app.get(
resp.pyquery('.wcs-card-cell').attr['data-ajax-cell-url']
+ '?ctx='
+ resp.pyquery('.wcs-card-cell').attr['data-extra-context']
)
assert cell_resp.headers['X-Page-Title'] == 'afoo afoo afoo'
# sync rendering
resp = app.get(page.get_online_url() + '11/', headers={'User-Agent': 'testbot'})
assert resp.pyquery('title').text() == 'afoo afoo afoo | Combo - xxx'
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_card_mode_render_text_field(mock_send, context):

View File

@ -108,6 +108,7 @@ WCS_CARDS_DATA = {
'display_id': '10-11',
'display_name': 'Card Model 1 - n°10-11',
'digest': 'a a a',
'digests': {'default': 'a a a', 'custom-view:foo': 'afoo afoo afoo'},
'text': 'aa',
'receipt_time': '2021-11-29T14:33:37',
'last_update_time': '2023-07-24T16:04:24',
@ -264,6 +265,7 @@ WCS_CARDS_CUSTOM_VIEW_DATA = [
'display_id': '10-11',
'display_name': 'Card Model 1 - n°10-11',
'digest': 'a a a',
'digests': {'default': 'a a a', 'custom-view:foo': 'afoo afoo afoo'},
'text': 'aa',
'url': '/backoffice/data/card_model_1/11/',
},