fields: don't fail on unknown |objects filter (#59661)
gitea-wip/wcs/pipeline/head Build started...
Details
gitea-wip/wcs/pipeline/head Build started...
Details
This commit is contained in:
parent
a63e600cfa
commit
9ec9d31689
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue