applications: page dependencies to card models (#86520)

This commit is contained in:
Lauréline Guérin 2024-02-05 14:36:10 +01:00
parent 81b27151a3
commit 7e43932262
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 65 additions and 24 deletions

View File

@ -46,6 +46,7 @@ from combo.utils.requests_wrapper import WaitForCacheException
from .utils import (
get_matching_pages_from_card_slug,
get_wcs_dependencies_from_template,
get_wcs_dependency_from_carddef_reference,
get_wcs_json,
get_wcs_matching_card_model,
get_wcs_services,
@ -1081,15 +1082,7 @@ class WcsCardCell(CardMixin, CellBase):
def get_dependencies(self):
yield from super().get_dependencies()
if self.carddef_reference:
parts = self.carddef_reference.split(':')
wcs_key, card_slug = parts[:2]
wcs_site_url = get_wcs_services().get(wcs_key)['url']
urls = {
'export': f'{wcs_site_url}api/export-import/cards/{card_slug}/',
'dependencies': f'{wcs_site_url}api/export-import/cards/{card_slug}/dependencies/',
'redirect': f'{wcs_site_url}api/export-import/cards/{card_slug}/redirect/',
}
yield {'type': 'cards', 'id': card_slug, 'text': self.cached_title, 'urls': urls}
yield get_wcs_dependency_from_carddef_reference(self.carddef_reference, self.cached_title)
yield from get_wcs_dependencies_from_template(self.card_ids)
for cell in self.get_custom_schema().get('cells') or []:
for value in cell.values():

View File

@ -74,7 +74,7 @@ def get_wcs_json(wcs_site, path, log_errors=True):
return response.json()
def get_wcs_options(url, include_category_slug=False, include_custom_views=False):
def get_wcs_options(url, include_category_slug=False, include_custom_views=False, with_site_title=True):
references = []
for wcs_key, wcs_site in sorted(get_wcs_services().items(), key=lambda x: x[1]['title']):
site_title = wcs_site.get('title')
@ -87,7 +87,7 @@ def get_wcs_options(url, include_category_slug=False, include_custom_views=False
for element in response_json:
slug = element.get('slug')
title = element.get('title')
if len(get_wcs_services()) == 1:
if len(get_wcs_services()) == 1 or not with_site_title:
label = title
else:
label = '%s : %s' % (site_title, title)
@ -121,14 +121,23 @@ def get_matching_pages_from_card_slug(card_slug, order=True):
return Page.get_as_reordered_flat_hierarchy(matching_pages)
def get_wcs_matching_card_model(sub_slug):
card_models = get_wcs_options('/api/cards/@list')
def get_wcs_matching_card_model(sub_slug, with_site_title=True):
card_models = get_wcs_options('/api/cards/@list', with_site_title=with_site_title)
for carddef_reference, card_label in card_models:
card_id = '%s_id' % carddef_reference.split(':')[1]
if '<%s>' % card_id in sub_slug or sub_slug == card_id:
return carddef_reference, card_label
def get_card_dependency(carddef_slug, carddef_title, wcs_url):
urls = {
'export': f'{wcs_url}api/export-import/cards/{carddef_slug}/',
'dependencies': f'{wcs_url}api/export-import/cards/{carddef_slug}/dependencies/',
'redirect': f'{wcs_url}api/export-import/cards/{carddef_slug}/redirect/',
}
return {'type': 'cards', 'id': carddef_slug, 'text': carddef_title, 'urls': urls}
def get_wcs_dependencies_from_template(string):
if not is_wcs_enabled(None):
return []
@ -147,13 +156,11 @@ def get_wcs_dependencies_from_template(string):
if carddef_slug not in carddef_labels_by_slug:
# ignore unknown card model
continue
yield {
'type': 'cards',
'id': carddef_slug,
'text': carddef_labels_by_slug[carddef_slug],
'urls': {
'export': f'{wcs_url}api/export-import/cards/{carddef_slug}/',
'dependencies': f'{wcs_url}api/export-import/cards/{carddef_slug}/dependencies/',
'redirect': f'{wcs_url}api/export-import/cards/{carddef_slug}/redirect/',
},
}
yield get_card_dependency(carddef_slug, carddef_labels_by_slug[carddef_slug], wcs_url)
def get_wcs_dependency_from_carddef_reference(carddef_reference, carddef_title):
parts = carddef_reference.split(':')
wcs_key, carddef_slug = parts[:2]
wcs_site_url = get_wcs_services().get(wcs_key)['url']
return get_card_dependency(carddef_slug, carddef_title, wcs_site_url)

View File

@ -69,7 +69,12 @@ from django.utils.translation import gettext_lazy as _
from combo import utils
from combo.apps.export_import.models import Application
from combo.apps.wcs.utils import get_wcs_matching_card_model, is_wcs_enabled
from combo.apps.wcs.utils import (
get_wcs_dependencies_from_template,
get_wcs_dependency_from_carddef_reference,
get_wcs_matching_card_model,
is_wcs_enabled,
)
from combo.utils import NothingInCacheException
from .exceptions import ImportSiteError, PostException
@ -395,6 +400,12 @@ class Page(models.Model):
yield self.edit_role
yield self.subpages_edit_role
yield from self.groups.all()
for value in self.extra_variables.values():
yield from get_wcs_dependencies_from_template(value)
if self.sub_slug:
result = get_wcs_matching_card_model(self.sub_slug, with_site_title=False)
if result:
yield get_wcs_dependency_from_carddef_reference(*result)
for cell in self.get_cells(prefetch_validity_info=True):
validity_info = cell.get_validity_info()
if validity_info is not None:

View File

@ -563,6 +563,36 @@ def test_bundle_check(app, john_doe):
}
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_page_dependencies_card_models(mock_send):
page = Page.objects.create(
title='Test',
slug='test',
template_name='standard',
extra_variables={'var1': '{{ cards|objects:"card_model_1"|getlist:"id"|list }}'},
)
card_dep = {
'type': 'cards',
'id': 'card_model_1',
'text': 'Card Model 1',
'urls': {
'export': 'http://127.0.0.1:8999/api/export-import/cards/card_model_1/',
'dependencies': 'http://127.0.0.1:8999/api/export-import/cards/card_model_1/dependencies/',
'redirect': 'http://127.0.0.1:8999/api/export-import/cards/card_model_1/redirect/',
},
}
assert card_dep in page.get_dependencies()
page.extra_variables = {}
page.sub_slug = 'foo'
page.save()
assert card_dep not in page.get_dependencies()
page.sub_slug = 'card_model_1_id'
page.save()
assert card_dep in page.get_dependencies()
def test_page_dependencies_link_cell():
page1 = Page.objects.create(title='Test', slug='test', template_name='standard')
page2 = Page.objects.create(title='Other page', slug='other', template_name='standard')