Skip to content

Commit 6b65b42

Browse files
committedNov 30, 2022
[feature] Add key dates to layer/project metadata
This adds the following fields to the QGIS layer/project metadata standard: - Date created - Date published - Date revised - Date superseded (Previously the layer metadata had no date fields, and project metadata had only the created date field)
1 parent 82462b5 commit 6b65b42

File tree

13 files changed

+450
-22
lines changed

13 files changed

+450
-22
lines changed
 

‎python/core/auto_additions/qgis.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2266,3 +2266,11 @@
22662266
Qgis.AttributeActionType.__doc__ = 'Attribute action types.\n\nPrior to QGIS 3.30 this was available as :py:class:`QgsAction`.ActionType\n\n.. versionadded:: 3.30\n\n' + '* ``Generic``: ' + Qgis.AttributeActionType.Generic.__doc__ + '\n' + '* ``GenericPython``: ' + Qgis.AttributeActionType.GenericPython.__doc__ + '\n' + '* ``Mac``: ' + Qgis.AttributeActionType.Mac.__doc__ + '\n' + '* ``Windows``: ' + Qgis.AttributeActionType.Windows.__doc__ + '\n' + '* ``Unix``: ' + Qgis.AttributeActionType.Unix.__doc__ + '\n' + '* ``OpenUrl``: ' + Qgis.AttributeActionType.OpenUrl.__doc__ + '\n' + '* ``SubmitUrlEncoded``: ' + Qgis.AttributeActionType.SubmitUrlEncoded.__doc__ + '\n' + '* ``SubmitUrlMultipart``: ' + Qgis.AttributeActionType.SubmitUrlMultipart.__doc__
22672267
# --
22682268
Qgis.AttributeActionType.baseClass = Qgis
2269+
# monkey patching scoped based enum
2270+
Qgis.MetadataDateType.Created.__doc__ = "Date created"
2271+
Qgis.MetadataDateType.Published.__doc__ = "Date published"
2272+
Qgis.MetadataDateType.Revised.__doc__ = "Date revised"
2273+
Qgis.MetadataDateType.Superseded.__doc__ = "Date superseded"
2274+
Qgis.MetadataDateType.__doc__ = 'Date types for metadata.\n\n.. versionadded:: 3.30\n\n' + '* ``Created``: ' + Qgis.MetadataDateType.Created.__doc__ + '\n' + '* ``Published``: ' + Qgis.MetadataDateType.Published.__doc__ + '\n' + '* ``Revised``: ' + Qgis.MetadataDateType.Revised.__doc__ + '\n' + '* ``Superseded``: ' + Qgis.MetadataDateType.Superseded.__doc__
2275+
# --
2276+
Qgis.MetadataDateType.baseClass = Qgis

‎python/core/auto_generated/metadata/qgsabstractmetadatabase.sip.in

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,24 @@ Adds an individual ``link`` to the existing links.
399399
.. seealso:: :py:func:`links`
400400

401401
.. seealso:: :py:func:`setLinks`
402+
%End
403+
404+
QDateTime dateTime( Qgis::MetadataDateType type ) const;
405+
%Docstring
406+
Returns the date for the specified date ``type``.
407+
408+
.. seealso:: :py:func:`setDateTime`
409+
410+
.. versionadded:: 3.30
411+
%End
412+
413+
void setDateTime( Qgis::MetadataDateType type, QDateTime date );
414+
%Docstring
415+
Sets a date value for the specified date ``type``.
416+
417+
.. seealso:: :py:func:`dateTime`
418+
419+
.. versionadded:: 3.30
402420
%End
403421

404422
virtual bool readMetadataXml( const QDomElement &metadataElement );
@@ -452,6 +470,7 @@ QgsAbstractMetadataBase cannot be instantiated directly, it must be subclassed.
452470

453471

454472

473+
455474
bool equals( const QgsAbstractMetadataBase &other ) const;
456475
%Docstring
457476
Tests whether the common metadata fields in this object are equal to ``other``.

‎python/core/auto_generated/qgis.sip.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,6 +1502,14 @@ The development version
15021502
SubmitUrlMultipart,
15031503
};
15041504

1505+
enum class MetadataDateType
1506+
{
1507+
Created,
1508+
Published,
1509+
Revised,
1510+
Superseded,
1511+
};
1512+
15051513
static const double DEFAULT_SEARCH_RADIUS_MM;
15061514

15071515
static const float DEFAULT_MAPTOPIXEL_THRESHOLD;

