wcs: mark cell as invalid if wcs_site is unknown (#56200)
gitea-wip/combo/pipeline/head There was a failure building this commit Details
gitea/combo/pipeline/head Build started... Details

This commit is contained in:
Lauréline Guérin 2021-08-19 10:20:20 +02:00
parent be732f5c9c
commit d77af71764
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 129 additions and 7 deletions

View File

@ -43,6 +43,7 @@ invalid_reason_codes = {
'wcs_card_not_found': _('Invalid card model'),
'wcs_category_not_defined': _('No category set'),
'wcs_category_not_found': _('Invalid category'),
'wcs_site_not_found': _('Invalid site'),
'wcs_data_failure': _('Failed to get data'),
}
@ -131,7 +132,7 @@ class WcsFormCell(CellBase):
context['description'] = mark_safe(self.cached_json.get('description', ''))
context['css_classes'] = get_formdef_css_classes(self.cached_json)
for attribute in self.cached_json:
if not attribute in context:
if attribute not in context:
context[attribute] = self.cached_json.get(attribute)
return context
@ -408,8 +409,12 @@ class WcsUserDataBaseCell(WcsDataBaseCell):
return super().is_visible(**kwargs)
class CategoriesValidityMixin:
class CategoriesAndWcsSiteValidityMixin:
def check_validity(self):
if self.wcs_site and self.wcs_site not in get_wcs_services():
self.mark_as_invalid('wcs_site_not_found')
return
categories = self.categories.get('data', [])
if not categories:
@ -452,7 +457,7 @@ class CategoriesFilteringMixin:
@register_cell_class
class WcsCurrentFormsCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsUserDataBaseCell):
class WcsCurrentFormsCell(CategoriesAndWcsSiteValidityMixin, CategoriesFilteringMixin, WcsUserDataBaseCell):
variable_name = 'user_forms'
loading_message = _('Loading forms...')
@ -537,7 +542,7 @@ class WcsCurrentFormsCell(CategoriesValidityMixin, CategoriesFilteringMixin, Wcs
@register_cell_class
class WcsCurrentDraftsCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsUserDataBaseCell):
class WcsCurrentDraftsCell(CategoriesAndWcsSiteValidityMixin, CategoriesFilteringMixin, WcsUserDataBaseCell):
variable_name = 'current_drafts'
default_template_name = 'combo/wcs/current_drafts.html'
loading_message = _('Loading drafts...')
@ -652,7 +657,7 @@ class WcsFormsOfCategoryCell(WcsCommonCategoryCell, WcsBlurpMixin):
extra_context['description'] = self.cached_description
try:
extra_context['forms'] = list(extra_context['forms'][self.wcs_site]['data'])
except (KeyError, TypeError) as e:
except (KeyError, TypeError):
# an error occured when getting the data
extra_context['forms'] = []
@ -700,7 +705,7 @@ class WcsFormsOfCategoryCell(WcsCommonCategoryCell, WcsBlurpMixin):
@register_cell_class
class WcsCareFormsCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsDataBaseCell):
class WcsCareFormsCell(CategoriesAndWcsSiteValidityMixin, CategoriesFilteringMixin, WcsDataBaseCell):
categories = JSONField(_('Categories'), blank=True, default=dict)
api_url = '/api/forms/?limit=10'
@ -743,6 +748,13 @@ class CategoriesCell(WcsDataBaseCell):
class Meta:
verbose_name = _('Form Categories')
def check_validity(self):
if self.wcs_site and self.wcs_site not in get_wcs_services():
self.mark_as_invalid('wcs_site_not_found')
return
self.mark_as_valid()
class CardMixin:
invalid_reason_codes = invalid_reason_codes
@ -1007,6 +1019,13 @@ class TrackingCodeInputCell(CellBase):
class Meta:
verbose_name = _('Tracking Code Input')
def check_validity(self):
if self.wcs_site and self.wcs_site not in get_wcs_services():
self.mark_as_invalid('wcs_site_not_found')
return
self.mark_as_valid()
def get_default_form_class(self):
if len(get_wcs_services()) == 1:
return None
@ -1026,7 +1045,7 @@ class TrackingCodeInputCell(CellBase):
@register_cell_class
class BackofficeSubmissionCell(CategoriesValidityMixin, CategoriesFilteringMixin, WcsDataBaseCell):
class BackofficeSubmissionCell(CategoriesAndWcsSiteValidityMixin, CategoriesFilteringMixin, WcsDataBaseCell):
api_url = '/api/formdefs/?backoffice-submission=on'
variable_name = 'all_formdefs'
default_template_name = 'combo/wcs/backoffice_submission.html'

View File

@ -23,6 +23,7 @@ from combo.apps.search.utils import index_site, search_site
from combo.apps.wcs.context_processors import Cards
from combo.apps.wcs.models import (
BackofficeSubmissionCell,
CategoriesCell,
TrackingCodeInputCell,
WcsCardInfosCell,
WcsCardsCell,
@ -431,6 +432,26 @@ def test_category_cell_validity(mock_send):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_categories_cell_check_validity(mock_send):
page = Page.objects.create(title='xxx', slug='test', template_name='standard')
cell = CategoriesCell.objects.create(page=page, placeholder='content', order=0)
# invalid wcs_site
cell.wcs_site = 'invalid'
cell.save()
cell.check_validity()
validity_info = ValidityInfo.objects.latest('pk')
assert validity_info.invalid_reason_code == 'wcs_site_not_found'
assert validity_info.invalid_since is not None
# valid wcs_site
cell.wcs_site = 'default'
cell.save()
cell.check_validity()
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_form_cell_render(mock_send):
page = Page(title='xxx', slug='test_form_cell_render', template_name='standard')
@ -698,6 +719,21 @@ def test_current_forms_cell_check_validity(mock_send, context):
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
assert validity_info.invalid_since is not None
# invalid wcs_site
cell.categories = {'data': ['default:test-3', 'default:test-9']}
cell.wcs_site = 'invalid'
cell.save()
cell.check_validity()
validity_info = ValidityInfo.objects.latest('pk')
assert validity_info.invalid_reason_code == 'wcs_site_not_found'
assert validity_info.invalid_since is not None
# valid wcs_site
cell.wcs_site = 'default'
cell.save()
cell.check_validity()
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_current_forms_cell_render_single_site(mock_send, context):
@ -929,6 +965,21 @@ def test_care_forms_cell_check_validity(mock_send, context):
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
assert validity_info.invalid_since is not None
# invalid wcs_site
cell.categories = {'data': ['default:test-3', 'default:test-9']}
cell.wcs_site = 'invalid'
cell.save()
cell.check_validity()
validity_info = ValidityInfo.objects.latest('pk')
assert validity_info.invalid_reason_code == 'wcs_site_not_found'
assert validity_info.invalid_since is not None
# valid wcs_site
cell.wcs_site = 'default'
cell.save()
cell.check_validity()
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_care_forms_cell_render_single_site(mock_send, context):
@ -1229,6 +1280,21 @@ def test_current_drafts_cell_check_validity(mock_send, context):
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
assert validity_info.invalid_since is not None
# invalid wcs_site
cell.categories = {'data': ['default:test-3', 'default:test-9']}
cell.wcs_site = 'invalid'
cell.save()
cell.check_validity()
validity_info = ValidityInfo.objects.latest('pk')
assert validity_info.invalid_reason_code == 'wcs_site_not_found'
assert validity_info.invalid_since is not None
# valid wcs_site
cell.wcs_site = 'default'
cell.save()
cell.check_validity()
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_manager_forms_of_category_cell(mock_send, app, admin_user):
@ -2009,6 +2075,26 @@ def test_tracking_code_cell(app, nocache):
resp = app.post(reverse('wcs-tracking-code'), params={'cell': cell.id}, status=400)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_tracking_code_cell_check_validity(mock_send):
page = Page.objects.create(title='xxx', slug='test', template_name='standard')
cell = TrackingCodeInputCell.objects.create(page=page, placeholder='content', order=0)
# invalid wcs_site
cell.wcs_site = 'invalid'
cell.save()
cell.check_validity()
validity_info = ValidityInfo.objects.latest('pk')
assert validity_info.invalid_reason_code == 'wcs_site_not_found'
assert validity_info.invalid_since is not None
# valid wcs_site
cell.wcs_site = 'default'
cell.save()
cell.check_validity()
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_cell_assets(mock_send, settings, app, admin_user):
page = Page.objects.create(title='xxx', slug='test_cell_assets', template_name='standard')
@ -2252,6 +2338,21 @@ def test_backoffice_submission_cell_check_validity(mock_send, context):
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
assert validity_info.invalid_since is not None
# invalid wcs_site
cell.categories = {'data': ['default:test-3', 'default:test-9']}
cell.wcs_site = 'invalid'
cell.save()
cell.check_validity()
validity_info = ValidityInfo.objects.latest('pk')
assert validity_info.invalid_reason_code == 'wcs_site_not_found'
assert validity_info.invalid_since is not None
# valid wcs_site
cell.wcs_site = 'default'
cell.save()
cell.check_validity()
assert ValidityInfo.objects.exists() is False
def test_manager_link_list_cell_duplicate():
page = Page.objects.create(title='xxx', slug='new', template_name='standard')
@ -2386,6 +2487,8 @@ def test_hourly():
WcsCurrentDraftsCell,
WcsFormsOfCategoryCell,
BackofficeSubmissionCell,
CategoriesCell,
TrackingCodeInputCell,
]:
with mock.patch('combo.apps.wcs.models.%s.check_validity' % klass.__name__) as check_validity:
appconfig.hourly()