misc: make card linked to page update page title (#74073) #201
|
@ -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')
|
||||
|
||||
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
|
||||
fpeters
commented
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
|
||||
|
|
|
@ -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;
|
||||
fpeters
commented
en js, on met à jour. en js, on met à jour.
|
||||
}
|
||||
$elem.addClass('ajax-loaded');
|
||||
$elem.find('> div').nextAll().remove();
|
||||
if (data == '') {
|
||||
|
|
|
@ -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
|
||||
fpeters
commented
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)
|
||||
fpeters
commented
Pour le cas du rendu synchrone, on va modifier direct le 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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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/',
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue
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']).