search: export/import with target_page configured on card engine (#68606)
This commit is contained in:
parent
b7b73533b7
commit
c44808a83c
|
@ -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
|
||||
|
|
|
@ -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'] == ''
|
||||
|
|
Loading…
Reference in New Issue