diff --git a/backend/src/baserow/contrib/database/views/view_filters.py b/backend/src/baserow/contrib/database/views/view_filters.py index e077dc71b..9da2e31ab 100644 --- a/backend/src/baserow/contrib/database/views/view_filters.py +++ b/backend/src/baserow/contrib/database/views/view_filters.py @@ -1688,7 +1688,7 @@ DATE_FILTER_OPERATOR_BOUNDS = { ), DateFilterOperators.THIS_WEEK: lambda filter_date: DateFilterBounds( filter_date + relativedelta(weekday=MO(-1)), - filter_date + relativedelta(weekday=MO(+1)), + filter_date + relativedelta(days=1, weekday=MO(+1)), ), DateFilterOperators.THIS_MONTH: lambda filter_date: DateFilterBounds( filter_date.replace(day=1), @@ -1699,8 +1699,8 @@ DATE_FILTER_OPERATOR_BOUNDS = { filter_date.replace(day=1, month=1) + relativedelta(years=1), ), DateFilterOperators.NEXT_WEEK: lambda filter_date: DateFilterBounds( - filter_date + relativedelta(weekday=MO(+1)), - filter_date + relativedelta(weekday=MO(+2)), + filter_date + relativedelta(days=1, weekday=MO(+1)), + filter_date + relativedelta(days=1, weekday=MO(+2)), ), DateFilterOperators.NEXT_MONTH: lambda filter_date: DateFilterBounds( filter_date.replace(day=1) + relativedelta(months=1), @@ -1716,7 +1716,7 @@ DATE_FILTER_OPERATOR_BOUNDS = { ), DateFilterOperators.NR_WEEKS_AGO: lambda filter_date: DateFilterBounds( filter_date + relativedelta(weekday=MO(-1)), - filter_date + relativedelta(weekday=MO(+1)), + filter_date + relativedelta(days=1, weekday=MO(+1)), ), DateFilterOperators.NR_MONTHS_AGO: lambda filter_date: DateFilterBounds( filter_date.replace(day=1), filter_date.replace(day=1) + relativedelta(months=1) @@ -1731,7 +1731,7 @@ DATE_FILTER_OPERATOR_BOUNDS = { ), DateFilterOperators.NR_WEEKS_FROM_NOW: lambda filter_date: DateFilterBounds( filter_date + relativedelta(weekday=MO(-1)), - filter_date + relativedelta(weekday=MO(+1)), + filter_date + relativedelta(days=1, weekday=MO(+1)), ), DateFilterOperators.NR_MONTHS_FROM_NOW: lambda filter_date: DateFilterBounds( filter_date.replace(day=1), filter_date.replace(day=1) + relativedelta(months=1) diff --git a/backend/tests/baserow/contrib/database/view/test_view_filters.py b/backend/tests/baserow/contrib/database/view/test_view_filters.py index 27dead907..51908684b 100644 --- a/backend/tests/baserow/contrib/database/view/test_view_filters.py +++ b/backend/tests/baserow/contrib/database/view/test_view_filters.py @@ -6821,3 +6821,113 @@ def test_all_view_filters_can_accept_strings_as_filter_value(data_fixture): handler.get_queryset(view) except Exception as e: pytest.fail(f"Exception raised: {e}") + + +@pytest.mark.django_db +def test_week_operator_for_view_multi_date_filters(data_fixture): + user = data_fixture.create_user() + table = data_fixture.create_database_table(user=user) + date_field = data_fixture.create_date_field(table=table) + view = data_fixture.create_grid_view(table=table) + rows = ( + RowHandler() + .force_create_rows( + user=user, + table=table, + rows_values=[ + {date_field.db_column: date(2025, 3, 16)}, + {date_field.db_column: date(2025, 3, 17)}, # MO-1 + {date_field.db_column: date(2025, 3, 23)}, + {date_field.db_column: date(2025, 3, 24)}, # MO + {date_field.db_column: date(2025, 3, 25)}, + {date_field.db_column: date(2025, 3, 26)}, + {date_field.db_column: date(2025, 3, 27)}, + {date_field.db_column: date(2025, 3, 28)}, + {date_field.db_column: date(2025, 3, 29)}, + {date_field.db_column: date(2025, 3, 30)}, + {date_field.db_column: date(2025, 3, 31)}, # MO+1 + {date_field.db_column: date(2025, 4, 1)}, + {date_field.db_column: date(2025, 4, 6)}, + {date_field.db_column: date(2025, 4, 7)}, # MO+2 + ], + ) + .created_rows + ) + + view_filter = data_fixture.create_view_filter( + view=view, + field=date_field, + type="date_is", + value="Europe/Rome??this_week", + ) + + handler = ViewHandler() + model = table.get_model() + for day in range(24, 30): # MO-SU + with freeze_time(f"2025-03-{day}"): + qs = handler.apply_filters(view, model.objects.all()) + [getattr(r, date_field.db_column) for r in qs.all()] == [ + date(2025, 3, 24), + date(2025, 3, 25), + date(2025, 3, 26), + date(2025, 3, 27), + date(2025, 3, 28), + date(2025, 3, 29), + date(2025, 3, 30), + ] + + view_filter.value = "Europe/Rome??one_week_ago" + view_filter.save() + + for day in range(24, 30): # MO-SU + with freeze_time(f"2025-03-{day}"): + qs = handler.apply_filters(view, model.objects.all()) + [getattr(r, date_field.db_column) for r in qs.all()] == [ + date(2025, 3, 17), + date(2025, 3, 18), + date(2025, 3, 23), + ] + + view_filter.value = "Europe/Rome?2?nr_weeks_ago" + view_filter.save() + + for day in range(24, 30): # MO-SU + with freeze_time(f"2025-03-{day}"): + qs = handler.apply_filters(view, model.objects.all()) + [getattr(r, date_field.db_column) for r in qs.all()] == [ + date(2025, 3, 16), + ] + + view_filter.value = "Europe/Rome??next_week" + view_filter.save() + + for day in range(24, 30): # MO-SU + with freeze_time(f"2025-03-{day}"): + qs = handler.apply_filters(view, model.objects.all()) + [getattr(r, date_field.db_column) for r in qs.all()] == [ + date(2025, 3, 31), + date(2025, 4, 1), + date(2025, 4, 6), + ] + + view_filter.value = "Europe/Rome??next_week" + view_filter.save() + + for day in range(24, 30): # MO-SU + with freeze_time(f"2025-03-{day}"): + qs = handler.apply_filters(view, model.objects.all()) + [getattr(r, date_field.db_column) for r in qs.all()] == [ + date(2025, 3, 31), + date(2025, 4, 1), + date(2025, 4, 6), + ] + + view_filter.value = "Europe/Rome?2?nr_weeks_from_now" + view_filter.save() + + for day in range(24, 30): # MO-SU + with freeze_time(f"2025-03-{day}"): + qs = handler.apply_filters(view, model.objects.all()) + [getattr(r, date_field.db_column) for r in qs.all()] == [ + date(2025, 4, 7), + ] diff --git a/changelog/entries/unreleased/bug/3526_fix_bug_with_weeks_operators_for_date_filters.json b/changelog/entries/unreleased/bug/3526_fix_bug_with_weeks_operators_for_date_filters.json new file mode 100644 index 000000000..0ed05e630 --- /dev/null +++ b/changelog/entries/unreleased/bug/3526_fix_bug_with_weeks_operators_for_date_filters.json @@ -0,0 +1,8 @@ +{ + "type": "bug", + "message": "Fix issue with 'this_week' and 'next_week' operators in date filters", + "domain": "database", + "issue_number": 3526, + "bullet_points": [], + "created_at": "2025-03-25" +} \ No newline at end of file