1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-17 18:32:35 +00:00

Merge branch '351-fix-year-0-is-out-of-range-error' into 'develop'

Resolve "Fix `year 0 is out of range` error"

Closes 

See merge request 
This commit is contained in:
Bram Wiepjes 2021-03-15 20:35:16 +00:00
commit 5fa323bedb
4 changed files with 71 additions and 1 deletions
backend
src/baserow/contrib/database
tests/baserow/contrib/database/field
changelog.md

View file

@ -330,7 +330,10 @@ class DateFieldType(FieldType):
return f"""
begin
p_in = {sql_function}(p_in::text, 'FM{sql_format}');
p_in = GREATEST(
{sql_function}(p_in::text, 'FM{sql_format}'),
'0001-01-01'::date
);
exception when others then end;
"""

View file

@ -0,0 +1,31 @@
# Generated by Django 2.2.11 on 2021-01-25 14:54
from django.db import migrations, connections
from django.conf import settings
def forward(apps, schema_editor):
DateField = apps.get_model('database', 'DateField')
connection = connections[settings.USER_TABLE_DATABASE]
with connection.schema_editor() as tables_schema_editor:
for field in DateField.objects.all():
table_name = f'database_table_{field.table.id}'
field_name = f'field_{field.id}'
tables_schema_editor.execute(
f"""
UPDATE {table_name} SET {field_name} = '0001-01-01'::date
WHERE {field_name} < '0001-01-01'::date
"""
)
class Migration(migrations.Migration):
dependencies = [
('database', '0027_gridviewfieldoptions_order'),
]
operations = [
migrations.RunPython(forward, migrations.RunPython.noop),
]

View file

@ -361,3 +361,38 @@ def test_converting_date_field_value(data_fixture):
assert getattr(rows[0], f'field_{date_field_iso_24.id}') == '2021-07-22 12:45'
assert getattr(rows[2], f'field_{date_field_eu_12.id}') is None
@pytest.mark.django_db
def test_negative_date_field_value(data_fixture):
user = data_fixture.create_user()
table = data_fixture.create_database_table(user=user)
date_field = data_fixture.create_text_field(table=table)
datetime_field = data_fixture.create_text_field(table=table)
model = table.get_model()
model.objects.create(**{
f'field_{date_field.id}': '-0',
f'field_{datetime_field.id}': '-0',
})
model.objects.create(**{
f'field_{date_field.id}': '2010-02-03',
f'field_{datetime_field.id}': '2010-02-03 12:30',
})
date_field = FieldHandler().update_field(user, date_field, new_type_name='date')
datetime_field = FieldHandler().update_field(user, datetime_field,
new_type_name='date',
date_include_time=True)
model = table.get_model()
results = model.objects.all()
assert getattr(results[0], f'field_{date_field.id}') == date(1, 1, 1)
assert getattr(results[0], f'field_{datetime_field.id}') == (
datetime(1, 1, 1, 0, 0, 0, tzinfo=timezone('utc'))
)
assert getattr(results[1], f'field_{date_field.id}') == date(2010, 2, 3)
assert getattr(results[1], f'field_{datetime_field.id}') == (
datetime(2010, 2, 3, 12, 30, 0, tzinfo=timezone('utc'))
)

View file

@ -9,6 +9,7 @@
* Made it possible to re-order fields in a grid view.
* Show the number of filters and sorts active in the header of a grid view.
* The first user to sign-up after installation now gets given staff status.
* Prevented the date field value to be negative.
## Released (2021-03-01)