def test_suggest_strategy(self): """ Test suggesting a split strategy """ # with both start and end date specified fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1980, 1, 1, 0, 0, 0), event_end_date=QDateTime(2000, 1, 1, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_YEAR) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1980, 1, 1, 0, 0, 0), event_end_date=QDateTime(1981, 1, 1, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_MONTH) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1980, 1, 1, 0, 0, 0), event_end_date=QDateTime(1980, 1, 30, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_DAY) # with only end date specified SERVICE_MANAGER.services[ServiceManager.FDSNEVENT]['EMSC-CSEM'][ "datestart"] = "1998-01-01T00:00:00+00:00" fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_end_date=QDateTime(2003, 1, 30, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_YEAR) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_end_date=QDateTime(1998, 5, 30, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_MONTH) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_end_date=QDateTime(1998, 1, 30, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_DAY) # with only start date specified SERVICE_MANAGER.services[ServiceManager.FDSNEVENT]['EMSC-CSEM'][ "dateend"] = "1998-05-01T00:00:00+00:00" fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1991, 1, 30, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_YEAR) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1998, 1, 1, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_MONTH) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1998, 4, 20, 0, 0, 0)) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_DAY) # service doesn't have a fixed end date SERVICE_MANAGER.services[ ServiceManager.FDSNEVENT]['EMSC-CSEM']["dateend"] = None start_date = QDateTime.currentDateTime().addYears(-10) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=start_date) start_date = QDateTime.currentDateTime().addMonths(-10) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_YEAR) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=start_date) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_MONTH) start_date = QDateTime.currentDateTime().addDays(-10) fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=start_date) self.assertEqual(fetcher.suggest_split_strategy(), Fetcher.SPLIT_STRATEGY_DAY)
def testValidateNative(self): # spellok """ Test validating metadata against QGIS native schema """ m = self.createTestMetadata() v = QgsNativeProjectMetadataValidator() res, list = v.validate(m) self.assertTrue(res) self.assertFalse(list) # corrupt metadata piece by piece... m = self.createTestMetadata() m.setIdentifier('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'identifier') m = self.createTestMetadata() m.setLanguage('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'language') m = self.createTestMetadata() m.setType('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'type') m = self.createTestMetadata() m.setTitle('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'title') m = self.createTestMetadata() m.setAbstract('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'abstract') m = self.createTestMetadata() m.setContacts([]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'contacts') m = self.createTestMetadata() m.setLinks([]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') m = self.createTestMetadata() m.setKeywords({'': ['kw1', 'kw2']}) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'keywords') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() m.setKeywords({'AA': []}) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'keywords') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() c = m.contacts()[0] c.name = '' m.setContacts([c]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'contacts') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() l = m.links()[0] l.name = '' m.setLinks([l]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() l = m.links()[0] l.type = '' m.setLinks([l]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() l = m.links()[0] l.url = '' m.setLinks([l]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() m.setAuthor('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'author') m = self.createTestMetadata() m.setCreationDateTime(QDateTime()) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'creation')
def testExpression(self): """ test aggregate calculation using an expression """ # numeric layer = QgsVectorLayer("Point?field=fldint:integer", "layer", "memory") pr = layer.dataProvider() int_values = [4, 2, 3, 2, 5, None, 8] features = [] for v in int_values: f = QgsFeature() f.setFields(layer.fields()) f.setAttributes([v]) features.append(f) assert pr.addFeatures(features) # int agg = QgsAggregateCalculator(layer) val, ok = agg.calculate(QgsAggregateCalculator.Sum, 'fldint * 2') self.assertTrue(ok) self.assertEqual(val, 48) # double val, ok = agg.calculate(QgsAggregateCalculator.Sum, 'fldint * 1.5') self.assertTrue(ok) self.assertEqual(val, 36) # datetime val, ok = agg.calculate( QgsAggregateCalculator.Max, "to_date('2012-05-04') + to_interval( fldint || ' day' )") self.assertTrue(ok) self.assertEqual(val, QDateTime(QDate(2012, 5, 12), QTime(0, 0, 0))) # date val, ok = agg.calculate( QgsAggregateCalculator.Min, "to_date(to_date('2012-05-04') + to_interval( fldint || ' day' ))") self.assertTrue(ok) self.assertEqual(val, QDateTime(QDate(2012, 5, 6), QTime(0, 0, 0))) # string val, ok = agg.calculate(QgsAggregateCalculator.Max, "fldint || ' oranges'") self.assertTrue(ok) self.assertEqual(val, '8 oranges') # geometry val, ok = agg.calculate(QgsAggregateCalculator.GeometryCollect, "make_point( coalesce(fldint,0), 2 )") self.assertTrue(ok) self.assertTrue(val.asWkt(), 'MultiPoint((4 2, 2 2, 3 2, 2 2,5 2, 0 2,8 2))') # try a bad expression val, ok = agg.calculate(QgsAggregateCalculator.Max, "not_a_field || ' oranges'") self.assertFalse(ok) val, ok = agg.calculate(QgsAggregateCalculator.Max, "5+") self.assertFalse(ok) # test expression context # check default context first # should have layer variables: val, ok = agg.calculate(QgsAggregateCalculator.Min, "@layer_name") self.assertTrue(ok) self.assertEqual(val, 'layer') # but not custom variables: val, ok = agg.calculate(QgsAggregateCalculator.Min, "@my_var") self.assertTrue(ok) self.assertEqual(val, NULL) # test with manual expression context scope = QgsExpressionContextScope() scope.setVariable('my_var', 5) context = QgsExpressionContext() context.appendScope(scope) val, ok = agg.calculate(QgsAggregateCalculator.Min, "@my_var", context) self.assertTrue(ok) self.assertEqual(val, 5)
def testCreateExpression(self): """ Test creating an expression using the widget""" layer = QgsVectorLayer( "Point?field=date:date&field=time:time&field=datetime:datetime", "test", "memory") w = QgsDateTimeSearchWidgetWrapper(layer, 0) config = {"field_format": 'yyyy-MM-dd', "display_format": 'yyyy-MM-dd'} w.setConfig(config) c = w.widget() # first check with date field type c.setDateTime(QDateTime(QDate(2013, 4, 5), QTime())) self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"date" IS NULL') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"date" IS NOT NULL') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"date"=\'2013-04-05\'') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"date"<>\'2013-04-05\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.GreaterThan), '"date">\'2013-04-05\'') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.LessThan), '"date"<\'2013-04-05\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.GreaterThanOrEqualTo), '"date">=\'2013-04-05\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.LessThanOrEqualTo), '"date"<=\'2013-04-05\'') # time field type w = QgsDateTimeSearchWidgetWrapper(layer, 1) config = {"field_format": 'HH:mm:ss', "display_format": 'HH:mm:ss'} w.setConfig(config) c = w.widget() c.setDateTime(QDateTime(QDate(2013, 4, 5), QTime(13, 14, 15))) self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"time" IS NULL') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"time" IS NOT NULL') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"time"=\'13:14:15\'') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"time"<>\'13:14:15\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.GreaterThan), '"time">\'13:14:15\'') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.LessThan), '"time"<\'13:14:15\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.GreaterThanOrEqualTo), '"time">=\'13:14:15\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.LessThanOrEqualTo), '"time"<=\'13:14:15\'') # datetime field type w = QgsDateTimeSearchWidgetWrapper(layer, 2) config = { "field_format": 'yyyy-MM-dd HH:mm:ss', "display_format": 'yyyy-MM-dd HH:mm:ss' } w.setConfig(config) c = w.widget() c.setDateTime(QDateTime(QDate(2013, 4, 5), QTime(13, 14, 15))) self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.IsNull), '"datetime" IS NULL') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.IsNotNull), '"datetime" IS NOT NULL') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.EqualTo), '"datetime"=\'2013-04-05 13:14:15\'') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.NotEqualTo), '"datetime"<>\'2013-04-05 13:14:15\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.GreaterThan), '"datetime">\'2013-04-05 13:14:15\'') self.assertEqual(w.createExpression(QgsSearchWidgetWrapper.LessThan), '"datetime"<\'2013-04-05 13:14:15\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.GreaterThanOrEqualTo), '"datetime">=\'2013-04-05 13:14:15\'') self.assertEqual( w.createExpression(QgsSearchWidgetWrapper.LessThanOrEqualTo), '"datetime"<=\'2013-04-05 13:14:15\'')
def testStats(self): # we test twice, once with values added as a list and once using values # added one-at-a-time dates = [QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2011, 1, 5), QTime(15, 3, 1)), QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)), QDateTime(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)), QDateTime(), QDateTime(QDate(2011, 1, 5), QTime(11, 10, 54))] s = QgsDateTimeStatisticalSummary() self.assertEqual(s.statistics(), QgsDateTimeStatisticalSummary.All) s.calculate(dates) s2 = QgsDateTimeStatisticalSummary() for d in dates: s2.addValue(d) s2.finalize() self.assertEqual(s.count(), 9) self.assertEqual(s2.count(), 9) self.assertEqual(s.countDistinct(), 6) self.assertEqual(s2.countDistinct(), 6) self.assertEqual(set(s.distinctValues()), set([QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2011, 1, 5), QTime(15, 3, 1)), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)), QDateTime(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)), QDateTime(QDate(2011, 1, 5), QTime(11, 10, 54))])) self.assertEqual(s2.distinctValues(), s.distinctValues()) self.assertEqual(s.countMissing(), 2) self.assertEqual(s2.countMissing(), 2) self.assertEqual(s.min(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54))) self.assertEqual(s2.min(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54))) self.assertEqual(s.max(), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1))) self.assertEqual(s2.max(), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1))) self.assertEqual(s.range(), QgsInterval(693871147)) self.assertEqual(s2.range(), QgsInterval(693871147))
def testDualFieldMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=end_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.DateTime) context = QgsVectorLayerTemporalContext() context.setLayer(layer) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeStartAndEndFromFields) props.setStartField('start_field') props.setEndField('end_field') self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" > make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" < make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND ("end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL)' ) props.setEndField('') self.assertEqual( props.createFilterString(context, range), '"start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '"start_field" < make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '"start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL' ) props.setStartField('') props.setEndField('end_field') self.assertEqual( props.createFilterString(context, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '"end_field" > make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL' )
def testExpressionMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=end_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.DateTime) context = QgsVectorLayerTemporalContext() context.setLayer(layer) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeStartAndEndFromExpressions) props.setStartExpression( 'to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')"') props.setEndExpression( 'to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')"') self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(context, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13))' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))' ) props.setEndExpression('') self.assertEqual( props.createFilterString(context, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)' ) props.setStartExpression('') props.setEndExpression( 'to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')"') self.assertEqual( props.createFilterString(context, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)' )
def testEquality(self): # spatial extent extent = QgsLayerMetadata.SpatialExtent() extent.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) extent2 = QgsLayerMetadata.SpatialExtent() extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) self.assertEqual(extent, extent2) extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) self.assertNotEqual(extent, extent2) extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 16.0) self.assertNotEqual(extent, extent2) # extent extent = QgsLayerMetadata.Extent() extent1 = QgsLayerMetadata.SpatialExtent() extent1.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent1.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) extent2 = QgsLayerMetadata.SpatialExtent() extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 16.0) extent.setSpatialExtents([extent1, extent2]) dates = [ QgsDateTimeRange( QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange( QDateTime(QDate(2010, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) ] extent.setTemporalExtents(dates) extent_copy = QgsLayerMetadata.Extent(extent) self.assertEqual(extent, extent_copy) extent_copy.setTemporalExtents([ QgsDateTimeRange( QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange( QDateTime(QDate(2010, 12, 17), QTime(9, 30, 48)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 49))) ]) self.assertNotEqual(extent, extent_copy) extent_copy = QgsLayerMetadata.Extent(extent) extent3 = QgsLayerMetadata.SpatialExtent() extent3.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) extent3.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 19.0) extent_copy.setSpatialExtents([extent1, extent3]) self.assertNotEqual(extent, extent_copy) constraint = QgsLayerMetadata.Constraint('c', 'type1') self.assertEqual(constraint, QgsLayerMetadata.Constraint('c', 'type1')) self.assertNotEqual(constraint, QgsLayerMetadata.Constraint('c2', 'type1')) self.assertNotEqual(constraint, QgsLayerMetadata.Constraint('c', 'type2')) a = QgsLayerMetadata.Address() a.type = 'postal' a.address = '13 north rd' a.city = 'huxleys haven' a.administrativeArea = 'land of the queens' a.postalCode = '4123' a.country = 'straya!' a2 = QgsLayerMetadata.Address(a) self.assertEqual(a, a2) a2.type = 'postal2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.address = 'address2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.city = 'city' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.administrativeArea = 'area2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.postalCode = 'postal2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.country = 'country2' self.assertNotEqual(a, a2) c = QgsLayerMetadata.Contact() c.name = 'name' c.organization = 'org' c.position = 'pos' c.voice = '1500 515 555' c.fax = 'fax' c.email = 'email' c.role = 'role' a = QgsLayerMetadata.Address() a.type = 'postal' a2 = QgsLayerMetadata.Address() a2.type = 'street' c.addresses = [a, a2] c2 = QgsLayerMetadata.Contact(c) self.assertEqual(c, c2) c2.name = 'name2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.organization = 'org2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.position = 'pos2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.voice = 'voice2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.fax = 'fax2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.email = 'email2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.role = 'role2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.addresses = [a2] self.assertNotEqual(c, c2) # link l = QgsLayerMetadata.Link() l.name = 'name' l.type = 'type' l.description = 'desc' l.url = 'url' l.format = 'format' l.mimeType = 'mime' l.size = '112' l2 = QgsLayerMetadata.Link(l) self.assertEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.name = 'name2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.type = 'type2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.description = 'desc2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.url = 'url2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.format = 'format2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.mimeType = 'mime2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.size = '113' self.assertNotEqual(l, l2)
def testProjectMode(self): """ Create a fully populated QgsProjectMetadata object, then set it to the widget and re-read back the generated metadata to ensure that no content is lost. """ w = QgsMetadataWidget() m = QgsProjectMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('project') m.setTitle('roads') m.setAbstract('my roads') m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) c = QgsAbstractMetadataBase.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsAbstractMetadataBase.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsAbstractMetadataBase.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsAbstractMetadataBase.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsAbstractMetadataBase.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) m.setAuthor('my author') m.setCreationDateTime(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) # set widget metadata w.setMetadata(m) self.assertEqual(w.mode(), QgsMetadataWidget.ProjectMetadata) m = w.metadata() self.assertIsInstance(m, QgsProjectMetadata) self.assertEqual(m.identifier(), '1234') self.assertEqual(m.parentIdentifier(), 'xyz') self.assertEqual(m.language(), 'en-CA') self.assertEqual(m.type(), 'project') self.assertEqual(m.title(), 'roads') self.assertEqual(m.abstract(), 'my roads') self.assertEqual(m.history(), ['history a', 'history b']) self.assertEqual(m.keywords(), { 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'] }) self.assertEqual(m.contacts()[0].name, 'John Smith') self.assertEqual(m.contacts()[0].organization, 'ACME') self.assertEqual(m.contacts()[0].position, 'staff') self.assertEqual(m.contacts()[0].voice, '1500 515 555') self.assertEqual(m.contacts()[0].fax, 'xx.xxx.xxx.xxxx') self.assertEqual(m.contacts()[0].email, '*****@*****.**') self.assertEqual(m.contacts()[0].role, 'pointOfContact') self.assertEqual(m.contacts()[0].addresses[0].type, 'postal') self.assertEqual(m.contacts()[0].addresses[0].address, '123 Main Street') self.assertEqual(m.contacts()[0].addresses[0].city, 'anycity') self.assertEqual(m.contacts()[0].addresses[0].administrativeArea, 'anyprovince') self.assertEqual(m.contacts()[0].addresses[0].postalCode, '90210') self.assertEqual(m.contacts()[0].addresses[0].country, 'Canada') self.assertEqual(m.links()[0].name, 'geonode:roads') self.assertEqual(m.links()[0].type, 'OGC:WMS') self.assertEqual(m.links()[0].description, 'my GeoNode road layer') self.assertEqual(m.links()[0].url, 'http://example.org/wms') self.assertEqual(m.links()[1].name, 'geonode:roads') self.assertEqual(m.links()[1].type, 'OGC:WFS') self.assertEqual(m.links()[1].description, 'my GeoNode road layer') self.assertEqual(m.links()[1].url, 'http://example.org/wfs') self.assertEqual(m.links()[2].name, 'roads') self.assertEqual(m.links()[2].type, 'WWW:LINK') self.assertEqual(m.links()[2].description, 'full dataset download') self.assertEqual(m.links()[2].url, 'http://example.org/roads.tgz') self.assertEqual(m.links()[2].format, 'ESRI Shapefile') self.assertEqual(m.links()[2].mimeType, 'application/gzip') self.assertEqual(m.links()[2].size, '283676') self.assertEqual(m.author(), 'my author') self.assertEqual(m.creationDateTime(), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)))
def save_metadata(db_qr, metadata): """ :param db_qr: DBConnector :param metadata: Dict with the following information: QR_METADATA_TOOL QR_METADATA_DATA_SOURCE QR_METADATA_TOLERANCE QR_METADATA_TIMESTAMP QR_METADATA_RULES QR_METADATA_OPTIONS QR_METADATA_PERSON :return: tuple (bool with the result, string with a descriptive message) """ if not hasattr(db_qr.names, "T_ID_F"): db_qr.test_connection() names = db_qr.names layers = {names.ERR_METADATA_T: None, names.ERR_RULE_TYPE_T: None} app.core.get_layers(db_qr, layers, load=True) if not layers: return False, "At least one layer was not found in the QR DB!" metadata_layer = layers[names.ERR_METADATA_T] idx_t_ili_tid = metadata_layer.fields().indexOf(names.T_ILI_TID_F) idx_date = metadata_layer.fields().indexOf( names.ERR_METADATA_T_VALIDATION_DATE_F) idx_data_source = metadata_layer.fields().indexOf( names.ERR_METADATA_T_DATA_SOURCE_F) idx_tool = metadata_layer.fields().indexOf(names.ERR_METADATA_T_TOOL_F) idx_person = metadata_layer.fields().indexOf( names.ERR_METADATA_T_PERSON_F) idx_tolerance = metadata_layer.fields().indexOf( names.ERR_METADATA_T_TOLERANCE_F) idx_rules = metadata_layer.fields().indexOf( names.ERR_METADATA_T_RULES_F) idx_options = metadata_layer.fields().indexOf( names.ERR_METADATA_T_RULE_OPTIONS_F) # Initially, the metadata table had references to QR types, but as soon as we # wanted to save them as ARRAYs in GPKG or PG, ili2db said "no, I cannot handle that." # See https://github.com/claeis/ili2db/issues/438 #dict_rules = {f[names.ERR_ERROR_TYPE_T_CODE_F]:f[names.T_ID_F] for f in layers[names.ERR_RULE_TYPE_T].getFeatures()} #list_rules = str([dict_rules[qr_key] for qr_key in metadata[QR_METADATA_RULES] if qr_key in dict_rules]) time_structure = time.strptime(metadata[QR_METADATA_TIMESTAMP], '%Y%m%d_%H%M%S') iso_timestamp = time.strftime('%Y-%m-%dT%H:%M:%S', time_structure) attr_map = { idx_t_ili_tid: str(uuid.uuid4()), idx_date: QDateTime().fromString(iso_timestamp, Qt.ISODate), idx_data_source: metadata[QR_METADATA_DATA_SOURCE], idx_tool: metadata[QR_METADATA_TOOL], idx_person: metadata[QR_METADATA_PERSON], idx_tolerance: metadata[QR_METADATA_TOLERANCE], idx_rules: "{}: {}".format(len(metadata[QR_METADATA_RULES]), str(metadata[QR_METADATA_RULES])), idx_options: str(metadata[QR_METADATA_OPTIONS]) } metadata_layer.dataProvider().addFeature( QgsVectorLayerUtils().createFeature(metadata_layer, attributes=attr_map)) logger.info(__name__, "Quality rules metadata successfully saved!") return True, "Success!"
def setUpClass(cls): """Run before all tests""" # Create test layer cls.vl = QgsVectorLayer( 'Point?crs=epsg:4326&field=pk:integer&field=cnt:integer&field=name:string(0)&field=name2:string(0)&field=num_char:string&field=dt:datetime&field=date:date&field=time:time&key=pk', 'test', 'memory') assert (cls.vl.isValid()) cls.source = cls.vl.dataProvider() f1 = QgsFeature() f1.setAttributes([ 5, -200, NULL, 'NuLl', '5', QDateTime(QDate(2020, 5, 4), QTime(12, 13, 14)), QDate(2020, 5, 2), QTime(12, 13, 1) ]) f1.setGeometry(QgsGeometry.fromWkt('Point (-71.123 78.23)')) f2 = QgsFeature() f2.setAttributes([3, 300, 'Pear', 'PEaR', '3', NULL, NULL, NULL]) f3 = QgsFeature() f3.setAttributes([ 1, 100, 'Orange', 'oranGe', '1', QDateTime(QDate(2020, 5, 3), QTime(12, 13, 14)), QDate(2020, 5, 3), QTime(12, 13, 14) ]) f3.setGeometry(QgsGeometry.fromWkt('Point (-70.332 66.33)')) f4 = QgsFeature() f4.setAttributes([ 2, 200, 'Apple', 'Apple', '2', QDateTime(QDate(2020, 5, 4), QTime(12, 14, 14)), QDate(2020, 5, 4), QTime(12, 14, 14) ]) f4.setGeometry(QgsGeometry.fromWkt('Point (-68.2 70.8)')) f5 = QgsFeature() f5.setAttributes([ 4, 400, 'Honey', 'Honey', '4', QDateTime(QDate(2021, 5, 4), QTime(13, 13, 14)), QDate(2021, 5, 4), QTime(13, 13, 14) ]) f5.setGeometry(QgsGeometry.fromWkt('Point (-65.32 78.3)')) cls.source.addFeatures([f1, f2, f3, f4, f5]) # poly layer cls.poly_vl = QgsVectorLayer( 'Polygon?crs=epsg:4326&index=yes&field=pk:integer&key=pk', 'test', 'memory') assert (cls.poly_vl.isValid()) cls.poly_provider = cls.poly_vl.dataProvider() f1 = QgsFeature() f1.setAttributes([1]) f1.setGeometry( QgsGeometry.fromWkt( 'Polygon ((-69.0 81.4, -69.0 80.2, -73.7 80.2, -73.7 76.3, -74.9 76.3, -74.9 81.4, -69.0 81.4))' )) f2 = QgsFeature() f2.setAttributes([2]) f2.setGeometry( QgsGeometry.fromWkt( 'Polygon ((-67.6 81.2, -66.3 81.2, -66.3 76.9, -67.6 76.9, -67.6 81.2))' )) f3 = QgsFeature() f3.setAttributes([3]) f3.setGeometry( QgsGeometry.fromWkt( 'Polygon ((-68.4 75.8, -67.5 72.6, -68.6 73.7, -70.2 72.9, -68.4 75.8))' )) f4 = QgsFeature() f4.setAttributes([4]) cls.poly_provider.addFeatures([f1, f2, f3, f4])
def test_temporal_animation(self): """ Test temporal animation logic """ canvas = QgsMapCanvas() self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) controller = QgsTemporalController() canvas.setTemporalController(controller) controller.updateTemporalRange.emit( QgsDateTimeRange(QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)), QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))) # should be no change self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no = QgsTemporalNavigationObject() temporal_no.setTemporalExtents( QgsDateTimeRange(QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)), QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))) temporal_no.setFrameDuration(QgsInterval(0, 0, 0, 0, 1, 0, 0)) canvas.setTemporalController(temporal_no) controller.updateTemporalRange.emit( QgsDateTimeRange(QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)), QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))) # should be no change self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no.setFramesPerSecond(30) temporal_no.pause() temporal_no.setCurrentFrameNumber(6) canvas.refresh() # should be no change - temporal controller is not in animation mode self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no.setNavigationMode(QgsTemporalNavigationObject.Animated) self.assertEqual(canvas.mapSettings().frameRate(), 30) self.assertEqual(canvas.mapSettings().currentFrame(), 6) temporal_no.setCurrentFrameNumber(7) self.assertEqual(canvas.mapSettings().frameRate(), 30) self.assertEqual(canvas.mapSettings().currentFrame(), 6) # switch off animation mode temporal_no.setNavigationMode(QgsTemporalNavigationObject.FixedRange) self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no.setNavigationMode(QgsTemporalNavigationObject.Animated) self.assertEqual(canvas.mapSettings().frameRate(), 30) self.assertEqual(canvas.mapSettings().currentFrame(), 7) temporal_no.setNavigationMode( QgsTemporalNavigationObject.NavigationOff) self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1)
def test_split_range(self): """ Test splitting a date range by strategy """ self.assertEqual( Fetcher.split_range_by_strategy(Fetcher.SPLIT_STRATEGY_YEAR, QDateTime(2020, 1, 1, 1, 1, 1), QDateTime(2022, 1, 1, 1, 1, 1)), [(QDateTime(2020, 1, 1, 1, 1, 1), QDateTime(2021, 1, 1, 1, 1, 1)), (QDateTime(2021, 1, 1, 1, 1, 2), QDateTime(2022, 1, 1, 1, 1, 2))]) self.assertEqual( Fetcher.split_range_by_strategy(Fetcher.SPLIT_STRATEGY_MONTH, QDateTime(2020, 1, 1, 1, 1, 1), QDateTime(2020, 4, 1, 1, 1, 1)), [(QDateTime(2020, 1, 1, 1, 1, 1), QDateTime(2020, 2, 1, 1, 1, 1)), (QDateTime(2020, 2, 1, 1, 1, 2), QDateTime(2020, 3, 1, 1, 1, 2)), (QDateTime(2020, 3, 1, 1, 1, 3), QDateTime(2020, 4, 1, 1, 1, 3))])
def test_split_strategy(self): """ Test split strategy logic """ fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1980, 1, 1, 0, 0, 0), event_end_date=QDateTime(2000, 1, 1, 0, 0, 0), split_strategy=Fetcher.SPLIT_STRATEGY_DAY) self.assertEqual(fetcher.event_start_date_limit, QDateTime(1980, 1, 1, 0, 0, 0)) self.assertEqual(fetcher.event_end_date_limit, QDateTime(2000, 1, 1, 0, 0, 0)) # no explicit start date SERVICE_MANAGER.services[ServiceManager.FDSNEVENT]['EMSC-CSEM'][ "datestart"] = "1998-01-01T00:00:00+00:00" fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_end_date=QDateTime(2000, 1, 1, 0, 0, 0), split_strategy=Fetcher.SPLIT_STRATEGY_DAY) self.assertEqual(fetcher.event_start_date_limit, QDateTime(1998, 1, 1, 0, 0, 0, 0, Qt.UTC)) self.assertEqual(fetcher.event_end_date_limit, QDateTime(2000, 1, 1, 0, 0, 0)) # no explicit end date SERVICE_MANAGER.services[ServiceManager.FDSNEVENT]['EMSC-CSEM'][ "dateend"] = "1998-01-01T00:00:00+00:00" fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1997, 1, 1, 0, 0, 0), split_strategy=Fetcher.SPLIT_STRATEGY_DAY) self.assertEqual(fetcher.event_start_date_limit, QDateTime(1997, 1, 1, 0, 0, 0, 0)) self.assertEqual(fetcher.event_end_date_limit, QDateTime(1998, 1, 1, 0, 0, 0, 0, Qt.UTC)) SERVICE_MANAGER.services[ ServiceManager.FDSNEVENT]['EMSC-CSEM']["dateend"] = '' fetcher = Fetcher(ServiceManager.FDSNEVENT, "EMSC-CSEM", event_start_date=QDateTime(1997, 1, 1, 0, 0, 0), split_strategy=Fetcher.SPLIT_STRATEGY_DAY) self.assertEqual(fetcher.event_start_date_limit, QDateTime(1997, 1, 1, 0, 0, 0, 0)) self.assertEqual(fetcher.event_end_date_limit.date(), QDateTime.currentDateTime().date())
def testFixedRangeMode(self): props = QgsVectorLayerTemporalProperties(enabled=True) props.setMode(QgsVectorLayerTemporalProperties.ModeFixedTemporalRange) props.setFixedTemporalRange( QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)))) self.assertTrue( props.isVisibleInTemporalRange( QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))))) self.assertTrue( props.isVisibleInTemporalRange( QgsDateTimeRange( QDateTime(QDate(2019, 1, 4), QTime(11, 12, 13)), QDateTime(QDate(2019, 5, 6), QTime(8, 9, 10))))) self.assertTrue( props.isVisibleInTemporalRange( QgsDateTimeRange( QDateTime(QDate(2020, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2019, 9, 6), QTime(8, 9, 10))))) self.assertFalse( props.isVisibleInTemporalRange( QgsDateTimeRange( QDateTime(QDate(2120, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2121, 9, 6), QTime(8, 9, 10))))) self.assertFalse( props.isVisibleInTemporalRange( QgsDateTimeRange( QDateTime(QDate(1920, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(1921, 9, 6), QTime(8, 9, 10))))) layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") context = QgsVectorLayerTemporalContext() context.setLayer(layer) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) # ALWAYS must be empty for ModeFixedTemporalRange self.assertFalse(props.createFilterString(context, range))
def testLayerMode(self): """ Create a fully populated QgsLayerMetadata object, then set it to the widget and re-read back the generated metadata to ensure that no content is lost. """ w = QgsMetadataWidget() m = QgsLayerMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('dataset') m.setTitle('roads') m.setAbstract('my roads') m.setFees('None') m.setConstraints([QgsLayerMetadata.Constraint('None', 'access')]) m.setRights(['Copyright foo 2017']) m.setLicenses(['WTFPL']) m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) #m.setEncoding('utf-8') m.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326')) e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') se.bounds = QgsBox3d(-180, -90, 0, 180, 90, 0) e.setSpatialExtents([se]) dates = [ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) ] e.setTemporalExtents(dates) m.setExtent(e) c = QgsLayerMetadata.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsLayerMetadata.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsLayerMetadata.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsLayerMetadata.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsLayerMetadata.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) # set widget metadata w.setMetadata(m) self.assertEqual(w.mode(), QgsMetadataWidget.LayerMetadata) m = w.metadata() self.assertIsInstance(m, QgsLayerMetadata) self.assertEqual(m.identifier(), '1234') self.assertEqual(m.parentIdentifier(), 'xyz') self.assertEqual(m.language(), 'en-CA') self.assertEqual(m.type(), 'dataset') self.assertEqual(m.title(), 'roads') self.assertEqual(m.abstract(), 'my roads') self.assertEqual(m.fees(), 'None') self.assertEqual(m.constraints()[0].constraint, 'None') self.assertEqual(m.constraints()[0].type, 'access') self.assertEqual(m.rights(), ['Copyright foo 2017']) self.assertEqual(m.licenses(), ['WTFPL']) self.assertEqual(m.history(), ['history a', 'history b']) #self.assertEqual(m.encoding(), 'utf-8') self.assertEqual(m.keywords(), { 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'] }) self.assertEqual(m.crs().authid(), 'EPSG:4326') extent = m.extent().spatialExtents()[0] self.assertEqual(extent.extentCrs.authid(), 'EPSG:4326') self.assertEqual(extent.bounds.xMinimum(), -180.0) self.assertEqual(extent.bounds.yMinimum(), -90.0) self.assertEqual(extent.bounds.xMaximum(), 180.0) self.assertEqual(extent.bounds.yMaximum(), 90.0) self.assertEqual(m.extent().temporalExtents()[0].begin(), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) self.assertTrue(m.extent().temporalExtents()[0].isInstant()) self.assertEqual(m.contacts()[0].name, 'John Smith') self.assertEqual(m.contacts()[0].organization, 'ACME') self.assertEqual(m.contacts()[0].position, 'staff') self.assertEqual(m.contacts()[0].voice, '1500 515 555') self.assertEqual(m.contacts()[0].fax, 'xx.xxx.xxx.xxxx') self.assertEqual(m.contacts()[0].email, '*****@*****.**') self.assertEqual(m.contacts()[0].role, 'pointOfContact') self.assertEqual(m.contacts()[0].addresses[0].type, 'postal') self.assertEqual(m.contacts()[0].addresses[0].address, '123 Main Street') self.assertEqual(m.contacts()[0].addresses[0].city, 'anycity') self.assertEqual(m.contacts()[0].addresses[0].administrativeArea, 'anyprovince') self.assertEqual(m.contacts()[0].addresses[0].postalCode, '90210') self.assertEqual(m.contacts()[0].addresses[0].country, 'Canada') self.assertEqual(m.links()[0].name, 'geonode:roads') self.assertEqual(m.links()[0].type, 'OGC:WMS') self.assertEqual(m.links()[0].description, 'my GeoNode road layer') self.assertEqual(m.links()[0].url, 'http://example.org/wms') self.assertEqual(m.links()[1].name, 'geonode:roads') self.assertEqual(m.links()[1].type, 'OGC:WFS') self.assertEqual(m.links()[1].description, 'my GeoNode road layer') self.assertEqual(m.links()[1].url, 'http://example.org/wfs') self.assertEqual(m.links()[2].name, 'roads') self.assertEqual(m.links()[2].type, 'WWW:LINK') self.assertEqual(m.links()[2].description, 'full dataset download') self.assertEqual(m.links()[2].url, 'http://example.org/roads.tgz') self.assertEqual(m.links()[2].format, 'ESRI Shapefile') self.assertEqual(m.links()[2].mimeType, 'application/gzip') self.assertEqual(m.links()[2].size, '283676')
def testSingleFieldMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) context = QgsVectorLayerTemporalContext() context.setLayer(layer) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeInstantFromField) props.setStartField('start_field') self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) # with fixed duration props.setFixedDuration(3) props.setDurationUnits(QgsUnitTypes.TemporalDays) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) props.setDurationUnits(QgsUnitTypes.TemporalMinutes) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,4,11,9,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) # accumulate mode props.setAccumulateFeatures(True) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' )
def createTestMetadata(self): """ Returns a standard metadata which can be tested with checkExpectedMetadata """ m = QgsLayerMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('dataset') m.setTitle('roads') m.setAbstract('my roads') m.setFees('None') m.setConstraints([QgsLayerMetadata.Constraint('None', 'access')]) m.setRights(['Copyright foo 2017']) m.setLicenses(['WTFPL']) m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) m.setEncoding('utf-8') m.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326')) e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') se.bounds = QgsBox3d(-180, -90, 0, 180, 90, 0) e.setSpatialExtents([se]) dates = [ QgsDateTimeRange( QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange( QDateTime(QDate(2010, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) ] e.setTemporalExtents(dates) m.setExtent(e) c = QgsLayerMetadata.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsLayerMetadata.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsLayerMetadata.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsLayerMetadata.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsLayerMetadata.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) return m
def testStartAndDurationMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=duration:double", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.Double) context = QgsVectorLayerTemporalContext() context.setLayer(layer) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeStartAndDurationFromFields) props.setStartField('start_field') props.setDurationField('duration') props.setDurationUnits(QgsUnitTypes.TemporalMilliseconds) self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,0,"duration"/1000) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalSeconds) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,0,"duration") >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalMinutes) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,"duration",0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalHours) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,"duration",0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalDays) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,"duration",0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalWeeks) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,"duration",0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalMonths) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,"duration",0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalYears) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval("duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalDecades) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(10 * "duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalCenturies) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(100 * "duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' )
def checkExpectedMetadata(self, m): """ Checks that a metadata object matches that returned by createTestMetadata """ self.assertEqual(m.identifier(), '1234') self.assertEqual(m.parentIdentifier(), 'xyz') self.assertEqual(m.language(), 'en-CA') self.assertEqual(m.type(), 'dataset') self.assertEqual(m.title(), 'roads') self.assertEqual(m.abstract(), 'my roads') self.assertEqual(m.fees(), 'None') self.assertEqual(m.constraints()[0].constraint, 'None') self.assertEqual(m.constraints()[0].type, 'access') self.assertEqual(m.rights(), ['Copyright foo 2017']) self.assertEqual(m.licenses(), ['WTFPL']) self.assertEqual(m.history(), ['history a', 'history b']) self.assertEqual(m.encoding(), 'utf-8') self.assertEqual( m.keywords(), {'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural']}) self.assertEqual(m.crs().authid(), 'EPSG:4326') extent = m.extent().spatialExtents()[0] self.assertEqual(extent.extentCrs.authid(), 'EPSG:4326') self.assertEqual(extent.bounds.xMinimum(), -180.0) self.assertEqual(extent.bounds.yMinimum(), -90.0) self.assertEqual(extent.bounds.xMaximum(), 180.0) self.assertEqual(extent.bounds.yMaximum(), 90.0) self.assertEqual(m.extent().temporalExtents()[0].begin(), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) self.assertTrue(m.extent().temporalExtents()[0].isInstant()) self.assertFalse(m.extent().temporalExtents()[1].isInstant()) self.assertEqual(m.extent().temporalExtents()[1].end(), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) self.assertEqual(m.contacts()[0].name, 'John Smith') self.assertEqual(m.contacts()[0].organization, 'ACME') self.assertEqual(m.contacts()[0].position, 'staff') self.assertEqual(m.contacts()[0].voice, '1500 515 555') self.assertEqual(m.contacts()[0].fax, 'xx.xxx.xxx.xxxx') self.assertEqual(m.contacts()[0].email, '*****@*****.**') self.assertEqual(m.contacts()[0].role, 'pointOfContact') self.assertEqual(m.contacts()[0].addresses[0].type, 'postal') self.assertEqual(m.contacts()[0].addresses[0].address, '123 Main Street') self.assertEqual(m.contacts()[0].addresses[0].city, 'anycity') self.assertEqual(m.contacts()[0].addresses[0].administrativeArea, 'anyprovince') self.assertEqual(m.contacts()[0].addresses[0].postalCode, '90210') self.assertEqual(m.contacts()[0].addresses[0].country, 'Canada') self.assertEqual(m.links()[0].name, 'geonode:roads') self.assertEqual(m.links()[0].type, 'OGC:WMS') self.assertEqual(m.links()[0].description, 'my GeoNode road layer') self.assertEqual(m.links()[0].url, 'http://example.org/wms') self.assertEqual(m.links()[1].name, 'geonode:roads') self.assertEqual(m.links()[1].type, 'OGC:WFS') self.assertEqual(m.links()[1].description, 'my GeoNode road layer') self.assertEqual(m.links()[1].url, 'http://example.org/wfs') self.assertEqual(m.links()[2].name, 'roads') self.assertEqual(m.links()[2].type, 'WWW:LINK') self.assertEqual(m.links()[2].description, 'full dataset download') self.assertEqual(m.links()[2].url, 'http://example.org/roads.tgz') self.assertEqual(m.links()[2].format, 'ESRI Shapefile') self.assertEqual(m.links()[2].mimeType, 'application/gzip') self.assertEqual(m.links()[2].size, '283676')
def testDateTimeWriteShapefile(self): """Check writing date and time fields to an ESRI shapefile.""" ml = QgsVectorLayer( ('Point?crs=epsg:4326&field=id:int&' 'field=date_f:date&field=time_f:time&field=dt_f:datetime'), 'test', 'memory') self.assertTrue(ml.isValid()) provider = ml.dataProvider() self.assertIsNotNone(provider) ft = QgsFeature() ft.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10, 10))) ft.setAttributes([ 1, QDate(2014, 3, 5), QTime(13, 45, 22), QDateTime(QDate(2014, 3, 5), QTime(13, 45, 22)) ]) res, features = provider.addFeatures([ft]) self.assertTrue(res) self.assertTrue(features) dest_file_name = os.path.join(str(QDir.tempPath()), 'datetime.shp') crs = QgsCoordinateReferenceSystem() crs.createFromId(4326, QgsCoordinateReferenceSystem.EpsgCrsId) write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat( ml, dest_file_name, 'utf-8', crs, 'ESRI Shapefile') self.assertEqual(write_result, QgsVectorFileWriter.NoError, error_message) # Open result and check created_layer = QgsVectorLayer('{}|layerid=0'.format(dest_file_name), 'test', 'ogr') fields = created_layer.dataProvider().fields() self.assertEqual( fields.at(fields.indexFromName('date_f')).type(), QVariant.Date) # shapefiles do not support time types, result should be string self.assertEqual( fields.at(fields.indexFromName('time_f')).type(), QVariant.String) # shapefiles do not support datetime types, result should be string self.assertEqual( fields.at(fields.indexFromName('dt_f')).type(), QVariant.String) f = next(created_layer.getFeatures(QgsFeatureRequest())) date_idx = created_layer.fields().lookupField('date_f') self.assertIsInstance(f.attributes()[date_idx], QDate) self.assertEqual(f.attributes()[date_idx], QDate(2014, 3, 5)) time_idx = created_layer.fields().lookupField('time_f') # shapefiles do not support time types self.assertIsInstance(f.attributes()[time_idx], str) self.assertEqual(f.attributes()[time_idx], '13:45:22') # shapefiles do not support datetime types datetime_idx = created_layer.fields().lookupField('dt_f') self.assertIsInstance(f.attributes()[datetime_idx], str) self.assertEqual( f.attributes()[datetime_idx], QDateTime(QDate(2014, 3, 5), QTime(13, 45, 22)).toString("yyyy/MM/dd hh:mm:ss.zzz"))
def testFromMapSettings(self): """ test QgsRenderContext.fromMapSettings() """ ms = QgsMapSettings() ms.setOutputSize(QSize(1000, 1000)) ms.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111')) ms.setExtent(QgsRectangle(10000, 20000, 30000, 40000)) ms.setFlag(QgsMapSettings.Antialiasing, True) ms.setFlag(QgsMapSettings.LosslessImageRendering, True) ms.setFlag(QgsMapSettings.Render3DMap, True) ms.setZRange(QgsDoubleRange(1, 10)) ms.setOutputSize(QSize(100, 100)) ms.setDevicePixelRatio(2) ms.setOutputImageFormat(QImage.Format_Alpha8) ms.setFrameRate(30) ms.setCurrentFrame(6) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) self.assertTrue(rc.testFlag(QgsRenderContext.Antialiasing)) self.assertTrue(rc.testFlag(QgsRenderContext.LosslessImageRendering)) self.assertTrue(rc.testFlag(QgsRenderContext.Render3DMap)) self.assertEqual(ms.zRange(), QgsDoubleRange(1, 10)) self.assertEqual(rc.symbologyReferenceScale(), -1) self.assertEqual(rc.outputSize(), QSize(100, 100)) self.assertEqual(rc.devicePixelRatio(), 2) self.assertEqual(rc.deviceOutputSize(), QSize(200, 200)) self.assertEqual(rc.imageFormat(), QImage.Format_Alpha8) self.assertEqual(rc.frameRate(), 30) self.assertEqual(rc.currentFrame(), 6) # should have an valid mapToPixel self.assertTrue(rc.mapToPixel().isValid()) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) ms.setZRange(QgsDoubleRange()) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) self.assertTrue(ms.zRange().isInfinite()) self.assertEqual(rc.mapExtent(), QgsRectangle(10000, 20000, 30000, 40000)) ms.setIsTemporal(True) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.isTemporal(), True) ms.setTemporalRange( QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual( rc.temporalRange(), QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) ms.setDpiTarget(111.1) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.dpiTarget(), 111.1)
def testVariantStats(self): """ test with non-datetime values """ s = QgsDateTimeStatisticalSummary() self.assertEqual(s.statistics(), QgsDateTimeStatisticalSummary.All) s.calculate([QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), 'asdasd', QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), 34, QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)), QDateTime(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)), QDateTime(), QDateTime(QDate(2011, 1, 5), QTime(11, 10, 54))]) self.assertEqual(s.count(), 9) self.assertEqual(set(s.distinctValues()), set([QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)), QDateTime(QDate(2011, 1, 5), QTime(11, 10, 54)), QDateTime()])) self.assertEqual(s.countMissing(), 4) self.assertEqual(s.min(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54))) self.assertEqual(s.max(), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1))) self.assertEqual(s.range(), QgsInterval(693871147))
def testExportToImage(self): md = QgsProject.instance().metadata() md.setTitle('proj title') md.setAuthor('proj author') md.setCreationDateTime( QDateTime(QDate(2011, 5, 3), QTime(9, 4, 5), QTimeZone(36000))) md.setIdentifier('proj identifier') md.setAbstract('proj abstract') md.setKeywords({'kw': ['kw1', 'kw2'], 'KWx': ['kw3', 'kw4']}) QgsProject.instance().setMetadata(md) l = QgsLayout(QgsProject.instance()) l.initializeDefaults() # add a second page page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') l.pageCollection().addPage(page2) # add some items item1 = QgsLayoutItemShape(l) item1.attemptSetSceneRect(QRectF(10, 20, 100, 150)) fill = QgsSimpleFillSymbolLayer() fill_symbol = QgsFillSymbol() fill_symbol.changeSymbolLayer(0, fill) fill.setColor(Qt.green) fill.setStrokeStyle(Qt.NoPen) item1.setSymbol(fill_symbol) l.addItem(item1) item2 = QgsLayoutItemShape(l) item2.attemptSetSceneRect(QRectF(10, 20, 100, 150)) item2.attemptMove(QgsLayoutPoint(10, 20), page=1) fill = QgsSimpleFillSymbolLayer() fill_symbol = QgsFillSymbol() fill_symbol.changeSymbolLayer(0, fill) fill.setColor(Qt.cyan) fill.setStrokeStyle(Qt.NoPen) item2.setSymbol(fill_symbol) l.addItem(item2) exporter = QgsLayoutExporter(l) # setup settings settings = QgsLayoutExporter.ImageExportSettings() settings.dpi = 80 rendered_file_path = os.path.join(self.basetestpath, 'test_exporttoimagedpi.png') self.assertEqual(exporter.exportToImage(rendered_file_path, settings), QgsLayoutExporter.Success) self.assertTrue( self.checkImage('exporttoimagedpi_page1', 'exporttoimagedpi_page1', rendered_file_path)) page2_path = os.path.join(self.basetestpath, 'test_exporttoimagedpi_2.png') self.assertTrue( self.checkImage('exporttoimagedpi_page2', 'exporttoimagedpi_page2', page2_path)) for f in (rendered_file_path, page2_path): d = gdal.Open(f) metadata = d.GetMetadata() self.assertEqual(metadata['Author'], 'proj author') self.assertEqual(metadata['Created'], '2011-05-03T09:04:05+10:00') self.assertEqual(metadata['Keywords'], 'KWx: kw3,kw4;kw: kw1,kw2') self.assertEqual(metadata['Subject'], 'proj abstract') self.assertEqual(metadata['Title'], 'proj title') # crop to contents settings.cropToContents = True settings.cropMargins = QgsMargins(10, 20, 30, 40) rendered_file_path = os.path.join(self.basetestpath, 'test_exporttoimagecropped.png') self.assertEqual(exporter.exportToImage(rendered_file_path, settings), QgsLayoutExporter.Success) self.assertTrue( self.checkImage('exporttoimagecropped_page1', 'exporttoimagecropped_page1', rendered_file_path)) page2_path = os.path.join(self.basetestpath, 'test_exporttoimagecropped_2.png') self.assertTrue( self.checkImage('exporttoimagecropped_page2', 'exporttoimagecropped_page2', page2_path)) # specific pages settings.cropToContents = False settings.pages = [1] rendered_file_path = os.path.join(self.basetestpath, 'test_exporttoimagepages.png') self.assertEqual(exporter.exportToImage(rendered_file_path, settings), QgsLayoutExporter.Success) self.assertFalse(os.path.exists(rendered_file_path)) page2_path = os.path.join(self.basetestpath, 'test_exporttoimagepages_2.png') self.assertTrue( self.checkImage('exporttoimagedpi_page2', 'exporttoimagedpi_page2', page2_path)) # image size settings.imageSize = QSize(600, 851) rendered_file_path = os.path.join(self.basetestpath, 'test_exporttoimagesize.png') self.assertEqual(exporter.exportToImage(rendered_file_path, settings), QgsLayoutExporter.Success) self.assertFalse(os.path.exists(rendered_file_path)) page2_path = os.path.join(self.basetestpath, 'test_exporttoimagesize_2.png') self.assertTrue( self.checkImage('exporttoimagesize_page2', 'exporttoimagesize_page2', page2_path)) # image size with incorrect aspect ratio # this can happen as a result of data defined page sizes settings.imageSize = QSize(851, 600) rendered_file_path = os.path.join( self.basetestpath, 'test_exporttoimagesizebadaspect.png') self.assertEqual(exporter.exportToImage(rendered_file_path, settings), QgsLayoutExporter.Success) page2_path = os.path.join(self.basetestpath, 'test_exporttoimagesizebadaspect_2.png') im = QImage(page2_path) self.assertTrue( self.checkImage('exporttoimagesize_badaspect', 'exporttoimagedpi_page2', page2_path), '{}x{}'.format(im.width(), im.height()))
def testIndividualStats(self): # tests calculation of statistics one at a time, to make sure statistic calculations are not # dependent on each other tests = [{'stat': QgsDateTimeStatisticalSummary.Count, 'expected': 9}, {'stat': QgsDateTimeStatisticalSummary.CountDistinct, 'expected': 6}, {'stat': QgsDateTimeStatisticalSummary.CountMissing, 'expected': 2}, {'stat': QgsDateTimeStatisticalSummary.Min, 'expected': QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54))}, {'stat': QgsDateTimeStatisticalSummary.Max, 'expected': QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1))}, {'stat': QgsDateTimeStatisticalSummary.Range, 'expected': QgsInterval(693871147)}, ] # we test twice, once with values added as a list and once using values # added one-at-a-time s = QgsDateTimeStatisticalSummary() s3 = QgsDateTimeStatisticalSummary() for t in tests: # test constructor s2 = QgsDateTimeStatisticalSummary(t['stat']) self.assertEqual(s2.statistics(), t['stat']) s.setStatistics(t['stat']) self.assertEqual(s.statistics(), t['stat']) s3.setStatistics(t['stat']) dates = [QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2011, 1, 5), QTime(15, 3, 1)), QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)), QDateTime(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)), QDateTime(), QDateTime(QDate(2011, 1, 5), QTime(11, 10, 54))] s.calculate(dates) s3.reset() for d in dates: s3.addValue(d) s3.finalize() self.assertEqual(s.statistic(t['stat']), t['expected']) self.assertEqual(s3.statistic(t['stat']), t['expected']) # display name self.assertTrue(len(QgsDateTimeStatisticalSummary.displayName(t['stat'])) > 0)
def testExportToPdf(self): md = QgsProject.instance().metadata() md.setTitle('proj title') md.setAuthor('proj author') md.setCreationDateTime( QDateTime(QDate(2011, 5, 3), QTime(9, 4, 5), QTimeZone(36000))) md.setIdentifier('proj identifier') md.setAbstract('proj abstract') md.setKeywords({'kw': ['kw1', 'kw2'], 'KWx': ['kw3', 'kw4']}) QgsProject.instance().setMetadata(md) l = QgsLayout(QgsProject.instance()) l.initializeDefaults() # add a second page page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') l.pageCollection().addPage(page2) # add some items item1 = QgsLayoutItemShape(l) item1.attemptSetSceneRect(QRectF(10, 20, 100, 150)) fill = QgsSimpleFillSymbolLayer() fill_symbol = QgsFillSymbol() fill_symbol.changeSymbolLayer(0, fill) fill.setColor(Qt.green) fill.setStrokeStyle(Qt.NoPen) item1.setSymbol(fill_symbol) l.addItem(item1) item2 = QgsLayoutItemShape(l) item2.attemptSetSceneRect(QRectF(10, 20, 100, 150)) item2.attemptMove(QgsLayoutPoint(10, 20), page=1) fill = QgsSimpleFillSymbolLayer() fill_symbol = QgsFillSymbol() fill_symbol.changeSymbolLayer(0, fill) fill.setColor(Qt.cyan) fill.setStrokeStyle(Qt.NoPen) item2.setSymbol(fill_symbol) l.addItem(item2) exporter = QgsLayoutExporter(l) # setup settings settings = QgsLayoutExporter.PdfExportSettings() settings.dpi = 80 settings.rasterizeWholeImage = False settings.forceVectorOutput = False settings.exportMetadata = True pdf_file_path = os.path.join(self.basetestpath, 'test_exporttopdfdpi.pdf') self.assertEqual(exporter.exportToPdf(pdf_file_path, settings), QgsLayoutExporter.Success) self.assertTrue(os.path.exists(pdf_file_path)) rendered_page_1 = os.path.join(self.basetestpath, 'test_exporttopdfdpi.png') dpi = 80 pdfToPng(pdf_file_path, rendered_page_1, dpi=dpi, page=1) rendered_page_2 = os.path.join(self.basetestpath, 'test_exporttopdfdpi2.png') pdfToPng(pdf_file_path, rendered_page_2, dpi=dpi, page=2) self.assertTrue( self.checkImage('exporttopdfdpi_page1', 'exporttopdfdpi_page1', rendered_page_1, size_tolerance=1)) self.assertTrue( self.checkImage('exporttopdfdpi_page2', 'exporttopdfdpi_page2', rendered_page_2, size_tolerance=1)) d = gdal.Open(pdf_file_path) metadata = d.GetMetadata() self.assertEqual(metadata['AUTHOR'], 'proj author') self.assertEqual(metadata['CREATION_DATE'], "D:20110503090405+10'0'") self.assertEqual(metadata['KEYWORDS'], 'KWx: kw3,kw4;kw: kw1,kw2') self.assertEqual(metadata['SUBJECT'], 'proj abstract') self.assertEqual(metadata['TITLE'], 'proj title')
def createTestMetadata(self): """ Returns a standard metadata which can be tested with checkExpectedMetadata """ m = QgsProjectMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('project') m.setTitle('roads') m.setAbstract('my roads') m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) c = QgsAbstractMetadataBase.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsAbstractMetadataBase.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsAbstractMetadataBase.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsAbstractMetadataBase.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsAbstractMetadataBase.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) m.setAuthor('my author') m.setCreationDateTime(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) return m
def testExportToSvg(self): md = QgsProject.instance().metadata() md.setTitle('proj title') md.setAuthor('proj author') md.setCreationDateTime( QDateTime(QDate(2011, 5, 3), QTime(9, 4, 5), QTimeZone(36000))) md.setIdentifier('proj identifier') md.setAbstract('proj abstract') md.setKeywords({'kw': ['kw1', 'kw2']}) QgsProject.instance().setMetadata(md) l = QgsLayout(QgsProject.instance()) l.initializeDefaults() # add a second page page2 = QgsLayoutItemPage(l) page2.setPageSize('A5') l.pageCollection().addPage(page2) # add some items item1 = QgsLayoutItemShape(l) item1.attemptSetSceneRect(QRectF(10, 20, 100, 150)) fill = QgsSimpleFillSymbolLayer() fill_symbol = QgsFillSymbol() fill_symbol.changeSymbolLayer(0, fill) fill.setColor(Qt.green) fill.setStrokeStyle(Qt.NoPen) item1.setSymbol(fill_symbol) l.addItem(item1) item2 = QgsLayoutItemShape(l) item2.attemptSetSceneRect(QRectF(10, 20, 100, 150)) item2.attemptMove(QgsLayoutPoint(10, 20), page=1) fill = QgsSimpleFillSymbolLayer() fill_symbol = QgsFillSymbol() fill_symbol.changeSymbolLayer(0, fill) fill.setColor(Qt.cyan) fill.setStrokeStyle(Qt.NoPen) item2.setSymbol(fill_symbol) l.addItem(item2) exporter = QgsLayoutExporter(l) # setup settings settings = QgsLayoutExporter.SvgExportSettings() settings.dpi = 80 settings.forceVectorOutput = False settings.exportMetadata = True svg_file_path = os.path.join(self.basetestpath, 'test_exporttosvgdpi.svg') svg_file_path_2 = os.path.join(self.basetestpath, 'test_exporttosvgdpi_2.svg') self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success) self.assertTrue(os.path.exists(svg_file_path)) self.assertTrue(os.path.exists(svg_file_path_2)) # metadata def checkMetadata(f, expected): # ideally we'd check the path too - but that's very complex given that # the output from Qt svg generator isn't valid XML, and no Python standard library # xml parser handles invalid xml... self.assertEqual('proj title' in open(f).read(), expected) self.assertEqual('proj author' in open(f).read(), expected) self.assertEqual('proj identifier' in open(f).read(), expected) self.assertEqual('2011-05-03' in open(f).read(), expected) self.assertEqual('proj abstract' in open(f).read(), expected) self.assertEqual('kw1' in open(f).read(), expected) self.assertEqual('kw2' in open(f).read(), expected) for f in [svg_file_path, svg_file_path_2]: checkMetadata(f, True) rendered_page_1 = os.path.join(self.basetestpath, 'test_exporttosvgdpi.png') svgToPng(svg_file_path, rendered_page_1, width=936) rendered_page_2 = os.path.join(self.basetestpath, 'test_exporttosvgdpi2.png') svgToPng(svg_file_path_2, rendered_page_2, width=467) self.assertTrue( self.checkImage('exporttosvgdpi_page1', 'exporttopdfdpi_page1', rendered_page_1, size_tolerance=1)) self.assertTrue( self.checkImage('exporttosvgdpi_page2', 'exporttopdfdpi_page2', rendered_page_2, size_tolerance=1)) # no metadata settings.exportMetadata = False self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success) for f in [svg_file_path, svg_file_path_2]: checkMetadata(f, False) # layered settings.exportAsLayers = True settings.exportMetadata = True svg_file_path = os.path.join(self.basetestpath, 'test_exporttosvglayered.svg') svg_file_path_2 = os.path.join(self.basetestpath, 'test_exporttosvglayered_2.svg') self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success) self.assertTrue(os.path.exists(svg_file_path)) self.assertTrue(os.path.exists(svg_file_path_2)) rendered_page_1 = os.path.join(self.basetestpath, 'test_exporttosvglayered.png') svgToPng(svg_file_path, rendered_page_1, width=936) rendered_page_2 = os.path.join(self.basetestpath, 'test_exporttosvglayered2.png') svgToPng(svg_file_path_2, rendered_page_2, width=467) self.assertTrue( self.checkImage('exporttosvglayered_page1', 'exporttopdfdpi_page1', rendered_page_1, size_tolerance=1)) self.assertTrue( self.checkImage('exporttosvglayered_page2', 'exporttopdfdpi_page2', rendered_page_2, size_tolerance=1)) for f in [svg_file_path, svg_file_path_2]: checkMetadata(f, True) # layered no metadata settings.exportAsLayers = True settings.exportMetadata = False self.assertEqual(exporter.exportToSvg(svg_file_path, settings), QgsLayoutExporter.Success) for f in [svg_file_path, svg_file_path_2]: checkMetadata(f, False)
def testDateTime(self): """ Test calculation of aggregates on date/datetime fields""" layer = QgsVectorLayer( "Point?field=flddate:date&field=flddatetime:datetime", "layer", "memory") pr = layer.dataProvider() # must be same length: datetime_values = [ QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2011, 1, 5), QTime(15, 3, 1)), QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2015, 3, 4), QTime(11, 10, 54)), QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)), QDateTime(), QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)), QDateTime(), QDateTime(QDate(2011, 1, 5), QTime(11, 10, 54)) ] date_values = [ QDate(2015, 3, 4), QDate(2015, 3, 4), QDate(2019, 12, 28), QDate(), QDate(1998, 1, 2), QDate(), QDate(2011, 1, 5), QDate(2011, 1, 5), QDate(2011, 1, 5) ] self.assertEqual(len(datetime_values), len(date_values)) features = [] for i in range(len(datetime_values)): f = QgsFeature() f.setFields(layer.fields()) f.setAttributes([date_values[i], datetime_values[i]]) features.append(f) assert pr.addFeatures(features) tests = [ [QgsAggregateCalculator.Count, 'flddatetime', 9], [QgsAggregateCalculator.Count, 'flddate', 9], [QgsAggregateCalculator.CountDistinct, 'flddatetime', 6], [QgsAggregateCalculator.CountDistinct, 'flddate', 5], [QgsAggregateCalculator.CountMissing, 'flddatetime', 2], [QgsAggregateCalculator.CountMissing, 'flddate', 2], [ QgsAggregateCalculator.Min, 'flddatetime', QDateTime(QDate(1998, 1, 2), QTime(1, 10, 54)) ], [ QgsAggregateCalculator.Min, 'flddate', QDateTime(QDate(1998, 1, 2), QTime(0, 0, 0)) ], [ QgsAggregateCalculator.Max, 'flddatetime', QDateTime(QDate(2019, 12, 28), QTime(23, 10, 1)) ], [ QgsAggregateCalculator.Max, 'flddate', QDateTime(QDate(2019, 12, 28), QTime(0, 0, 0)) ], [ QgsAggregateCalculator.Range, 'flddatetime', QgsInterval(693871147) ], [QgsAggregateCalculator.Range, 'flddate', QgsInterval(693792000)], [ QgsAggregateCalculator.ArrayAggregate, 'flddatetime', [None if v.isNull() else v for v in datetime_values] ], [ QgsAggregateCalculator.ArrayAggregate, 'flddate', [None if v.isNull() else v for v in date_values] ], ] agg = QgsAggregateCalculator(layer) for t in tests: val, ok = agg.calculate(t[0], t[1]) self.assertTrue(ok) self.assertEqual(val, t[2]) # bad tests - the following stats should not be calculatable for string fields for t in [ QgsAggregateCalculator.Sum, QgsAggregateCalculator.Mean, QgsAggregateCalculator.Median, QgsAggregateCalculator.StDev, QgsAggregateCalculator.StDevSample, QgsAggregateCalculator.Minority, QgsAggregateCalculator.Majority, QgsAggregateCalculator.FirstQuartile, QgsAggregateCalculator.ThirdQuartile, QgsAggregateCalculator.InterQuartileRange, QgsAggregateCalculator.StringMinimumLength, QgsAggregateCalculator.StringMaximumLength, ]: val, ok = agg.calculate(t, 'flddatetime') self.assertFalse(ok)
def test_stations_to_features(self): """ Test converting stations to features """ path = os.path.join(os.path.dirname(__file__), 'data', 'stations.xml') with open(path, 'rb') as f: content = f.read() byte_array = QByteArray(content) parser = FDSNStationXMLParser() fdsn = parser.parse(byte_array) features = fdsn.to_station_features([]) self.assertEqual(len(features), 9) self.assertEqual([f.attributes() for f in features], [[ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'WIMIS', QDateTime(2000, 5, 24, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 46.66488, 7.62418, 770.0, 'Wimmis, BE', NULL, NULL, NULL, NULL, NULL, QDateTime(2000, 5, 24, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'SINS', QDateTime(2012, 9, 14, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 46.68692, 7.86414, 560.0, 'Interlaken, Schloss, BE', NULL, NULL, NULL, NULL, NULL, QDateTime(2012, 9, 14, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'SFRS', QDateTime(2018, 10, 11, 22, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 46.58232, 7.65632, 772.3, 'Frutigen, Schulhaus Kanderbrück, BE', NULL, NULL, NULL, NULL, NULL, QDateTime(2018, 10, 11, 22, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'STHK', QDateTime(2015, 4, 21, 11, 31, 34, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 46.7437, 7.62953, 559.0, 'Thun, Kantonsschule, BE', NULL, NULL, NULL, NULL, NULL, QDateTime(2015, 4, 21, 11, 31, 34, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'SOLB', QDateTime(2011, 11, 22, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 47.206835, 7.517052, 430.0, 'Solothurn, Schulhaus Bruehl, SO', NULL, NULL, NULL, NULL, NULL, QDateTime(2011, 11, 22, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'SOLZ', QDateTime(2012, 1, 12, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 47.208825, 7.538306, 444.0, 'Solothurn, Zeughausgasse, SO', NULL, NULL, NULL, NULL, NULL, QDateTime(2012, 1, 12, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'CH', QDateTime(1980, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 'National Seismic Networks of Switzerland', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'LAUCH', QDateTime(2010, 10, 21, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, '', 'open', NULL, NULL, 46.41554, 7.77166, 2160.0, 'Lauchernalp - Loetschental, VS', NULL, NULL, NULL, NULL, NULL, QDateTime(2010, 10, 21, 0, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'Z3', QDateTime(2015, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), QDateTime(2022, 12, 31, 0, 0, 0, 0, Qt.TimeSpec(1)), '', 'closed', NULL, NULL, 'AlpArray Seismic Network (AASN) temporary component', '10.12686/alparray/z3_2015', NULL, NULL, NULL, NULL, NULL, NULL, 'A060A', QDateTime(2015, 8, 14, 14, 0, 0, 0, Qt.TimeSpec(1)), QDateTime(2017, 2, 16, 10, 0, 0, 0, Qt.TimeSpec(1)), '', 'closed', NULL, NULL, 47.0305, 7.8904, 1112.1, 'Wasen, Napf, BE, Switzerland', NULL, NULL, NULL, NULL, NULL, QDateTime(2015, 8, 14, 14, 0, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ], [ 'SeisComP', 'SED', NULL, NULL, QDateTime(2021, 11, 30, 0, 56, 10, 720, Qt.TimeSpec(1)), 'Z3', QDateTime(2015, 1, 1, 0, 0, 0, 0, Qt.TimeSpec(1)), QDateTime(2022, 12, 31, 0, 0, 0, 0, Qt.TimeSpec(1)), '', 'closed', NULL, NULL, 'AlpArray Seismic Network (AASN) temporary component', '10.12686/alparray/z3_2015', NULL, NULL, NULL, NULL, NULL, NULL, 'A060B', QDateTime(2017, 5, 9, 12, 30, 0, 0, Qt.TimeSpec(1)), QDateTime(2022, 12, 31, 0, 0, 0, 0, Qt.TimeSpec(1)), '', 'closed', NULL, NULL, 46.993, 7.97764, 1049.1, 'Romoos, Napf, BE, Switzerland', NULL, NULL, NULL, NULL, NULL, QDateTime(2017, 5, 9, 12, 30, 0, 0, Qt.TimeSpec(1)), NULL, NULL, NULL, NULL, NULL ]])