Skip to content

Commit 6761e67

Browse files
committed
[Fixes #12362] Maintenance Frequency is not imported from ISO metadata
1 parent 6385c7a commit 6761e67

File tree

4 files changed

+38
-14
lines changed

4 files changed

+38
-14
lines changed

geonode/base/fixtures/test_xml.xml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,18 @@
251251
</gmd:role>
252252
</gmd:CI_ResponsibleParty>
253253
</gmd:pointOfContact>
254-
255254

256-
255+
<gmd:resourceMaintenance>
256+
<gmd:MD_MaintenanceInformation>
257+
<gmd:maintenanceAndUpdateFrequency>
258+
<gmd:MD_MaintenanceFrequencyCode
259+
codeSpace="ISOTC211/19115"
260+
codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode"
261+
codeListValue="daily">daily</gmd:MD_MaintenanceFrequencyCode>
262+
</gmd:maintenanceAndUpdateFrequency>
263+
</gmd:MD_MaintenanceInformation>
264+
</gmd:resourceMaintenance>
265+
257266
<gmd:graphicOverview>
258267
<gmd:MD_BrowseGraphic>
259268
<gmd:fileName>

geonode/layers/metadata.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,19 @@
2222
# Standard Modules
2323
import logging
2424
import datetime
25-
from owslib.etree import etree as dlxml
26-
from django.conf import settings
27-
28-
# Geonode functionality
29-
from geonode import GeoNodeException
3025

3126
# OWSLib functionality
27+
from owslib import iso, util
3228
from owslib.csw import CswRecord
33-
from owslib.iso import MD_Metadata, MD_Keywords
29+
from owslib.etree import etree as dlxml
3430
from owslib.fgdc import Metadata
31+
32+
from django.conf import settings
3533
from django.utils import timezone
3634

35+
from geonode import GeoNodeException
36+
37+
3738
LOGGER = logging.getLogger(__name__)
3839

3940

@@ -76,7 +77,7 @@ def iso2dict(exml):
7677
regions = []
7778
keywords = []
7879

79-
mdata = MD_Metadata(exml)
80+
mdata = iso.MD_Metadata(exml)
8081
identifier = mdata.identifier
8182
vals["language"] = mdata.language or mdata.languagecode or "eng"
8283
if mdata.identification[0].spatialrepresentationtype:
@@ -112,6 +113,15 @@ def iso2dict(exml):
112113

113114
vals["purpose"] = mdata.identification[0].purpose
114115

116+
freq_elem = exml.find(
117+
util.nspath_eval(
118+
"gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceAndUpdateFrequency/gmd:MD_MaintenanceFrequencyCode",
119+
iso.namespaces,
120+
)
121+
)
122+
freq = freq_elem.attrib.get("codeListValue", None) if freq_elem is not None else None
123+
vals["maintenance_frequency"] = freq or "unknown"
124+
115125
if mdata.dataquality is not None:
116126
vals["data_quality_statement"] = mdata.dataquality.lineage
117127

@@ -258,7 +268,7 @@ def convert_keyword(keywords, iso2dict=False, theme="theme"):
258268
def convert_iso_keywords(keywords):
259269
_keywords = []
260270
for kw in keywords:
261-
if isinstance(kw, MD_Keywords):
271+
if isinstance(kw, iso.MD_Keywords):
262272
_keywords.append([_kw.name for _kw in kw.keywords])
263273
else:
264274
_keywords.append(kw)

geonode/layers/tests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,6 +1124,7 @@ def test_set_metadata_return_expected_values_from_xml(self):
11241124
"data_quality_statement": "Created with GeoNode",
11251125
"date": datetime.datetime(2021, 4, 9, 9, 0, 46),
11261126
"language": "eng",
1127+
"maintenance_frequency": "daily",
11271128
"purpose": None,
11281129
"spatial_representation_type": "vector",
11291130
"supplemental_information": "No information provided",
@@ -1184,6 +1185,7 @@ def setUp(self):
11841185
"data_quality_statement": "Created with GeoNode",
11851186
"date": datetime.datetime(2021, 4, 9, 9, 0, 46),
11861187
"language": "eng",
1188+
"maintenance_frequency": "daily",
11871189
"purpose": None,
11881190
"spatial_representation_type": "vector",
11891191
"supplemental_information": "No information provided",

geonode/resource/utils.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,18 @@ def update_resource(
170170
if vals:
171171
for key, value in vals.items():
172172
if key == "spatial_representation_type":
173-
defaults[key] = SpatialRepresentationType.objects.filter(identifier=value).first() if value else None
173+
value = SpatialRepresentationType.objects.filter(identifier=value).first() if value else None
174174
elif key == "topic_category":
175175
value, created = TopicCategory.objects.get_or_create(
176176
identifier=value, defaults={"description": "", "gn_description": value}
177177
)
178178
key = "category"
179-
defaults[key] = value
180-
else:
181-
defaults[key] = value
179+
elif key == "maintenance_frequency":
180+
if value not in dict(enumerations.UPDATE_FREQUENCIES).keys():
181+
logger.warning(f"Bad frequency parsed: {value}")
182+
value = "unknown"
183+
184+
defaults[key] = value
182185

183186
contact_roles = {
184187
contact_role.name: defaults.pop(contact_role.name, getattr(instance, contact_role.name))

0 commit comments

Comments
 (0)