1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-07 22:35:36 +00:00

Resolve "This week operator does not return correct results when current date is a Monday"

This commit is contained in:
Davide Silvestri 2025-03-25 11:18:17 +01:00
parent de70635ce3
commit f2e830e9e6
3 changed files with 123 additions and 5 deletions
backend
src/baserow/contrib/database/views
tests/baserow/contrib/database/view
changelog/entries/unreleased/bug

View file

@ -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)

View file

@ -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),
]

View file

@ -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"
}