applications: card cell dependencies to card models (#86520)

This commit is contained in:
Lauréline Guérin 2024-02-05 13:52:42 +01:00
parent 057c8f49a0
commit f74e768a11
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 79 additions and 22 deletions

View File

@ -45,6 +45,7 @@ from combo.utils.requests_wrapper import WaitForCacheException
from .utils import (
get_matching_pages_from_card_slug,
get_wcs_dependencies_from_template,
get_wcs_json,
get_wcs_matching_card_model,
get_wcs_services,
@ -1089,6 +1090,12 @@ class WcsCardCell(CardMixin, CellBase):
'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 from get_wcs_dependencies_from_template(self.card_ids)
for cell in self.get_custom_schema().get('cells') or []:
for value in cell.values():
if not value:
continue
yield from get_wcs_dependencies_from_template(str(value))
def check_validity(self):
if self.get_related_card_path():

View File

@ -15,13 +15,19 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import re
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from requests.exceptions import RequestException
from combo.utils import requests
class WCSError(Exception):
pass
def is_wcs_enabled(cls):
return hasattr(settings, 'KNOWN_SERVICES') and settings.KNOWN_SERVICES.get('wcs')
@ -32,6 +38,17 @@ def get_wcs_services():
return settings.KNOWN_SERVICES.get('wcs')
def get_default_wcs_service_key():
services = get_wcs_services()
for key, service in services.items():
if not service.get('secondary', False):
# if secondary is not set or not set to True, return this one
return key
return None
def get_wcs_json(wcs_site, path, log_errors=True):
if wcs_site is None:
# no site specified (probably an import referencing a not yet deployed
@ -110,3 +127,33 @@ def get_wcs_matching_card_model(sub_slug):
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_wcs_dependencies_from_template(string):
if not is_wcs_enabled(None):
return []
service_key = get_default_wcs_service_key()
wcs = get_wcs_services().get(service_key)
wcs_url = wcs.get('url') or ''
response_json = get_wcs_json(wcs, '/api/cards/@list')
if response_json.get('err') == 1:
raise WCSError(_('Unable to get WCS service (%s)') % response_json.get('err_desc'))
if not response_json.get('data'):
raise WCSError(_('Unable to get WCS data'))
carddef_labels_by_slug = {e['slug']: e['title'] for e in response_json['data']}
for carddef_slug in re.findall(r'cards\|objects:"([\w_-]+:?[\w_-]*)"', string):
if ':' in carddef_slug:
carddef_slug = carddef_slug.split(':')[0]
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/',
},
}

View File

@ -622,7 +622,7 @@ def test_page_dependencies_card_cell(mock_send):
page = Page.objects.create(title='Test', slug='test', template_name='standard')
cell = WcsCardCell(page=page, placeholder='content', order=0, carddef_reference='default:card_model_1')
cell.save()
assert {
card_dep = {
'type': 'cards',
'id': 'card_model_1',
'text': 'Card Model 1',
@ -631,32 +631,35 @@ def test_page_dependencies_card_cell(mock_send):
'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/',
},
} in page.get_dependencies()
}
assert card_dep in page.get_dependencies()
cell.carddef_reference = 'default:card_model_1:custom_view'
cell.save()
assert {
'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/',
},
} in page.get_dependencies()
assert card_dep in page.get_dependencies()
cell.mark_as_invalid(reason_code='foobar')
assert {
'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/',
},
} not in page.get_dependencies()
assert card_dep not in page.get_dependencies()
cell.mark_as_valid()
cell.carddef_reference = 'default:card_model_2'
cell.card_ids = '{{ cards|objects:"card_model_1"|getlist:"id"|join:"," }}'
cell.save()
assert card_dep in page.get_dependencies()
cell.mark_as_invalid(reason_code='foobar')
assert card_dep not in page.get_dependencies()
cell.mark_as_valid()
cell.card_ids = ''
cell.custom_schema = {
'cells': [
{'varname': '@custom@', 'template': '{{ cards|objects:"card_model_1" }}'},
]
}
cell.save()
assert card_dep in page.get_dependencies()
cell.mark_as_invalid(reason_code='foobar')
assert card_dep not in page.get_dependencies()
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)