‎resources/qgis-base-metadata.xsd

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@
6666
<xs:documentation>Set of descriptive keywords associated with a given resource.</xs:documentation>
6767
</xs:annotation>
6868
</xs:element>
69+
<xs:element name="dates" type="rm:datesType">
70+
<xs:annotation>
71+
<xs:documentation>Set of key dates associated with a given resource.</xs:documentation>
72+
</xs:annotation>
73+
</xs:element>
6974
<xs:element name="contact" type="rm:contactType" maxOccurs="unbounded">
7075
<xs:annotation>
7176
<xs:documentation>Contact person/entity associated with a given resource.</xs:documentation>
@@ -102,6 +107,25 @@
102107
</xs:annotation>
103108
</xs:attribute>
104109
</xs:complexType>
110+
<xs:complexType name="datesType">
111+
<xs:sequence>
112+
<xs:element name="date" maxOccurs="unbounded">
113+
<xs:annotation>
114+
<xs:documentation>A dates associated with a resource.</xs:documentation>
115+
</xs:annotation>
116+
<xs:attribute name="type" type="xs:string">
117+
<xs:annotation>
118+
<xs:documentation>Date type, valid values are Created, Published, Revised, Superseded.</xs:documentation>
119+
</xs:annotation>
120+
</xs:attribute>
121+
<xs:attribute name="value" type="xs:dateTime">
122+
<xs:annotation>
123+
<xs:documentation>Associated datetime value.</xs:documentation>
124+
</xs:annotation>
125+
</xs:attribute>
126+
</xs:element>
127+
</xs:sequence>
128+
</xs:complexType>
105129
<xs:complexType name="contactType">
106130
<xs:sequence>
107131
<xs:element name="name" type="xs:string">

‎src/core/metadata/qgsabstractmetadatabase.cpp

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,19 @@ void QgsAbstractMetadataBase::addLink( const QgsAbstractMetadataBase::Link &link
160160
mLinks << link;
161161
}
162162

163+
QDateTime QgsAbstractMetadataBase::dateTime( Qgis::MetadataDateType type ) const
164+
{
165+
return mDates.value( type );
166+
}
167+
168+
void QgsAbstractMetadataBase::setDateTime( Qgis::MetadataDateType type, QDateTime date )
169+
{
170+
if ( !date.isValid() || date.isNull() )
171+
mDates.remove( type );
172+
else
173+
mDates[type] = date;
174+
}
175+
163176
QString QgsAbstractMetadataBase::language() const
164177
{
165178
return mLanguage;
@@ -281,6 +294,24 @@ bool QgsAbstractMetadataBase::readMetadataXml( const QDomElement &metadataElemen
281294
}
282295
setHistory( historyList );
283296

297+
{
298+
mDates.clear();
299+
const QDomElement dateElement = metadataElement.firstChildElement( QStringLiteral( "dates" ) );
300+
if ( !dateElement.isNull() )
301+
{
302+
const QDomNodeList dateNodeList = dateElement.elementsByTagName( QStringLiteral( "date" ) );
303+
const QMetaEnum dateEnum = QMetaEnum::fromType<Qgis::MetadataDateType>();
304+
for ( int i = 0; i < dateNodeList.size(); i++ )
305+
{
306+
const QDomElement dateElement = dateNodeList.at( i ).toElement();
307+
const Qgis::MetadataDateType type = static_cast< Qgis::MetadataDateType >( dateEnum.keyToValue( dateElement.attribute( QStringLiteral( "type" ) ).toStdString().c_str() ) );
308+
const QDateTime value = QDateTime::fromString( dateElement.attribute( QStringLiteral( "value" ) ), Qt::ISODate );
309+
if ( value.isValid() && !value.isNull() )
310+
mDates.insert( type, value );
311+
}
312+
}
313+
}
314+
284315
return true;
285316
}
286317

@@ -429,6 +460,24 @@ bool QgsAbstractMetadataBase::writeMetadataXml( QDomElement &metadataElement, QD
429460
metadataElement.appendChild( historyElement );
430461
}
431462

