1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-11 07:51:20 +00:00

Resolve "Converting an empty text to date field results in '01/01/0001'"

This commit is contained in:
Bram Wiepjes 2021-03-16 20:55:06 +00:00
parent 5affc3bfa3
commit 2610902ed1
4 changed files with 75 additions and 15 deletions
backend
src/baserow/contrib/database
tests/baserow/contrib/database/field
changelog.md

View file

@ -323,18 +323,32 @@ class DateFieldType(FieldType):
if from_field_type.type != self.type and connection.vendor == 'postgresql':
sql_function = 'TO_DATE'
sql_format = DATE_FORMAT[to_field.date_format]['sql']
sql_type = 'date'
if to_field.date_include_time:
sql_function = 'TO_TIMESTAMP'
sql_format += ' ' + DATE_TIME_FORMAT[to_field.date_time_format]['sql']
sql_type = 'timestamp'
return f"""
begin
p_in = GREATEST(
{sql_function}(p_in::text, 'FM{sql_format}'),
'0001-01-01'::date
);
exception when others then end;
IF char_length(p_in::text) < 5 THEN
p_in = null;
ELSEIF p_in IS NULL THEN
p_in = null;
ELSE
p_in = GREATEST(
{sql_function}(p_in::text, 'FM{sql_format}'),
'0001-01-01'::{sql_type}
);
END IF;
exception when others then
begin
p_in = GREATEST(p_in::{sql_type}, '0001-01-01'::{sql_type});
exception when others then
p_in = p_default;
end;
end;
"""
return super().get_alter_column_prepare_old_value(connection, from_field,

View file

@ -24,7 +24,6 @@ def forward(apps, schema_editor):
)
class Migration(migrations.Migration):
dependencies = [

View file

@ -371,28 +371,74 @@ def test_negative_date_field_value(data_fixture):
datetime_field = data_fixture.create_text_field(table=table)
model = table.get_model()
model.objects.create(**{
f'field_{date_field.id}': '',
f'field_{datetime_field.id}': '',
})
model.objects.create(**{
f'field_{date_field.id}': 'INVALID',
f'field_{datetime_field.id}': 'INVALID',
})
model.objects.create(**{
f'field_{date_field.id}': ' ',
f'field_{datetime_field.id}': ' ',
})
model.objects.create(**{
f'field_{date_field.id}': '0',
f'field_{datetime_field.id}': '0',
})
model.objects.create(**{
f'field_{date_field.id}': '-0',
f'field_{datetime_field.id}': '-0',
})
model.objects.create(**{
f'field_{date_field.id}': '00000',
f'field_{datetime_field.id}': '00000',
})
model.objects.create(**{
f'field_{date_field.id}': None,
f'field_{datetime_field.id}': None,
})
model.objects.create(**{
f'field_{date_field.id}': '2010-02-03',
f'field_{datetime_field.id}': '2010-02-03 12:30',
})
model.objects.create(**{
f'field_{date_field.id}': '28/01/2012',
f'field_{datetime_field.id}': '28/01/2012 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)
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[0], f'field_{date_field.id}') is None
assert getattr(results[0], f'field_{datetime_field.id}') is None
assert getattr(results[1], f'field_{date_field.id}') is None
assert getattr(results[1], f'field_{datetime_field.id}') is None
assert getattr(results[2], f'field_{date_field.id}') is None
assert getattr(results[2], f'field_{datetime_field.id}') is None
assert getattr(results[3], f'field_{date_field.id}') is None
assert getattr(results[3], f'field_{datetime_field.id}') is None
assert getattr(results[4], f'field_{date_field.id}') is None
assert getattr(results[4], f'field_{datetime_field.id}') is None
assert getattr(results[5], f'field_{date_field.id}') == date(1, 1, 1)
assert getattr(results[5], f'field_{datetime_field.id}') == (
datetime(1, 1, 1, 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}') == (
assert getattr(results[6], f'field_{date_field.id}') is None
assert getattr(results[6], f'field_{datetime_field.id}') is None
assert getattr(results[7], f'field_{date_field.id}') == date(2010, 2, 3)
assert getattr(results[7], f'field_{datetime_field.id}') == (
datetime(2010, 2, 3, 12, 30, 0, tzinfo=timezone('utc'))
)
assert getattr(results[8], f'field_{date_field.id}') == date(2012, 1, 28)
assert getattr(results[8], f'field_{datetime_field.id}') == (
datetime(2012, 1, 28, 12, 30, 0, tzinfo=timezone('utc'))
)

View file

@ -18,6 +18,7 @@
reconnect loop stops.
* Fixed 100X backend web socket errors when refreshing the page.
* Fixed SSRF bug in the file upload by URL by blocking urls to the private network.
* Fixed bug where an invalid date could be converted to 0001-01-01.
## Released (2021-03-01)