Skip to content

Commit 9ba38a7

Browse files
elpasotroopa81
authored andcommittedJan 5, 2022
Fix datetime default with text fields
Fixes #46542 Funded by: ARPA Piemonte
1 parent db4d4c3 commit 9ba38a7

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed
 

‎src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,15 +227,41 @@ void QgsDateTimeEditWrapper::updateValues( const QVariant &value, const QVariant
227227
dateTime.setTime( value.toTime() );
228228
break;
229229
default:
230-
const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
231-
const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
232-
if ( fieldIsoFormat )
230+
// Field type is not a date/time but we might already have a date/time variant
231+
// value coming from a default: no need for string parsing in that case
232+
switch ( value.type() )
233233
{
234-
dateTime = QDateTime::fromString( value.toString(), Qt::ISODate );
235-
}
236-
else
237-
{
238-
dateTime = QDateTime::fromString( value.toString(), fieldFormat );
234+
case QVariant::DateTime:
235+
{
236+
dateTime = value.toDateTime();
237+
break;
238+
}
239+
case QVariant::Date:
240+
{
241+
dateTime.setDate( value.toDate() );
242+
dateTime.setTime( QTime( 0, 0, 0 ) );
243+
break;
244+
}
245+
case QVariant::Time:
246+
{
247+
dateTime.setDate( QDate::currentDate() );
248+
dateTime.setTime( value.toTime() );
249+
break;
250+
}
251+
default:
252+
{
253+
const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
254+
const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
255+
if ( fieldIsoFormat )
256+
{
257+
dateTime = QDateTime::fromString( value.toString(), Qt::ISODate );
258+
}
259+
else
260+
{
261+
dateTime = QDateTime::fromString( value.toString(), fieldFormat );
262+
}
263+
break;
264+
}
239265
}
240266
break;
241267
}

‎tests/src/gui/testqgsdatetimeedit.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class TestQgsDateTimeEdit: public QObject
4141
std::unique_ptr<QgsDateTimeEditWrapper> widget4; // For field 3
4242
std::unique_ptr<QgsDateTimeEditWrapper> widget5; // For field 4
4343
std::unique_ptr<QgsDateTimeEditWrapper> widget6; // For field 5
44+
std::unique_ptr<QgsDateTimeEditWrapper> widget7; // For field 6
4445
std::unique_ptr<QgsVectorLayer> vl;
4546

4647
};
@@ -68,6 +69,7 @@ void TestQgsDateTimeEdit::init()
6869
fields.append( QgsField( "time", QVariant::Time ) );
6970
fields.append( QgsField( "datetime1", QVariant::DateTime ) );
7071
fields.append( QgsField( "datetime2", QVariant::DateTime ) );
72+
fields.append( QgsField( "text", QVariant::String ) );
7173
vl->dataProvider()->addAttributes( fields );
7274
vl->updateFields();
7375
QVERIFY( vl.get() );
@@ -79,12 +81,14 @@ void TestQgsDateTimeEdit::init()
7981
widget4 = std::make_unique<QgsDateTimeEditWrapper>( vl.get(), 3, nullptr, nullptr );
8082
widget5 = std::make_unique<QgsDateTimeEditWrapper>( vl.get(), 4, nullptr, nullptr );
8183
widget6 = std::make_unique<QgsDateTimeEditWrapper>( vl.get(), 5, nullptr, nullptr );
84+
widget7 = std::make_unique<QgsDateTimeEditWrapper>( vl.get(), 6, nullptr, nullptr );
8285
QVERIFY( widget1.get() );
8386
QVERIFY( widget2.get() );
8487
QVERIFY( widget3.get() );
8588
QVERIFY( widget4.get() );
8689
QVERIFY( widget5.get() );
8790
QVERIFY( widget6.get() );
91+
QVERIFY( widget7.get() );
8892
}
8993

9094
void TestQgsDateTimeEdit::cleanup()
@@ -319,6 +323,18 @@ void TestQgsDateTimeEdit::testDateTime()
319323
widget6->setValue( QDate( 1, 1, 1 ) );
320324
const QDate value6 { widget6->value().toDate() };
321325
QCOMPARE( value6, QDate( 1, 1, 1 ) );
326+
327+
// Test for issue GH #46542
328+
widget7->setConfig( cfg );
329+
QgsDateTimeEdit *dateedit7 = qobject_cast<QgsDateTimeEdit *>( widget7->createWidget( &w ) );
330+
QVERIFY( dateedit7 );
331+
widget7->initWidget( dateedit7 );
332+
QgsFeature f { vl->fields() };
333+
f.setAttribute( QStringLiteral( "text" ), QgsExpression{ QStringLiteral( "now()" ) }.evaluate() );
334+
widget7->setFeature( f );
335+
const QDate value7 { widget7->value().toDate() };
336+
QCOMPARE( value7, QDate::currentDate() );
337+
322338
}
323339

324340
QGSTEST_MAIN( TestQgsDateTimeEdit )

0 commit comments

Comments
 (0)