463+
// dates
464+
{
465+
const QMetaEnum dateEnum = QMetaEnum::fromType<Qgis::MetadataDateType>();
466+
QDomElement datesElement = document.createElement( QStringLiteral( "dates" ) );
467+
for ( int k = 0; k < dateEnum.keyCount(); k++ )
468+
{
469+
const Qgis::MetadataDateType type = static_cast< Qgis::MetadataDateType >( dateEnum.value( k ) );
470+
if ( mDates.contains( type ) && mDates.value( type ).isValid() )
471+
{
472+
QDomElement dateElement = document.createElement( QStringLiteral( "date" ) );
473+
dateElement.setAttribute( QStringLiteral( "type" ), dateEnum.valueToKey( static_cast< int >( type ) ) );
474+
dateElement.setAttribute( QStringLiteral( "value" ), mDates.value( type ).toString( Qt::ISODate ) );
475+
datesElement.appendChild( dateElement );
476+
}
477+
}
478+
metadataElement.appendChild( datesElement );
479+
}
480+
432481
return true;
433482
}
434483

@@ -466,6 +515,17 @@ void QgsAbstractMetadataBase::combine( const QgsAbstractMetadataBase *other )
466515

467516
if ( !other->links().isEmpty() )
468517
mLinks = other->links();
518+
519+
const QMetaEnum dateEnum = QMetaEnum::fromType<Qgis::MetadataDateType>();
520+
for ( int k = 0; k < dateEnum.keyCount(); k++ )
521+
{
522+
const Qgis::MetadataDateType type = static_cast< Qgis::MetadataDateType >( dateEnum.value( k ) );
523+
if ( other->mDates.contains( type ) && other->mDates.value( type ).isValid() )
524+
{
525+
mDates.insert( type, other->mDates[type] );
526+
}
527+
}
528+
469529
}
470530

471531
bool QgsAbstractMetadataBase::equals( const QgsAbstractMetadataBase &metadataOther ) const
@@ -479,7 +539,8 @@ bool QgsAbstractMetadataBase::equals( const QgsAbstractMetadataBase &metadataOth
479539
( mHistory == metadataOther.mHistory ) &&
480540
( mKeywords == metadataOther.mKeywords ) &&
481541
( mContacts == metadataOther.mContacts ) &&
482-
( mLinks == metadataOther.mLinks ) );
542+
( mLinks == metadataOther.mLinks ) &&
543+
( mDates == metadataOther.mDates ) );
483544
}
484545

485546

‎src/core/metadata/qgsabstractmetadatabase.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "qgis_sip.h"
2222
#include "qgis_core.h"
23+
#include "qgis.h"
2324
#include <QMap>
2425
#include <QString>
2526
#include <QMetaType>
@@ -502,6 +503,22 @@ class CORE_EXPORT QgsAbstractMetadataBase
502503
*/
503504
void addLink( const QgsAbstractMetadataBase::Link &link );
504505

506+
/**
507+
* Returns the date for the specified date \a type.
508+
*
509+
* \see setDateTime()
510+
* \since QGIS 3.30
511+
*/
512+
QDateTime dateTime( Qgis::MetadataDateType type ) const;
513+
514+
/**
515+
* Sets a date value for the specified date \a type.
516+
*
517+
* \see dateTime()
518+
* \since QGIS 3.30
519+
*/
520+
void setDateTime( Qgis::MetadataDateType type, QDateTime date );
521+
505522
/**
506523
* Sets state from DOM document.
507524
*
@@ -572,6 +589,9 @@ class CORE_EXPORT QgsAbstractMetadataBase
572589

573590
QgsAbstractMetadataBase::LinkList mLinks;
574591

592+
//! Metadata dates
593+
QMap< Qgis::MetadataDateType, QDateTime > mDates;
594+
575595
/*
576596
* IMPORTANT!!!!!!
577597
*

‎src/core/metadata/qgsprojectmetadata.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,13 @@ bool QgsProjectMetadata::readMetadataXml( const QDomElement &metadataElement )
2929
mnl = metadataElement.namedItem( QStringLiteral( "author" ) );
3030
mAuthor = mnl.toElement().text();
3131

32-
// creation datetime
33-
mnl = metadataElement.namedItem( QStringLiteral( "creation" ) );
34-
mCreationDateTime = QDateTime::fromString( mnl.toElement().text(), Qt::ISODate );
32+
if ( !mDates.contains( Qgis::MetadataDateType::Created ) )
33+
{
34+
// creation datetime -- old format
35+
mnl = metadataElement.namedItem( QStringLiteral( "creation" ) );
36+
const QDateTime creationDateTime = QDateTime::fromString( mnl.toElement().text(), Qt::ISODate );
37+
mDates.insert( Qgis::MetadataDateType::Created, creationDateTime );
38+
}
3539

3640
return true;
3741
}
@@ -48,7 +52,7 @@ bool QgsProjectMetadata::writeMetadataXml( QDomElement &metadataElement, QDomDoc
4852

4953
// creation datetime
5054
QDomElement creation = document.createElement( QStringLiteral( "creation" ) );
51-
const QDomText creationText = document.createTextNode( mCreationDateTime.toString( Qt::ISODate ) );
55+
const QDomText creationText = document.createTextNode( mDates.value( Qgis::MetadataDateType::Created ).toString( Qt::ISODate ) );
5256
creation.appendChild( creationText );
5357
metadataElement.appendChild( creation );
5458

@@ -63,17 +67,13 @@ void QgsProjectMetadata::combine( const QgsAbstractMetadataBase *other )
6367
{
6468
if ( !otherProjectMetadata->author().isEmpty() )
6569
mAuthor = otherProjectMetadata->author();
66-
67-
if ( otherProjectMetadata->creationDateTime().isValid() )
68-
mCreationDateTime = otherProjectMetadata->creationDateTime();
6970
}
7071
}
7172

7273
bool QgsProjectMetadata::operator==( const QgsProjectMetadata &metadataOther ) const
7374
{
7475
return equals( metadataOther ) &&
75-
mAuthor == metadataOther.mAuthor &&
76-
mCreationDateTime == metadataOther.mCreationDateTime ;
76+
mAuthor == metadataOther.mAuthor;
7777
}
7878

7979
QgsProjectMetadata *QgsProjectMetadata::clone() const
@@ -93,10 +93,10 @@ void QgsProjectMetadata::setAuthor( const QString &author )
9393

9494
QDateTime QgsProjectMetadata::creationDateTime() const
9595
{
96-
return mCreationDateTime;
96+
return mDates.value( Qgis::MetadataDateType::Created );
9797
}
9898

9999
void QgsProjectMetadata::setCreationDateTime( const QDateTime &creationDateTime )
100100
{
101-
mCreationDateTime = creationDateTime;
101+
mDates[ Qgis::MetadataDateType::Created ] = creationDateTime;
102102
}

‎src/core/metadata/qgsprojectmetadata.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ class CORE_EXPORT QgsProjectMetadata : public QgsAbstractMetadataBase
103103

104104
QString mAuthor;
105105

106-
QDateTime mCreationDateTime;
107-
108106
/*
109107
* IMPORTANT!!!!!!
110108
*

‎src/core/qgis.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2613,6 +2613,20 @@ class CORE_EXPORT Qgis
26132613
};
26142614
Q_ENUM( AttributeActionType )
26152615

2616+
/**
2617+
* Date types for metadata.
2618+
*
2619+
* \since QGIS 3.30
2620+
*/
2621+
enum class MetadataDateType
2622+
{
2623+
Created, //!< Date created
2624+
Published, //!< Date published
2625+
Revised, //!< Date revised
2626+
Superseded, //!< Date superseded
2627+
};
2628+
Q_ENUM( MetadataDateType )
2629+
26162630
/**
26172631
* Identify search radius in mm
26182632
* \since QGIS 2.3

‎src/gui/qgsmetadatawidget.cpp

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,19 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
8383
mHistoryModel = new QStringListModel( listHistory );
8484
listHistory->setModel( mHistoryModel );
8585

86+
for ( QgsDateTimeEdit *w :
87+
{
88+
mCreationDateTimeEdit,
89+
mCreationDateTimeEdit2,
90+
mPublishedDateTimeEdit,
91+
mRevisedDateTimeEdit,
92+
mSupersededDateTimeEdit
93+
} )
94+
{
95+
w->setAllowNull( true );
96+
w->setNullRepresentation( tr( "Not set" ) );
97+
}
98+
8699
// Connect signals and slots
87100
connect( tabWidget, &QTabWidget::currentChanged, this, &QgsMetadataWidget::updatePanel );
88101
connect( btnAutoSource, &QPushButton::clicked, this, &QgsMetadataWidget::fillSourceFromLayer );
@@ -147,6 +160,23 @@ void QgsMetadataWidget::setMode( QgsMetadataWidget::Mode mode )
147160
tabWidget->removeTab( 4 );
148161
tabWidget->removeTab( 3 );
149162
btnAutoSource->setEnabled( true );
163+
164+
// these two widgets should be kept in sync
165+
connect( mCreationDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, [ = ]( const QDateTime & value )
166+
{
167+
if ( value.isValid() )
168+
mCreationDateTimeEdit2->setDateTime( value );
169+
else if ( mCreationDateTimeEdit2->dateTime().isValid() )
170+
mCreationDateTimeEdit2->clear();
171+
} );
172+
connect( mCreationDateTimeEdit2, &QDateTimeEdit::dateTimeChanged, this, [ = ]( const QDateTime & value )
173+
{
174+
if ( value.isValid() )
175+
mCreationDateTimeEdit->setDateTime( value );
176+
else if ( mCreationDateTimeEdit->dateTime().isValid() )
177+
mCreationDateTimeEdit->clear();
178+
} );
179+
150180
break;
151181
}
152182

@@ -583,7 +613,6 @@ void QgsMetadataWidget::setUiFromMetadata()
583613
else if ( QgsProjectMetadata *projectMetadata = dynamic_cast< QgsProjectMetadata * >( mMetadata.get() ) )
584614
{
585615
mLineEditAuthor->setText( projectMetadata->author() );
586-
mCreationDateTimeEdit->setDateTime( projectMetadata->creationDateTime() );
587616
}
588617

589618
// Contacts
@@ -635,6 +664,27 @@ void QgsMetadataWidget::setUiFromMetadata()
635664

636665
// History
637666
mHistoryModel->setStringList( mMetadata->history() );
667+
668+
// dates
669+
if ( mMetadata->dateTime( Qgis::MetadataDateType::Created ).isValid() )
670+
mCreationDateTimeEdit2->setDateTime( mMetadata->dateTime( Qgis::MetadataDateType::Created ) );
671+
else
672+
mCreationDateTimeEdit2->clear();
673+
674+
if ( mMetadata->dateTime( Qgis::MetadataDateType::Published ).isValid() )
675+
mPublishedDateTimeEdit->setDateTime( mMetadata->dateTime( Qgis::MetadataDateType::Published ) );
676+
else
677+
mPublishedDateTimeEdit->clear();
678+
679+
if ( mMetadata->dateTime( Qgis::MetadataDateType::Revised ).isValid() )
680+
mRevisedDateTimeEdit->setDateTime( mMetadata->dateTime( Qgis::MetadataDateType::Revised ) );
681+
else
682+
mRevisedDateTimeEdit->clear();
683+
684+
if ( mMetadata->dateTime( Qgis::MetadataDateType::Superseded ).isValid() )
685+
mSupersededDateTimeEdit->setDateTime( mMetadata->dateTime( Qgis::MetadataDateType::Superseded ) );
686+
else
687+
mSupersededDateTimeEdit->clear();
638688
}
639689

640690
void QgsMetadataWidget::saveMetadata( QgsAbstractMetadataBase *metadata )
@@ -718,7 +768,6 @@ void QgsMetadataWidget::saveMetadata( QgsAbstractMetadataBase *metadata )
718768
{
719769
QgsProjectMetadata *projectMetadata = static_cast< QgsProjectMetadata * >( metadata );
720770
projectMetadata->setAuthor( mLineEditAuthor->text() );
721-
projectMetadata->setCreationDateTime( mCreationDateTimeEdit->dateTime() );
722771
break;
723772
}
724773
}
@@ -770,6 +819,12 @@ void QgsMetadataWidget::saveMetadata( QgsAbstractMetadataBase *metadata )
770819

771820
// History
772821
metadata->setHistory( mHistoryModel->stringList() );
822+
823+
// dates
824+
metadata->setDateTime( Qgis::MetadataDateType::Created, mCreationDateTimeEdit2->dateTime() );
825+
metadata->setDateTime( Qgis::MetadataDateType::Published, mPublishedDateTimeEdit->dateTime() );
826+
metadata->setDateTime( Qgis::MetadataDateType::Revised, mRevisedDateTimeEdit->dateTime() );
827+
metadata->setDateTime( Qgis::MetadataDateType::Superseded, mSupersededDateTimeEdit->dateTime() );
773828
}
774829

775830
bool QgsMetadataWidget::checkMetadata()

‎src/ui/qgsmetadatawidget.ui

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
<x>0</x>
6969
<y>0</y>
7070
<width>786</width>
71-
<height>670</height>
71+
<height>687</height>
7272
</rect>
7373
</property>
7474
<layout class="QVBoxLayout" name="verticalLayout_15">
@@ -205,7 +205,7 @@
205205
</widget>
206206
</item>
207207
<item row="2" column="1">
208-
<widget class="QDateTimeEdit" name="mCreationDateTimeEdit">
208+
<widget class="QgsDateTimeEdit" name="mCreationDateTimeEdit">
209209
<property name="displayFormat">
210210
<string>yyyy-MM-dd HH:mm:ss</string>
211211
</property>
@@ -669,7 +669,7 @@
669669
<x>0</x>
670670
<y>0</y>
671671
<width>800</width>
672-
<height>637</height>
672+
<height>636</height>
673673
</rect>
674674
</property>
675675
<layout class="QVBoxLayout" name="verticalLayout_16">
@@ -1075,7 +1075,7 @@
10751075
<x>0</x>
10761076
<y>0</y>
10771077
<width>778</width>
1078-
<height>592</height>
1078+
<height>590</height>
10791079
</rect>
10801080
</property>
10811081
<layout class="QGridLayout" name="gridLayout_2">
@@ -1403,6 +1403,95 @@
14031403
<string>History</string>
14041404
</attribute>
14051405
<layout class="QVBoxLayout" name="verticalLayout_17">
1406+
<item>
1407+
<widget class="QgsCollapsibleGroupBox" name="groupBox_2">
1408+
<property name="title">
1409+
<string>Key Dates</string>
1410+
</property>
1411+
<layout class="QGridLayout" name="gridLayout_3">
1412+
<item row="0" column="1">
1413+
<widget class="QgsDateTimeEdit" name="mCreationDateTimeEdit2">
1414+
<property name="displayFormat">
1415+
<string>yyyy-MM-dd HH:mm:ss</string>
1416+
</property>
1417+
<property name="calendarPopup">
1418+
<bool>true</bool>
1419+
</property>
1420+
</widget>
1421+
</item>
1422+
<item row="1" column="1">
1423+
<widget class="QgsDateTimeEdit" name="mPublishedDateTimeEdit">
1424+
<property name="displayFormat">
1425+
<string>yyyy-MM-dd HH:mm:ss</string>
1426+
</property>
1427+
<property name="calendarPopup">
1428+
<bool>true</bool>
1429+
</property>
1430+
</widget>
1431+
</item>
1432+
<item row="2" column="0">
1433+
<widget class="QLabel" name="label_17">
1434+
<property name="toolTip">
1435+
<string>Returns the human readable name of the resource, typically displayed in search results.</string>
1436+
</property>
1437+
<property name="text">
1438+
<string>Revised</string>
1439+
</property>
1440+
</widget>
1441+
</item>
1442+
<item row="2" column="1">
1443+
<widget class="QgsDateTimeEdit" name="mRevisedDateTimeEdit">
1444+
<property name="displayFormat">
1445+
<string>yyyy-MM-dd HH:mm:ss</string>
1446+
</property>
1447+
<property name="calendarPopup">
1448+
<bool>true</bool>
1449+
</property>
1450+
</widget>
1451+
</item>
1452+
<item row="1" column="0">
1453+
<widget class="QLabel" name="label_25">
1454+
<property name="toolTip">
1455+
<string>Returns the human readable name of the resource, typically displayed in search results.</string>
1456+
</property>
1457+
<property name="text">
1458+
<string>Published</string>
1459+
</property>
1460+
</widget>
1461+
</item>
1462+
<item row="3" column="1">
1463+
<widget class="QgsDateTimeEdit" name="mSupersededDateTimeEdit">
1464+
<property name="displayFormat">
1465+
<string>yyyy-MM-dd HH:mm:ss</string>
1466+
</property>
1467+
<property name="calendarPopup">
1468+
<bool>true</bool>
1469+
</property>
1470+
</widget>
1471+
</item>
1472+
<item row="0" column="0">
1473+
<widget class="QLabel" name="label_16">
1474+
<property name="toolTip">
1475+
<string>Returns the human readable name of the resource, typically displayed in search results.</string>
1476+
</property>
1477+
<property name="text">
1478+
<string>Created</string>
1479+
</property>
1480+
</widget>
1481+
</item>
1482+
<item row="3" column="0">
1483+
<widget class="QLabel" name="label_30">
1484+
<property name="toolTip">
1485+
<string>Returns the human readable name of the resource, typically displayed in search results.</string>
1486+
</property>
1487+
<property name="text">
1488+
<string>Superseded</string>
1489+
</property>
1490+
</widget>
1491+
</item>
1492+
</layout>
1493+
</widget>
1494+
</item>
14061495
<item>
14071496
<widget class="QLabel" name="mLabelHistory">
14081497
<property name="text">
@@ -1567,13 +1656,18 @@
15671656
<tabstop>btnAddLink</tabstop>
15681657
<tabstop>btnRemoveLink</tabstop>
15691658
<tabstop>tabLinks</tabstop>
1659+
<tabstop>mCreationDateTimeEdit2</tabstop>
1660+
<tabstop>mPublishedDateTimeEdit</tabstop>
1661+
<tabstop>mRevisedDateTimeEdit</tabstop>
1662+
<tabstop>mSupersededDateTimeEdit</tabstop>
15701663
<tabstop>btnAddHistory</tabstop>
15711664
<tabstop>btnRemoveHistory</tabstop>
15721665
<tabstop>listHistory</tabstop>
15731666
<tabstop>resultsCheckMetadata</tabstop>
15741667
</tabstops>
15751668
<resources>
15761669
<include location="../../images/images.qrc"/>
1670+
<include location="../../images/images.qrc"/>
15771671
</resources>
15781672
<connections/>
15791673
</ui>

‎tests/src/python/test_qgsmetadatabase.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
QgsVectorLayer,
2222
QgsNativeMetadataBaseValidator,
2323
QgsBox3d,
24-
QgsDateTimeRange)
24+
QgsDateTimeRange,
25+
Qgis)
2526
from qgis.PyQt.QtCore import (QDate,
2627
QTime,
2728
QDateTime)
@@ -67,6 +68,16 @@ def testGettersSetters(self):
6768
m.addHistoryItem('panicked and deleted more')
6869
self.assertEqual(m.history(), ['accidentally deleted some features', 'panicked and deleted more'])
6970

71+
m.setDateTime(Qgis.MetadataDateType.Published, QDateTime(QDate(2022, 1, 2), QTime(12, 13, 14)))
72+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published), QDateTime(QDate(2022, 1, 2), QTime(12, 13, 14)))
73+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Created),
74+
QDateTime())
75+
m.setDateTime(Qgis.MetadataDateType.Created,
76+
QDateTime(QDate(2020, 1, 2), QTime(12, 13, 14)))
77+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published), QDateTime(QDate(2022, 1, 2), QTime(12, 13, 14)))
78+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Created),
79+
QDateTime(QDate(2020, 1, 2), QTime(12, 13, 14)))
80+
7081
def testEquality(self):
7182
a = QgsAbstractMetadataBase.Address()
7283
a.type = 'postal'
@@ -342,6 +353,14 @@ def createTestMetadata(self):
342353

343354
m.setLinks([l, l2, l3])
344355

356+
m.setDateTime(Qgis.MetadataDateType.Created, QDateTime(QDate(2020, 1, 2), QTime(11, 12, 13)))
357+
m.setDateTime(Qgis.MetadataDateType.Published,
358+
QDateTime(QDate(2020, 1, 3), QTime(11, 12, 13)))
359+
m.setDateTime(Qgis.MetadataDateType.Revised,
360+
QDateTime(QDate(2020, 1, 4), QTime(11, 12, 13)))
361+
m.setDateTime(Qgis.MetadataDateType.Superseded,
362+
QDateTime(QDate(2020, 1, 5), QTime(11, 12, 13)))
363+
345364
return m
346365

347366
def checkExpectedMetadata(self, m):
@@ -388,6 +407,14 @@ def checkExpectedMetadata(self, m):
388407
self.assertEqual(m.links()[2].mimeType, 'application/gzip')
389408
self.assertEqual(m.links()[2].size, '283676')
390409

410+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Created), QDateTime(QDate(2020, 1, 2), QTime(11, 12, 13)))
411+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published),
412+
QDateTime(QDate(2020, 1, 3), QTime(11, 12, 13)))
413+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Revised),
414+
QDateTime(QDate(2020, 1, 4), QTime(11, 12, 13)))
415+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Superseded),
416+
QDateTime(QDate(2020, 1, 5), QTime(11, 12, 13)))
417+
391418
def testStandard(self):
392419
m = self.createTestMetadata()
393420
self.checkExpectedMetadata(m)
@@ -623,6 +650,19 @@ def testCombine(self):
623650
m1.combine(m2)
624651
self.assertEqual(m1.links(), [QgsAbstractMetadataBase.Link('l2'), QgsAbstractMetadataBase.Link('ll2')])
625652

653+
m1.setDateTime(Qgis.MetadataDateType.Created, QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)))
654+
m1.setDateTime(Qgis.MetadataDateType.Revised, QDateTime(QDate(2020, 1, 3), QTime(1, 2, 3)))
655+
656+
m2.setDateTime(Qgis.MetadataDateType.Revised, QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))
657+
m2.setDateTime(Qgis.MetadataDateType.Superseded, QDateTime(QDate(2020, 1, 5), QTime(1, 2, 3)))
658+
m1.combine(m2)
659+
660+
self.assertEqual(m1.dateTime(Qgis.MetadataDateType.Created), QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)))
661+
self.assertEqual(m1.dateTime(Qgis.MetadataDateType.Revised),
662+
QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))
663+
self.assertEqual(m1.dateTime(Qgis.MetadataDateType.Superseded),
664+
QDateTime(QDate(2020, 1, 5), QTime(1, 2, 3)))
665+
626666

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

‎tests/src/python/test_qgsmetadatawidget.py

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
from qgis.PyQt.QtXml import QDomDocument
1818

19-
from qgis.core import (QgsCoordinateReferenceSystem,
19+
from qgis.core import (Qgis,
20+
QgsCoordinateReferenceSystem,
2021
QgsAbstractMetadataBase,
2122
QgsLayerMetadata,
2223
QgsProjectMetadata,
@@ -113,6 +114,12 @@ def testLayerMode(self):
113114

114115
m.setLinks([l, l2, l3])
115116

117+
m.setDateTime(Qgis.MetadataDateType.Published, QDateTime(QDate(2020, 1, 2), QTime(3, 4, 5)))
118+
m.setDateTime(Qgis.MetadataDateType.Revised,
119+
QDateTime(QDate(2020, 1, 3), QTime(3, 4, 5)))
120+
m.setDateTime(Qgis.MetadataDateType.Superseded,
121+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
122+
116123
# set widget metadata
117124
w.setMetadata(m)
118125
self.assertEqual(w.mode(), QgsMetadataWidget.LayerMetadata)
@@ -176,6 +183,86 @@ def testLayerMode(self):
176183
self.assertEqual(m.links()[2].mimeType, 'application/gzip')
177184
self.assertEqual(m.links()[2].size, '283676')
178185

186+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published), QDateTime(QDate(2020, 1, 2), QTime(3, 4, 5)))
187+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Revised),
188+
QDateTime(QDate(2020, 1, 3), QTime(3, 4, 5)))
189+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Superseded),
190+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
191+
192+
def testDates(self):
193+
"""
194+
Test date handling
195+
"""
196+
w = QgsMetadataWidget()
197+
198+
m = QgsLayerMetadata()
199+
200+
m.setDateTime(Qgis.MetadataDateType.Created,
201+
QDateTime(QDate(2020, 1, 2), QTime(3, 4, 5)))
202+
m.setDateTime(Qgis.MetadataDateType.Superseded,
203+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
204+
205+
# set widget metadata
206+
w.setMetadata(m)
207+
208+
m = w.metadata()
209+
210+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Created),
211+
QDateTime(QDate(2020, 1, 2), QTime(3, 4, 5)))
212+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published),
213+
QDateTime())
214+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Revised),
215+
QDateTime())
216+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Superseded),
217+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
218+
219+
# with project metadata
220+
w = QgsMetadataWidget()
221+
222+
m = QgsProjectMetadata()
223+
224+
m.setDateTime(Qgis.MetadataDateType.Created,
225+
QDateTime(QDate(2020, 1, 2), QTime(3, 4, 5)))
226+
m.setDateTime(Qgis.MetadataDateType.Superseded,
227+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
228+
229+
# set widget metadata
230+
w.setMetadata(m)
231+
232+
m = w.metadata()
233+
234+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Created),
235+
QDateTime(QDate(2020, 1, 2), QTime(3, 4, 5)))
236+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published),
237+
QDateTime())
238+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Revised),
239+
QDateTime())
240+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Superseded),
241+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
242+
243+
w = QgsMetadataWidget()
244+
245+
m = QgsProjectMetadata()
246+
247+
m.setDateTime(Qgis.MetadataDateType.Created,
248+
QDateTime())
249+
m.setDateTime(Qgis.MetadataDateType.Superseded,
250+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
251+
252+
# set widget metadata
253+
w.setMetadata(m)
254+
255+
m = w.metadata()
256+
257+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Created),
258+
QDateTime())
259+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Published),
260+
QDateTime())
261+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Revised),
262+
QDateTime())
263+
self.assertEqual(m.dateTime(Qgis.MetadataDateType.Superseded),
264+
QDateTime(QDate(2020, 1, 4), QTime(3, 4, 5)))
265+
179266
def testProjectMode(self):
180267
"""
181268
Create a fully populated QgsProjectMetadata object, then set it to the widget and re-read back

0 commit comments

Comments
 (0)
Please sign in to comment.