Skip to content

Commit

Permalink
Revert date and datetime field formatting (#45617)
Browse files Browse the repository at this point in the history
  • Loading branch information
Joonalai committed Nov 29, 2021
1 parent ff13ed8 commit 8a22883
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 74 deletions.
Expand Up @@ -22,9 +22,9 @@ the field configuration.
#include "qgsdatetimefieldformatter.h"
%End
public:
static QString DATE_FORMAT;
static const QString DATE_FORMAT;
static const QString TIME_FORMAT;
static QString DATETIME_FORMAT;
static const QString DATETIME_FORMAT;
static const QString QT_ISO_FORMAT;
static const QString DISPLAY_FOR_ISO_FORMAT;

Expand All @@ -39,11 +39,6 @@ Default constructor of field formatter for a date time field.
virtual QString representValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const;


static void applyLocaleChange();
%Docstring
Adjusts the date time formats according to locale.
%End

static QString defaultFormat( QVariant::Type type );
%Docstring
Gets the default format in function of the type.
Expand Down
4 changes: 0 additions & 4 deletions src/app/main.cpp
Expand Up @@ -113,7 +113,6 @@ typedef SInt32 SRefCon;

#include "qgsuserprofilemanager.h"
#include "qgsuserprofile.h"
#include "qgsdatetimefieldformatter.h"

#ifdef HAVE_OPENCL
#include "qgsopenclutils.h"
Expand Down Expand Up @@ -1030,9 +1029,6 @@ int main( int argc, char *argv[] )
}
QLocale::setDefault( currentLocale );

// Date time settings
QgsDateTimeFieldFormatter::applyLocaleChange();

QgsApplication::setTranslation( translationCode );
}

Expand Down
15 changes: 2 additions & 13 deletions src/core/fieldformatter/qgsdatetimefieldformatter.cpp
Expand Up @@ -20,9 +20,9 @@
#include "qgsvectorlayer.h"
#include "qgsapplication.h"

QString QgsDateTimeFieldFormatter::DATE_FORMAT = QStringLiteral( "yyyy-MM-dd" );
const QString QgsDateTimeFieldFormatter::DATE_FORMAT = QStringLiteral( "yyyy-MM-dd" );
const QString QgsDateTimeFieldFormatter::TIME_FORMAT = QStringLiteral( "HH:mm:ss" );
QString QgsDateTimeFieldFormatter::DATETIME_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss" );
const QString QgsDateTimeFieldFormatter::DATETIME_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss" );
// we need to use Qt::ISODate rather than a string format definition in QDate::fromString
const QString QgsDateTimeFieldFormatter::QT_ISO_FORMAT = QStringLiteral( "Qt ISO Date" );
// but QDateTimeEdit::setDisplayFormat only accepts string formats, so use with time zone by default
Expand Down Expand Up @@ -62,10 +62,6 @@ QString QgsDateTimeFieldFormatter::representValue( QgsVectorLayer *layer, int fi
// we always show time zones for datetime values
showTimeZone = true;
}
else if ( static_cast<QMetaType::Type>( value.type() ) == QMetaType::QTime )
{
return value.toTime().toString( displayFormat );
}
else
{
if ( fieldIsoFormat )
Expand Down Expand Up @@ -98,13 +94,6 @@ QString QgsDateTimeFieldFormatter::representValue( QgsVectorLayer *layer, int fi
return result;
}

void QgsDateTimeFieldFormatter::applyLocaleChange()
{
QString dateFormat = QLocale().dateFormat( QLocale::FormatType::ShortFormat );
QgsDateTimeFieldFormatter::DATETIME_FORMAT = QString( "%1 %2" ).arg( dateFormat, QgsDateTimeFieldFormatter::TIME_FORMAT );
QgsDateTimeFieldFormatter::DATE_FORMAT = dateFormat;
}

QString QgsDateTimeFieldFormatter::defaultFormat( QVariant::Type type )
{
switch ( type )
Expand Down
7 changes: 2 additions & 5 deletions src/core/fieldformatter/qgsdatetimefieldformatter.h
Expand Up @@ -31,9 +31,9 @@
class CORE_EXPORT QgsDateTimeFieldFormatter : public QgsFieldFormatter
{
public:
static QString DATE_FORMAT;
static const QString DATE_FORMAT;
static const QString TIME_FORMAT;
static QString DATETIME_FORMAT;
static const QString DATETIME_FORMAT;
static const QString QT_ISO_FORMAT;
static const QString DISPLAY_FOR_ISO_FORMAT;

Expand All @@ -46,9 +46,6 @@ class CORE_EXPORT QgsDateTimeFieldFormatter : public QgsFieldFormatter

QString representValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const override;

//! Adjusts the date time formats according to locale.
static void applyLocaleChange();

/**
* Gets the default format in function of the type.
* The type is expected to be one of
Expand Down
57 changes: 12 additions & 45 deletions tests/src/python/test_qgsfieldformatters.py
Expand Up @@ -682,64 +682,31 @@ def tearDownClass(cls):
QLocale.setDefault(QLocale(QLocale.English))

def test_representValue(self):
layer = QgsVectorLayer("point?field=datetime:datetime&field=date:date&field=time:time",
layer = QgsVectorLayer("point?field=int:integer&field=datetime:datetime&field=long:long",
"layer", "memory")
self.assertTrue(layer.isValid())
QgsProject.instance().addMapLayers([layer])

field_formatter = QgsDateTimeFieldFormatter()

# default configuration should show timezone information
config = {}
self.assertEqual(field_formatter.representValue(layer, 1, config, None,
QDateTime(QDate(2020, 3, 4), QTime(12, 13, 14), Qt.UTC)),
'2020-03-04 12:13:14 (UTC)')
self.assertEqual(field_formatter.representValue(layer, 1, config, None,
QDateTime(QDate(2020, 3, 4), QTime(12, 13, 14), Qt.OffsetFromUTC, 3600)),
'2020-03-04 12:13:14 (UTC+01:00)')

# if specific display format is set then use that
config = {"display_format": "dd/MM/yyyy HH:mm:ss"}
self.assertEqual(field_formatter.representValue(layer, 0, config, None,
self.assertEqual(field_formatter.representValue(layer, 1, config, None,
QDateTime(QDate(2020, 3, 4), QTime(12, 13, 14), Qt.UTC)),
'04/03/2020 12:13:14')
self.assertEqual(field_formatter.representValue(layer, 0, config, None,
self.assertEqual(field_formatter.representValue(layer, 1, config, None,
QDateTime(QDate(2020, 3, 4), QTime(12, 13, 14), Qt.OffsetFromUTC, 3600)),
'04/03/2020 12:13:14')

locale_assertions = {
QLocale(QLocale.English): {
"date_format": 'M/d/yy',
"time_format": 'HH:mm:ss',
"datetime_format": 'M/d/yy HH:mm:ss',
"datetime_utc": '3/4/20 12:13:14 (UTC)',
"datetime_utc+1": '3/4/20 12:13:14 (UTC+01:00)'
},
QLocale(QLocale.Finnish): {
"date_format": 'd.M.yyyy',
"time_format": 'HH:mm:ss',
"datetime_format": 'd.M.yyyy HH:mm:ss',
"datetime_utc": '4.3.2020 12:13:14 (UTC)',
"datetime_utc+1": '4.3.2020 12:13:14 (UTC+01:00)'
},
}

for locale, assertions in locale_assertions.items():
QLocale().setDefault(locale)
QgsDateTimeFieldFormatter.applyLocaleChange()
field_formatter = QgsDateTimeFieldFormatter()

self.assertEqual(field_formatter.defaultFormat(QVariant.Date), assertions["date_format"], locale.name())
self.assertEqual(field_formatter.defaultFormat(QVariant.Time), assertions["time_format"], locale.name())
self.assertEqual(field_formatter.defaultFormat(QVariant.DateTime), assertions["datetime_format"], locale.name())

# default configuration should show timezone information
config = {}
self.assertEqual(field_formatter.representValue(layer, 0, config, None,
QDateTime(QDate(2020, 3, 4), QTime(12, 13, 14), Qt.UTC)),
assertions["datetime_utc"], locale.name())
self.assertEqual(field_formatter.representValue(layer, 0, config, None,
QDateTime(QDate(2020, 3, 4), QTime(12, 13, 14), Qt.OffsetFromUTC, 3600)),
assertions["datetime_utc+1"], locale.name())
self.assertEqual(field_formatter.representValue(layer, 1, config, None,
QDate(2020, 3, 4)),
assertions["datetime_utc"].split(" ")[0], locale.name())
config = {"display_format": "HH:mm:s"}
self.assertEqual(field_formatter.representValue(layer, 2, config, None,
QTime(12, 13, 14)),
assertions["datetime_utc"].split(" ")[1], locale.name())


if __name__ == '__main__':
unittest.main()

0 comments on commit 8a22883

Please sign in to comment.