fields: don't fail on unknown |objects filter (#59661)
gitea-wip/wcs/pipeline/head Build started... Details

This commit is contained in:
Lauréline Guérin 2021-12-14 11:46:29 +01:00
parent a63e600cfa
commit 9ec9d31689
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
6 changed files with 73 additions and 6 deletions

View File

@ -639,3 +639,56 @@ def test_computed_field_with_data_source(pub):
resp = get_app(pub).get('/test/?param=%s' % 'invalid')
assert 'XY' in resp.text
assert 'XBBY' in resp.text
def test_computed_field_with_bad_objects_filter_in_prefill(pub):
if pub.is_using_postgresql():
pub.loggederror_class.wipe()
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'items'
carddef.digest_templates = {'default': '{{form_var_name}}'}
carddef.fields = [
fields.StringField(id='0', label='string', varname='name'),
]
carddef.store()
carddata = carddef.data_class()()
carddata.data = {
'0': 'foo',
}
carddata.just_created()
carddata.store()
ds = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'test'
formdef.fields = [
fields.ComputedField(
id='1',
label='computed',
varname='computed',
value_template='{{ cards|objects:"%s"|order_by:"id"|first|get:"form_number_raw"|default:"" }}'
% carddef.url_name,
freeze_on_initial_value=True,
data_source=ds,
),
fields.CommentField(id='2', label='X{{ form_var_computed_live_var_name }}Y', type='comment'),
]
formdef.store()
formdef.data_class().wipe()
resp = get_app(pub).get('/test/')
assert 'XfooY' in resp.text
formdef.fields[0].value_template = '{{ cards|objects:"unknown"|first|get:"form_number_raw"|default:"" }}'
formdef.store()
resp = get_app(pub).get('/test/')
assert 'XY' in resp.text
if pub.is_using_postgresql():
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'wcs.carddef.CardDefDoesNotExist: unknown'
assert logged_error.formdef_id == formdef.id

View File

@ -63,7 +63,7 @@ def test_prefill_string_carddef():
assert field.get_prefill_value() == ('hello world', False)
field.prefill = {'type': 'string', 'value': '{{cards|objects:"unknown"|first|get:"foo"}}'}
assert field.get_prefill_value() == ('', False)
assert field.get_prefill_value() == ('{{cards|objects:"unknown"|first|get:"foo"}}', False)
def test_prefill_user(user):

View File

@ -24,7 +24,7 @@ from quixote import get_publisher
from wcs.carddata import CardData
from wcs.categories import CardDefCategory
from wcs.formdef import FormDef, get_formdefs_of_all_kinds
from wcs.formdef import FormDef, FormDefDoesNotExist, get_formdefs_of_all_kinds
from .qommon import _, force_text, misc
from .qommon.storage import ElementEqual, ElementILike, Equal, NotEqual
@ -34,6 +34,10 @@ if not hasattr(types, 'ClassType'):
types.ClassType = type
class CardDefDoesNotExist(FormDefDoesNotExist):
pass
class CardDef(FormDef):
_names = 'carddefs'
backoffice_section = 'cards'

View File

@ -92,6 +92,10 @@ class FormdefImportRecoverableError(FormdefImportError):
pass
class FormDefDoesNotExist(AttributeError):
pass
class FormField:
# only used to unpickle form fields from older (<200603) versions
def __setstate__(self, dict):

View File

@ -504,6 +504,9 @@ class Template:
return str(self.value)
def django_render(self, context=None):
from wcs.carddef import CardDefDoesNotExist
from wcs.formdef import FormDefDoesNotExist
context = context or {}
try:
rendered = self.template.render(context)
@ -513,6 +516,9 @@ class Template:
raise TemplateError(_('failure to render Django template: %s'), e)
return self.value
except (FormDefDoesNotExist, CardDefDoesNotExist) as e:
get_publisher().record_error(exception=e, notify=True)
return self.value
rendered = str(rendered)
if context.get('allow_complex'):
return rendered

View File

@ -21,9 +21,9 @@ from django.utils.functional import SimpleLazyObject
from pyproj import Geod
from quixote import get_publisher, get_request
from .carddef import CardDef
from .carddef import CardDef, CardDefDoesNotExist
from .formdata import get_workflow_roles_substitution_variables
from .formdef import FormDef
from .formdef import FormDef, FormDefDoesNotExist
from .qommon import _, force_str, misc
from .qommon.evalutils import make_datetime
from .qommon.storage import And, Equal, Intersects, Not, NotEqual, Null, Or
@ -1296,7 +1296,7 @@ class CardsSource:
try:
return LazyFormDef(CardDef.get_by_urlname(attr))
except KeyError:
raise AttributeError(attr)
raise CardDefDoesNotExist(attr)
class FormsSource:
@ -1311,4 +1311,4 @@ class FormsSource:
try:
return LazyFormDef(FormDef.get_by_urlname(attr))
except KeyError:
raise AttributeError(attr)
raise FormDefDoesNotExist(attr)