applications: card cell dependencies to card models (#86520)
This commit is contained in:
parent
057c8f49a0
commit
f74e768a11
|
@ -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():
|
||||
|
|
|
@ -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/',
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue