Skip to content

Commit b0e614b

Browse files
committed
Handle missing filter values for DateFilter and DateTimeFilter
- Raise invalid exception when first value of filter is expected, but None Refs #91
1 parent c5e66b4 commit b0e614b

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

webgrid/filters.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,9 @@ def process(self, value, is_value2):
878878
else:
879879
raise formencode.Invalid(gettext('invalid date'), value, self)
880880

881+
if value is None and not is_value2 and self.op not in self.no_value_operators:
882+
raise formencode.Invalid(gettext('invalid date'), value, self)
883+
881884
if value is None or self.op in self.no_value_operators or (
882885
self.op == self.default_op and not value
883886
):
@@ -1021,6 +1024,9 @@ def process(self, value, is_value2): # noqa: C901
10211024
else:
10221025
raise formencode.Invalid(gettext('invalid date'), value, self)
10231026

1027+
if value is None and not is_value2 and self.op not in self.no_value_operators:
1028+
raise formencode.Invalid(gettext('invalid date'), value, self)
1029+
10241030
if value is None or (self.op == self.default_op and not value):
10251031
return None
10261032

webgrid/tests/test_filters.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,12 +282,22 @@ def test_eq(self):
282282
self.assert_filter_query(filter, "WHERE persons.due_date = '2010-12-31'")
283283
eq_(filter.description, '12/31/2010')
284284

285+
def test_eq_none(self):
286+
filter = DateFilter(Person.due_date)
287+
with assert_raises(formencode.Invalid):
288+
filter.set('eq', None)
289+
285290
def test_not_eq(self):
286291
filter = DateFilter(Person.due_date)
287292
filter.set('!eq', '12/31/2010')
288293
self.assert_filter_query(filter, "WHERE persons.due_date != '2010-12-31'")
289294
eq_(filter.description, 'excluding 12/31/2010')
290295

296+
def test_not_eq_none(self):
297+
filter = DateFilter(Person.due_date)
298+
with assert_raises(formencode.Invalid):
299+
filter.set('!eq', None)
300+
291301
def test_lte(self):
292302
filter = DateFilter(Person.due_date)
293303
filter.set('lte', '12/31/2010')
@@ -296,12 +306,22 @@ def test_lte(self):
296306
with assert_raises(formencode.Invalid):
297307
filter.set('lte', '')
298308

309+
def test_lte_none(self):
310+
filter = DateFilter(Person.due_date)
311+
with assert_raises(formencode.Invalid):
312+
filter.set('lte', None)
313+
299314
def test_gte(self):
300315
filter = DateFilter(Person.due_date)
301316
filter.set('gte', '12/31/2010')
302317
self.assert_filter_query(filter, "WHERE persons.due_date >= '2010-12-31'")
303318
eq_(filter.description, 'beginning 12/31/2010')
304319

320+
def test_gte_none(self):
321+
figter = DateFilter(Person.due_date)
322+
with assert_raises(formencode.Invalid):
323+
figter.set('gte', None)
324+
305325
def test_empty(self):
306326
filter = DateFilter(Person.due_date)
307327
filter.set('empty', None)
@@ -406,6 +426,11 @@ def test_days_ago(self):
406426
self.assert_filter_query(filter, "WHERE persons.due_date = '2011-12-22'")
407427
eq_(filter.description, '12/22/2011')
408428

429+
def test_days_ago_none(self):
430+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
431+
with assert_raises(formencode.Invalid):
432+
filter.set('da', None)
433+
409434
def test_less_than_days_ago(self):
410435
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
411436
filter.set('ltda', '10')
@@ -415,12 +440,22 @@ def test_less_than_days_ago(self):
415440
)
416441
eq_(filter.description, '12/22/2011 - 01/01/2012')
417442

443+
def test_less_than_days_ago_none(self):
444+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
445+
with assert_raises(formencode.Invalid):
446+
filter.set('ltda', None)
447+
418448
def test_more_than_days_ago(self):
419449
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
420450
filter.set('mtda', '10')
421451
self.assert_filter_query(filter, "WHERE persons.due_date < '2011-12-22'")
422452
eq_(filter.description, 'before 12/22/2011')
423453

454+
def test_more_than_days_ago_none(self):
455+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
456+
with assert_raises(formencode.Invalid):
457+
filter.set('mtda', None)
458+
424459
def test_in_less_than_days(self):
425460
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
426461
filter.set('iltd', '10')
@@ -430,18 +465,33 @@ def test_in_less_than_days(self):
430465
)
431466
eq_(filter.description, '01/01/2012 - 01/11/2012')
432467

468+
def test_in_less_than_days_none(self):
469+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
470+
with assert_raises(formencode.Invalid):
471+
filter.set('iltd', None)
472+
433473
def test_in_more_than_days(self):
434474
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
435475
filter.set('imtd', '10')
436476
self.assert_filter_query(filter, "WHERE persons.due_date > '2012-01-11'")
437477
eq_(filter.description, 'after 01/11/2012')
438478

479+
def test_in_more_than_days_none(self):
480+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
481+
with assert_raises(formencode.Invalid):
482+
filter.set('imtd', None)
483+
439484
def test_in_days(self):
440485
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
441486
filter.set('ind', '10')
442487
self.assert_filter_query(filter, "WHERE persons.due_date = '2012-01-11'")
443488
eq_(filter.description, '01/11/2012')
444489

490+
def test_in_days_none(self):
491+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
492+
with assert_raises(formencode.Invalid):
493+
filter.set('ind', None)
494+
445495
def test_today(self):
446496
filter = DateFilter(Person.due_date, _now=dt.date(2012, 1, 1))
447497
filter.set('today', None)
@@ -531,6 +581,11 @@ def test_selmonth(self):
531581
self.assert_filter_query(filter, self.between_sql)
532582
eq_(filter.description, 'Jan 2012')
533583

584+
def test_selmonth_none(self):
585+
filter = DateFilter(Person.due_date, _now=dt.date(2012, 2, 4))
586+
with assert_raises(formencode.Invalid):
587+
filter.set('selmonth', None, 2012)
588+
534589
def test_int_filter_process(self):
535590
filter = DateFilter(Person.due_date, _now=dt.date(2012, 2, 29))
536591
filter.set('ltda', '1', '')
@@ -622,6 +677,11 @@ def test_eq(self):
622677
"AND '2010-12-31 23:59:59.999999'")
623678
eq_(filter.value1_set_with, '12/31/2010')
624679

680+
def test_eq_none(self):
681+
filter = DateTimeFilter(Person.createdts)
682+
with assert_raises(formencode.Invalid):
683+
filter.set('eq', None)
684+
625685
def test_eq_with_time(self):
626686
filter = DateTimeFilter(Person.createdts)
627687
filter.set('eq', '12/31/2010 10:26:27')
@@ -637,6 +697,10 @@ def test_not_eq(self):
637697
"'2010-12-31 23:59:59.999999'")
638698
eq_(filter.value1_set_with, '12/31/2010')
639699

700+
def test_not_eq_none(self):
701+
filter = DateTimeFilter(Person.createdts)
702+
filter.set('!eq', '12/31/2010')
703+
640704
def test_not_eq_with_time(self):
641705
filter = DateTimeFilter(Person.createdts)
642706
filter.set('!eq', '12/31/2010 10:26:27')
@@ -651,6 +715,8 @@ def test_lte(self):
651715
eq_(filter.value1_set_with, '12/31/2010')
652716
with assert_raises(formencode.Invalid):
653717
filter.set('lte', '')
718+
with assert_raises(formencode.Invalid):
719+
filter.set('lte', None)
654720

655721
def test_lte_with_time(self):
656722
filter = DateTimeFilter(Person.createdts)
@@ -662,6 +728,10 @@ def test_gte(self):
662728
filter.set('gte', '12/31/2010')
663729
self.assert_filter_query(filter, "WHERE persons.createdts >= '2010-12-31 00:00:00.000000'")
664730
eq_(filter.value1_set_with, '12/31/2010')
731+
with assert_raises(formencode.Invalid):
732+
filter.set('gte', '')
733+
with assert_raises(formencode.Invalid):
734+
filter.set('gte', None)
665735

666736
def test_gte_with_time(self):
667737
filter = DateTimeFilter(Person.createdts)
@@ -692,6 +762,11 @@ def test_between(self):
692762
eq_(filter.value1_set_with, '01/31/2010 12:00 AM')
693763
eq_(filter.value2_set_with, '12/31/2010 11:59 PM')
694764

765+
def test_between_none(self):
766+
filter = DateTimeFilter(Person.createdts)
767+
with assert_raises(formencode.Invalid):
768+
filter.set('between', None, None)
769+
695770
def test_between_missing_date(self):
696771
filter = DateTimeFilter(Person.createdts,
697772
_now=dt.datetime(2018, 12, 15, 1, 2, 3, 5))
@@ -736,6 +811,11 @@ def test_not_between(self):
736811
"WHERE persons.createdts NOT BETWEEN '2010-01-31 00:00:00.000000' AND "
737812
"'2010-12-31 23:59:59.999999'")
738813

814+
def test_not_between_none(self):
815+
filter = DateTimeFilter(Person.createdts)
816+
with assert_raises(formencode.Invalid):
817+
filter.set('!between', None, None)
818+
739819
def test_days_ago(self):
740820
filter = DateTimeFilter(Person.createdts, _now=dt.date(2012, 1, 1))
741821
filter.set('da', '10')
@@ -744,6 +824,11 @@ def test_days_ago(self):
744824
"WHERE persons.createdts BETWEEN '2011-12-22 00:00:00.000000' AND "
745825
"'2011-12-22 23:59:59.999999'")
746826

827+
def test_days_ago_none(self):
828+
filter = DateTimeFilter(Person.createdts, _now=dt.date(2012, 1, 1))
829+
with assert_raises(formencode.Invalid):
830+
filter.set('da', None)
831+
747832
@raises(formencode.Invalid, 'date filter given is out of range')
748833
def test_days_ago_overflow(self):
749834
filter = DateTimeFilter(Person.due_date, _now=dt.date(2012, 1, 1))
@@ -757,11 +842,21 @@ def test_less_than_days_ago(self):
757842
"WHERE persons.createdts > '2011-12-22 23:59:59.999999' AND "
758843
"persons.createdts < '2012-01-01 00:00:00.000000'")
759844

845+
def test_less_than_days_ago_none(self):
846+
filter = DateTimeFilter(Person.createdts, _now=dt.date(2012, 1, 1))
847+
with assert_raises(formencode.Invalid):
848+
filter.set('ltda', None)
849+
760850
def test_more_than_days_ago(self):
761851
filter = DateTimeFilter(Person.createdts, _now=dt.date(2012, 1, 1))
762852
filter.set('mtda', '10')
763853
self.assert_filter_query(filter, "WHERE persons.createdts < '2011-12-22 00:00:00.000000'")
764854

855+
def test_more_than_days_ago_none(self):
856+
filter = DateTimeFilter(Person.createdts, _now=dt.date(2012, 1, 1))
857+
with assert_raises(formencode.Invalid):
858+
filter.set('mtda', None)
859+
765860
def test_in_less_than_days(self):
766861
filter = DateTimeFilter(Person.createdts, _now=dt.datetime(2012, 1, 1, 12, 35))
767862
filter.set('iltd', '10')
@@ -770,11 +865,21 @@ def test_in_less_than_days(self):
770865
"WHERE persons.createdts >= '2012-01-01 12:35:00.000000' AND "
771866
"persons.createdts < '2012-01-11 00:00:00.000000'")
772867

868+
def test_in_less_than_days_none(self):
869+
filter = DateTimeFilter(Person.createdts, _now=dt.datetime(2012, 1, 1, 12, 35))
870+
with assert_raises(formencode.Invalid):
871+
filter.set('iltd', None)
872+
773873
def test_in_more_than_days(self):
774874
filter = DateTimeFilter(Person.createdts, _now=dt.datetime(2012, 1, 1, 12, 35))
775875
filter.set('imtd', '10')
776876
self.assert_filter_query(filter, "WHERE persons.createdts > '2012-01-11 23:59:59.999999'")
777877

878+
def test_in_more_than_days_none(self):
879+
filter = DateTimeFilter(Person.createdts, _now=dt.datetime(2012, 1, 1, 12, 35))
880+
with assert_raises(formencode.Invalid):
881+
filter.set('imtd', None)
882+
778883
def test_in_days(self):
779884
filter = DateTimeFilter(Person.createdts, _now=dt.datetime(2012, 1, 1, 12, 35))
780885
filter.set('ind', '10')
@@ -783,6 +888,11 @@ def test_in_days(self):
783888
"WHERE persons.createdts BETWEEN '2012-01-11 00:00:00.000000' AND "
784889
"'2012-01-11 23:59:59.999999'")
785890

891+
def test_in_days_none(self):
892+
filter = DateTimeFilter(Person.createdts, _now=dt.datetime(2012, 1, 1, 12, 35))
893+
with assert_raises(formencode.Invalid):
894+
filter.set('ind', None)
895+
786896
@raises(formencode.Invalid, 'date filter given is out of range')
787897
def test_in_days_overflow(self):
788898
filter = DateTimeFilter(Person.due_date, _now=dt.date(2012, 1, 1))
@@ -906,6 +1016,11 @@ def test_selmonth(self):
9061016
self.assert_filter_query(filter, self.between_sql)
9071017
eq_(filter.description, 'Jan 2012')
9081018

1019+
def test_selmonth_none(self):
1020+
filter = DateTimeFilter(Person.createdts, _now=dt.date(2012, 2, 4))
1021+
with assert_raises(formencode.Invalid):
1022+
filter.set('selmonth', None, None)
1023+
9091024
def test_search_expr(self):
9101025
expr_factory = DateTimeFilter(Person.due_date).get_search_expr()
9111026
assert callable(expr_factory)

0 commit comments

Comments
 (0)