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:
parent
5affc3bfa3
commit
2610902ed1
4 changed files with 75 additions and 15 deletions
|
@ -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,
|
||||
|
|
|
@ -24,7 +24,6 @@ def forward(apps, schema_editor):
|
|||
)
|
||||
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
|
|
|
@ -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'))
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue