search: export/import with target_page configured on card engine (#68606)
gitea-wip/combo/pipeline/head There was a failure building this commit Details
gitea/combo/pipeline/head Something is wrong with the build of this commit Details

This commit is contained in:
Lauréline Guérin 2022-09-01 15:53:04 +02:00
parent b7b73533b7
commit c44808a83c
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 84 additions and 0 deletions

View File

@ -149,6 +149,29 @@ class SearchCell(CellBase):
if search_service in (cell._search_services.get('data') or []):
yield cell
def get_serialized_cell(self):
serialized_cell = super().get_serialized_cell()
for options in (serialized_cell['fields']['_search_services'].get('options') or {}).values():
if options.get('target_page') not in ['', None]:
try:
target_page = Page.objects.get(pk=options['target_page'])
options['target_page'] = target_page.natural_key()[0]
except Page.DoesNotExist:
options['target_page'] = ''
return serialized_cell
@classmethod
def prepare_serialized_data(cls, cell_data):
if not cell_data['fields'].get('_search_services'):
return cell_data
if not cell_data['fields']['_search_services'].get('options'):
return cell_data
for options in cell_data['fields']['_search_services']['options'].values():
if options.get('target_page'):
page_slug = options['target_page'].strip('/').split('/')[-1]
options['target_page'] = Page.get_page_ids_by_slugs().get(page_slug) or ''
return cell_data
def modify_global_context(self, context, request):
# if self.varname is in the query string (of the page),
# add it to the global context; so it can be used by others cells

View File

@ -1,12 +1,15 @@
import datetime
import json
import os
import sys
from io import StringIO
from unittest import mock
import pytest
from django.conf import settings
from django.contrib.auth.models import AnonymousUser, Group, User
from django.contrib.contenttypes.models import ContentType
from django.core.management import call_command
from django.db import connection
from django.test import override_settings
from django.test.client import RequestFactory
@ -21,6 +24,7 @@ from combo.apps.search.engines import engines
from combo.apps.search.models import IndexedCell, SearchCell
from combo.apps.search.utils import index_site, search_site
from combo.data.models import JsonCell, LinkCell, LinkListCell, MenuCell, Page, PageSnapshot, TextCell
from combo.data.utils import import_site
from .test_manager import login
@ -1621,3 +1625,60 @@ def test_search_same_link_multiple_pages(settings, app):
assert resp.text.count('<li') == 0
resp = app.get('/ajax/search/%s/_text_page_two/?q=barfoo' % cell.pk, status=200)
assert resp.text.count('<li') == 1
def get_output_of_command(command, *args, **kwargs):
old_stdout = sys.stdout
output = sys.stdout = StringIO()
call_command(command, format_json=True, *args, **kwargs)
sys.stdout = old_stdout
return output.getvalue()
def test_test_export_import_search_cell_with_target_page():
root_page = Page.objects.create(title='Root', slug='root', template_name='standard')
card_page = Page.objects.create(slug='card', title='Bar', sub_slug='card-bar_id', parent=root_page)
page = Page.objects.create(title='xxx', template_name='standard')
search_services = {
'data': ['cards:c21f969b:card-bar'],
'options': {'cards:c21f969b:card-bar': {'target_page': card_page.pk}},
}
SearchCell.objects.create(page=page, placeholder='content', _search_services=search_services, order=1)
site_export = get_output_of_command('export_site')
site_data = json.loads(site_export)
assert len(site_data['pages']) == 3
assert (
site_data['pages'][-1]['cells'][0]['fields']['_search_services']['options'][
'cards:c21f969b:card-bar'
]['target_page']
== 'root/card'
)
import_site(data={}, clean=True)
assert Page.objects.all().count() == 0
import_site(data=site_data, clean=True)
new_card_page = Page.objects.get(slug='card')
new_cell = SearchCell.objects.get()
assert new_cell._search_services['options']['cards:c21f969b:card-bar']['target_page'] == new_card_page.pk
# unknown target page
new_cell._search_services['options']['cards:c21f969b:card-bar']['target_page'] = 0
new_cell.save()
site_export = get_output_of_command('export_site')
site_data = json.loads(site_export)
assert (
site_data['pages'][-1]['cells'][0]['fields']['_search_services']['options'][
'cards:c21f969b:card-bar'
]['target_page']
== ''
)
site_data['pages'][-1]['cells'][0]['fields']['_search_services']['options']['cards:c21f969b:card-bar'][
'target_page'
] = 'unknown'
import_site(data=site_data, clean=True)
new_card_page = Page.objects.get(slug='card')
new_cell = SearchCell.objects.get()
assert new_cell._search_services['options']['cards:c21f969b:card-bar']['target_page'] == ''