)) ## ISO Document xpath definition for localized responsible party ISOResponsibleParty.elements.append( ISOTextGroup( name="organisation-name-localized", search_paths=["gmd:organisationName/gmd:PT_FreeText/gmd:textGroup"], multiplicity="1..*", )) ISODocument.elements.append( ISOResponsibleParty( name="cited-responsible-party", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty" ], multiplicity="1..*", )) ## ISO Document xpath definition for localized keywords ISOKeyword.elements.append( ISOKeywordTextGroup( name="keyword-name-localized", search_paths=["gmd:keyword/gmd:PT_FreeText/gmd:textGroup"], multiplicity="1..*", )) class MultilangHarvester(CSWHarvester, SingletonPlugin):
ISODocument, ISOElement, ISOKeyword, ISOResponsibleParty, ) from ckanext.dcatapit.schema import FIELD_THEMES_AGGREGATE log = logging.getLogger(__name__) ISODocument.elements.append( ISOResponsibleParty( name='cited-responsible-party', search_paths=[ 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty', 'gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty' ], multiplicity='1..*', ) ) ISODocument.elements.append( ISOElement( name='conformity-specification-title', search_paths=[ 'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:specification/gmd:CI_Citation/gmd:title/gco:CharacterString/text()' ], multiplicity='1', )) ISOKeyword.elements.append(
class NgdsXmlMapping(ISODocument): """ Inherits from ckanext.spatial.model.MappedXmlDocument. ckanext.spatial.model.ISODocument is a similar example (see https://github.com/ckan/ckanext-spatial/blob/master/ckanext/spatial/model/harvested_metadata.py) - Invoke with `my_ngds_mapping = NgdsXmlMapping(xml_str=None, xml_tree=None)` - Then get values by `my_ngds_mapping.read_values()` """ elements = [ # Metadata Maintainer responsible party ISOResponsibleParty( name="maintainers", search_paths=["gmd:contact/gmd:CI_ResponsibleParty"], multiplicity="*"), # Other ID ISOElement( name="other_id", search_paths="gmd:dataSetURI/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Data Type ISOElement( name="data_type", search_paths="gmd:hierarchyLevelName/gco:CharacterString/text()", multiplicity="*", # "*", "1..*", "1" are other options ), # Pub Date ISOElement( name="publication_date", search_paths= "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:DateTime/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Authors ISOResponsibleParty( name="authors", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty" ], multiplicity="*"), # Quality <<< Node that CKAN ISODocument object pulls explanation from gmd:DQ_DomainConsistency # into conformity-explanation. Handler for quality needs to be a complex object like ResponsibleParty # Include in this array of paths the paths for DQ_Elements that seem likely tohave text explanations... [SMR 2014-03-21] ISOElement( name="quality", search_paths=[ "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_CompletenessCommission/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_CompletenessOmission/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_ConceptualConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_FormatConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TopologicalConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_NonQuantitativeAttributeAccuracy/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_ThematicClassificationCorrectness/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TemporalConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TemporalValidity/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()" ], multiplicity="*", # "*", "1..*", "1" are other options ), # Lineage <<< Note that the CKAN ISODocument object already defines this. Its not clear why # its defined here as well... ISOElement( name="lineage", search_paths= "gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Status <<< NOte that CKAN ISODocument object harvests this element into 'progress' ISOElement( name="status", search_paths= "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode/@codeListValue", multiplicity="0..1", # "*", "1..*", "1" are other options ) ] def infer_values(self, values): return values
class NgdsXmlMapping(ISODocument): elements = [ ISOElement( name="guid", search_paths="gmd:fileIdentifier/gco:CharacterString/text()", multiplicity="0..1", ), ISOElement( name="metadata-language", search_paths=[ "gmd:language/gmd:LanguageCode/@codeListValue", "gmd:language/gmd:LanguageCode/text()", ], multiplicity="0..1", ), ISOElement( name="metadata-standard-name", search_paths="gmd:metadataStandardName/gco:CharacterString/text()", multiplicity="0..1", ), ISOElement( name="metadata-standard-version", search_paths= "gmd:metadataStandardVersion/gco:CharacterString/text()", multiplicity="0..1", ), ISOElement( name="resource-type", search_paths=[ "gmd:hierarchyLevel/gmd:MD_ScopeCode/@codeListValue", "gmd:hierarchyLevel/gmd:MD_ScopeCode/text()", ], multiplicity="*", ), ISOResponsibleParty( name="metadata-point-of-contact", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty", ], multiplicity="1..*", ), ISOElement( name="metadata-date", search_paths=[ "gmd:dateStamp/gco:DateTime/text()", "gmd:dateStamp/gco:Date/text()", ], multiplicity="1", ), ISOElement( name="spatial-reference-system", search_paths=[ "gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/gmd:code/gco:CharacterString/text()", ], multiplicity="0..1", ), ISOElement( name="title", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString/text()", ], multiplicity="1", ), ISOElement( name="alternate-title", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:alternateTitle/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:alternateTitle/gco:CharacterString/text()", ], multiplicity="*", ), ISOReferenceDate( name="dataset-reference-date", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date", ], multiplicity="1..*", ), ISOElement( name="unique-resource-identifier", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString/text()", "gmd:identificationInfo/gmd:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:MD_Identifier/gmd:code/gco:CharacterString/text()", ], multiplicity="0..1", ), ISOElement( name="presentation-form", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:presentationForm/gmd:CI_PresentationFormCode/text()", "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:presentationForm/gmd:CI_PresentationFormCode/@codeListValue", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:presentationForm/gmd:CI_PresentationFormCode/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:presentationForm/gmd:CI_PresentationFormCode/@codeListValue", ], multiplicity="*", ), ISOElement( name="abstract", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:abstract/gco:CharacterString/text()", ], multiplicity="1", ), ISOElement( name="purpose", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:purpose/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:purpose/gco:CharacterString/text()", ], multiplicity="0..1", ), ISOResponsibleParty( name="responsible-organisation", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty", "gmd:contact/gmd:CI_ResponsibleParty", ], multiplicity="1..*", ), ISOElement( name="frequency-of-update", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceAndUpdateFrequency/gmd:MD_MaintenanceFrequencyCode/@codeListValue", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceAndUpdateFrequency/gmd:MD_MaintenanceFrequencyCode/@codeListValue", "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceAndUpdateFrequency/gmd:MD_MaintenanceFrequencyCode/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceAndUpdateFrequency/gmd:MD_MaintenanceFrequencyCode/text()", ], multiplicity="0..1", ), ISOElement( name="maintenance-note", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceNote/gco:CharacterString/text()", "gmd:identificationInfo/gmd:SV_ServiceIdentification/gmd:resourceMaintenance/gmd:MD_MaintenanceInformation/gmd:maintenanceNote/gco:CharacterString/text()", ], multiplicity="0..1", ), ISOElement( name="progress", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode/@codeListValue", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:status/gmd:MD_ProgressCode/@codeListValue", "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:status/gmd:MD_ProgressCode/text()", ], multiplicity="*", ), ISOKeyword( name="keywords", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords", ], multiplicity="*"), ISOElement( name="keyword-inspire-theme", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString/text()", ], multiplicity="*", ), # Deprecated: kept for backwards compatibilty ISOElement( name="keyword-controlled-other", search_paths=[ "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:keywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString/text()", ], multiplicity="*", ), ISOUsage( name="usage", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceSpecificUsage/gmd:MD_Usage", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceSpecificUsage/gmd:MD_Usage", ], multiplicity="*"), ISOElement( name="limitations-on-public-access", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gco:CharacterString/text()", ], multiplicity="*", ), ISOElement( name="access-constraints", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode/@codeListValue", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode/@codeListValue", "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode/text()", ], multiplicity="*", ), ISOElement( name="use-constraints", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gco:CharacterString/text()", ], multiplicity="*", ), ISOAggregationInfo( name="aggregation-info", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:aggregationInfo/gmd:MD_AggregateInformation", "gmd:identificationInfo/gmd:SV_ServiceIdentification/gmd:aggregationInfo/gmd:MD_AggregateInformation", ], multiplicity="*"), ISOElement( name="spatial-data-service-type", search_paths=[ "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:serviceType/gco:LocalName/text()", ], multiplicity="0..1", ), ISOElement( name="spatial-resolution", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance/text()", ], multiplicity="0..1", ), ISOElement( name="spatial-resolution-units", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance/@uom", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance/@uom", ], multiplicity="0..1", ), ISOElement( name="equivalent-scale", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:equivalentScale/gmd:MD_RepresentativeFraction/gmd:denominator/gco:Integer/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:equivalentScale/gmd:MD_RepresentativeFraction/gmd:denominator/gco:Integer/text()", ], multiplicity="*", ), ISOElement( name="dataset-language", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:language/gmd:LanguageCode/@codeListValue", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:language/gmd:LanguageCode/@codeListValue", "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:language/gmd:LanguageCode/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:language/gmd:LanguageCode/text()", ], multiplicity="*", ), ISOElement( name="topic-category", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode/text()", ], multiplicity="*", ), ISOElement( name="extent-controlled", search_paths=[], multiplicity="*", ), ISOElement( name="extent-free-text", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString/text()", ], multiplicity="*", ), ISOBoundingBox( name="bbox", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox", "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox", ], multiplicity="*", ), ISOElement( name="temporal-extent-begin", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition/text()", ], multiplicity="*", ), ISOElement( name="temporal-extent-end", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition/text()", "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition/text()", ], multiplicity="*", ), ISOElement( name="vertical-extent", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:verticalElement/gmd:EX_VerticalExtent", "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:extent/gmd:EX_Extent/gmd:verticalElement/gmd:EX_VerticalExtent", ], multiplicity="*", ), ISOCoupledResources( name="coupled-resource", search_paths=[ "gmd:identificationInfo/srv:SV_ServiceIdentification/srv:operatesOn", ], multiplicity="*", ), ISOElement( name="additional-information-source", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:supplementalInformation/gco:CharacterString/text()", ], multiplicity="0..1", ), ISODataFormat( name="data-format", search_paths=[ "gmd:distributionInfo/gmd:MD_Distribution/gmd:distributionFormat/gmd:MD_Format", ], multiplicity="*", ), ISOResponsibleParty( name="distributor", search_paths=[ "gmd:distributionInfo/gmd:MD_Distribution/gmd:distributor/gmd:MD_Distributor/gmd:distributorContact/gmd:CI_ResponsibleParty", ], multiplicity="*", ), ISOResourceLocator( name="resource-locator", search_paths=[ "gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource", "gmd:distributionInfo/gmd:MD_Distribution/gmd:distributor/gmd:MD_Distributor/gmd:distributorTransferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource" ], multiplicity="*", ), ISOResourceLocator( name="resource-locator-identification", search_paths=[ "gmd:identificationInfo//gmd:CI_OnlineResource", ], multiplicity="*", ), ISOElement( name="conformity-specification", search_paths=[ "gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:specification", ], multiplicity="0..1", ), ISOElement( name="conformity-pass", search_paths=[ "gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:pass/gco:Boolean/text()", ], multiplicity="0..1", ), ISOElement( name="conformity-explanation", search_paths=[ "gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", ], multiplicity="0..1", ), ISOElement( name="lineage", search_paths=[ "gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement/gco:CharacterString/text()", ], multiplicity="0..1", ), ISOBrowseGraphic( name="browse-graphic", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:graphicOverview/gmd:MD_BrowseGraphic", "gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:graphicOverview/gmd:MD_BrowseGraphic", ], multiplicity="*", ), ################################### # Metadata Maintainer responsible party ISOResponsibleParty( name="maintainers", search_paths=["gmd:contact/gmd:CI_ResponsibleParty"], multiplicity="*"), # Other ID ISOElement( name="other_id", search_paths="gmd:dataSetURI/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Data Type ISOElement( name="data_type", search_paths="gmd:hierarchyLevelName/gco:CharacterString/text()", multiplicity="*", # "*", "1..*", "1" are other options ), # Pub Date ISOElement( name="publication_date", search_paths= "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:DateTime/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Authors ISOResponsibleParty( name="authors", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty" ], multiplicity="*"), # Quality <<< Node that CKAN ISODocument object pulls explanation from gmd:DQ_DomainConsistency # into conformity-explanation. Handler for quality needs to be a complex object like ResponsibleParty # Include in this array of paths the paths for DQ_Elements that seem likely tohave text explanations... [SMR 2014-03-21] ISOElement( name="quality", search_paths=[ "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_CompletenessCommission/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_CompletenessOmission/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_ConceptualConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_FormatConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TopologicalConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_NonQuantitativeAttributeAccuracy/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_ThematicClassificationCorrectness/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TemporalConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()", "/gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_TemporalValidity/gmd:result/gmd:DQ_ConformanceResult/gmd:explanation/gco:CharacterString/text()" ], multiplicity="*", # "*", "1..*", "1" are other options ), # Lineage <<< Note that the CKAN ISODocument object already defines this. Its not clear why # its defined here as well... ISOElement( name="lineage", search_paths= "gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Status <<< NOte that CKAN ISODocument object harvests this element into 'progress' ISOElement( name="status", search_paths= "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode/@codeListValue", multiplicity="0..1", # "*", "1..*", "1" are other options ) ]
class NgdsXmlMapping(ISODocument): """ Inherits from ckanext.spatial.model.MappedXmlDocument. ckanext.spatial.model.ISODocument is a similar example - Invoke with `my_ngds_mapping = NgdsXmlMapping(xml_str=None, xml_tree=None)` - Then get values by `my_ngds_mapping.read_values()` """ elements = [ # Maintainer ISOResponsibleParty( name="maintainer", search_paths=[ "gmd:contact/gmd:CI_ResponsibleParty" ], multiplicity="1" ), # Other ID ISOElement( name="other_id", search_paths="gmd:dataSetURI/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Data Type ISOElement( name="data_type", search_paths="gmd:hierarchyLevelName/gco:CharacterString/text()", multiplicity="1", # "*", "1..*", "1" are other options ), # Pub Date ISOElement( name="publication_date", search_paths="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:DateTime/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Authors ISOResponsibleParty( name="authors", search_paths=[ "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty" ], multiplicity="*" ), # Quality <<< ISOElement( name="quality", search_paths="gmd:dataSetURI/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Lineage <<< ISOElement( name="lineage", search_paths="gmd:dataSetURI/gco:CharacterString/text()", multiplicity="0..1", # "*", "1..*", "1" are other options ), # Status ISOElement( name="status", search_paths="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode/@codeListValue", multiplicity="0..1", # "*", "1..*", "1" are other options ) ] def infer_values(self, values): return values