misc: filter_by & date support (#49358)

This commit is contained in:
Lauréline Guérin 2021-01-04 15:19:31 +01:00
parent 1d63253d31
commit 17e78f2602
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 30 additions and 2 deletions

View File

@ -1063,7 +1063,7 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
formdata.store()
for i in range(4):
formdata = data_class()
formdata.data = {'0': 'foo', 'bo1': 'plop2'}
formdata.data = {'0': 'foo', '3': datetime.date(2018, 7, 31).timetuple(), 'bo1': 'plop2'}
formdata.just_created()
formdata.jump_status('finished')
formdata.store()
@ -1094,6 +1094,21 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Invalid filter "unknown"'
queryset = lazy_formdata.objects.filter_by('datefield').apply_filter_value(datetime.date(2018, 7, 31).timetuple())
assert queryset.count == 5
queryset = lazy_formdata.objects.filter_by('datefield').apply_filter_value(datetime.date(2018, 7, 31))
assert queryset.count == 5
queryset = lazy_formdata.objects.filter_by('datefield').apply_filter_value(datetime.datetime(2018, 7, 31))
assert queryset.count == 5
queryset = lazy_formdata.objects.filter_by('datefield').apply_filter_value('2018-07-31')
assert queryset.count == 5
queryset = lazy_formdata.objects.filter_by('datefield').apply_filter_value('not a date')
assert queryset.count == 0
if pub.is_using_postgresql():
assert pub.loggederror_class.count() == 2
logged_error = pub.loggederror_class.select()[1]
assert logged_error.summary == 'Invalid value "not a date" for filter "datefield"'
# filter function on backoffice field
queryset = lazy_formdata.objects.filter_by('backoffice_blah').apply_filter_value('plop1')
assert queryset.count == 6

View File

@ -26,7 +26,7 @@ from pyproj import Geod
from .qommon import misc, force_str, _
from .qommon.evalutils import make_datetime
from .qommon.templatetags.qommon import parse_datetime
from .qommon.templatetags.qommon import parse_date, parse_datetime
from .qommon.storage import (Or, Equal, NotEqual, Null)
from .qommon.substitution import CompatibilityNamesDict
@ -163,11 +163,24 @@ class LazyFormDefObjectsManager(object):
def apply_filter_value(self, value):
assert self.pending_attr
def format_value(field, value):
if field.key != 'date':
return value
return parse_date(value).timetuple()
for field in self._formdef.get_all_fields():
if getattr(field, 'varname', None) == self.pending_attr:
try:
value = format_value(field, value)
except (ValueError, AttributeError):
get_publisher().record_error(_('Invalid value "%s" for filter "%s"') % (value, self.pending_attr), formdata=self._formdata)
return self.none()
from wcs import sql
criteria = Equal(sql.get_field_id(field), value)
return self._clone(self._criterias + [criteria])
get_publisher().record_error(_('Invalid filter "%s"') % self.pending_attr, formdata=self._formdata)
return self.none()