Exemplo n.º 1
0
    def __call__(self):
        self.request.response.setHeader('Content-Type', 'text/xml')

        now = datetime.datetime.now()
        year_start = datetime.datetime(year=now.year, month=1, day=1)
        year_end = datetime.datetime(year=now.year, month=12, day=31)

        #maybe it should be done as timedelta of 1sec from previous year

        def getTextKeepHTML(value):
            """ Retrieve text content from html input while keeping the html
            """
            value = escapeSpecialChars(value)
            return _toUnicode("<![CDATA[{0}]]>".format((value)))

        def getTextStripHTML(value):
            """ Retrieve text content from html input removing the html
            """
            value = escapeSpecialChars(value)
            return BeautifulSoup(value, 'lxml').get_text()

        getText = getTextKeepHTML \
            if self.request.get("keepHTML", "false") == "true"\
            else getTextStripHTML

        #we extract some info here to simplify code down below
        spec = self.context.aq_parent

        effective = self.context.getEffectiveDate()
        if effective:
            publish_date = effective.asdatetime().date().strftime("%d/%m/%Y")
        else:
            publish_date = ""

        spec_modified = spec.modified().asdatetime().date().strftime(
            "%d/%m/%Y")
        latest_version = IGetVersions(self.context).latest_version()

        ref_area = u", ".join(
            [c.decode('utf-8') for c in self.context.getLocation()])

        manager_id = spec.getManager_user_id()
        mtool = getToolByName(spec, 'portal_membership')
        manager_name = (mtool.getMemberInfo(manager_id)
                        or {}).get('fullname', 'Missing')
        manager_name = manager_name.decode('utf-8')

        dpsir_vocab = NamedVocabulary('indicator_dpsir').getVocabularyDict(
            spec)
        typology_vocab = NamedVocabulary(
            'indicator_typology').getVocabularyDict(spec)

        dpsir = dpsir_vocab.get(spec.getDpsir())
        typology = typology_vocab.get(spec.getTypology())
        dpsir_typology = "DPSIR: %s - Typology: %s" % (dpsir,
                                                       _toUnicode(typology))

        themes_vocab = dict(spec._getMergedThemes())
        themes = ", ".join([themes_vocab.get(l) for l in spec.getThemes()])

        #let's use the already well-formatted temporal coverage browser view
        temporal_coverage = getMultiAdapter((self.context, self.request),
                                            name=u'formatTempCoverage')()

        units = getText(spec.getUnits()) or u'Not available'

        data_sets = [
            rel for rel in spec.getRelatedItems() if rel.portal_type == 'Data'
        ]
        ext_data_sets = [
            rel for rel in spec.getRelatedItems()
            if rel.portal_type == 'ExternalDataSpec'
        ]

        out = ""

        for dataowner in data_sets:
            out += u" ".join(
                (_toUnicode(dataowner.Title()), dataowner.absolute_url()))
            out += u" "
            for provider_url in dataowner.getDataOwner():
                org = spec.getOrganisationName(provider_url)
                if org:
                    out += u" ".join((_toUnicode(org.Title), provider_url))
                    out += u" "

        for eds in ext_data_sets:
            out += u" ".join((_toUnicode(eds.Title()), eds.absolute_url()))
            out += u" "
            org = spec.getOrganisationName(eds.getProvider_url())
            if org:
                out += u" ".join(
                    (_toUnicode(org.Title), eds.getProvider_url()))
                out += u" "

        mrefs = [
            b.getObject() for b in spec.getFolderContents(
                contentFilter={'portal_type': 'MethodologyReference'})
        ]

        methodology_reference = getText("\n".join([
            (o.Title() + "\n" + o.getDescription()) for o in mrefs
        ]))


        uncertainties = getText('Methodology uncertainty: ' +\
                                spec.getMethodology_uncertainty() +\
                                '\nData uncertainty: ' +\
                                spec.getData_uncertainty() +\
                                '\nRationale uncertainty: ' +\
                                spec.getRationale_uncertainty())

        questions = [
            b.getObject() for b in spec.getFolderContents(
                contentFilter={'portal_type': 'PolicyQuestion'})
        ]
        qpart = ""
        if questions:
            main_q = None
            for q in questions:
                if q.getIs_key_question():
                    main_q = q
            if main_q is not None:
                qpart += "Key policy question: %s\n" % main_q.Title()

            for q in questions:
                if q == main_q:
                    continue
                qpart += "Specific policy question: %s\n" % q.Title()

        user_needs = getText('Justification for indicator selection: '+\
                             spec.getRationale_justification()+ "\n" + qpart)

        methodology = getText(spec.getMethodology())
        methodology_gapfilling = getText(spec.getMethodology_gapfilling())
        indicator_definition = getText(spec.Title() + ". " + \
                                       spec.getDefinition())
        frequency_of_updates = getText(spec.get_frequency_of_updates())

        #The xml construction
        E = ElementMaker(nsmap=NAMESPACES)

        header = E.Header(
            E.ID("DMBB_ESMSIPEEA_A"),
            E.Prepared(now.replace(microsecond=0).isoformat()),
            E.Sender(id="4D0"),
            E.DataSetID("DMBB_ESMSIPEEA_A_1353407791410"),
            E.DataSetAction("Append"),
            E.Extracted(now.replace(microsecond=0).isoformat()),
            E.ReportingBegin(year_start.replace(microsecond=0).isoformat()),
            E.ReportingEnd(year_end.replace(microsecond=0).isoformat()),
        )

        M = ElementMaker(namespace=NAMESPACES['GenericMetadata'],
                         nsmap=NAMESPACES)

        metadata = M.MetadataSet(
            M.MetadataStructureRef('ESMSIPEEA_MSD'),
            M.MetadataStructureAgencyRef("ESTAT"),
            M.ReportRef('ESMS_REPORT_FULL'),
            M.AttributeValueSet(
                M.TargetRef("FULL_ESMS"),
                M.TargetValues(
                    M.ComponentValue("2013-A0",
                                     component="TIME_PERIOD",
                                     object="TimeDimension"),
                    M.ComponentValue("4D0",
                                     component="DATA_PROVIDER",
                                     object="DataProvider"),
                    M.ComponentValue("DMBB_ESMSIPEEA_A",
                                     component="DATAFLOW",
                                     object="DataFlow"),
                ),
                M.ReportedAttribute(  #CONTACT
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value('European Environment Agency (EEA)'),
                        conceptID="CONTACT_ORGANISATION",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="ORGANISATION_UNIT",
                    ),
                    M.ReportedAttribute(
                        M.Value(manager_name),
                        conceptID="CONTACT_NAME",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="CONTACT_FUNC",
                    ),
                    M.ReportedAttribute(
                        M.Value('Kongens Nytorv 6, 1050, '
                                'Copenhagen K, Denmark'),
                        conceptID="CONTACT_MAIL",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="CONTACT_EMAIL",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="CONTACT_PHONE",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not applicable'),
                        conceptID="CONTACT_FAX",
                    ),
                    conceptID="CONTACT",
                ),
                M.ReportedAttribute(  #META_UPDATE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(publish_date),
                        conceptID="META_CERTIFIED",
                    ),
                    M.ReportedAttribute(
                        M.Value(publish_date),
                        conceptID="META_POSTED",
                    ),
                    M.ReportedAttribute(
                        M.Value(spec_modified),
                        conceptID="META_LAST_UPDATE",
                    ),
                    conceptID="META_UPDATE",
                ),
                M.ReportedAttribute(  #STAT_PRES
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(indicator_definition),
                        conceptID="DATA_DESCR",
                    ),
                    M.ReportedAttribute(
                        M.Value(dpsir_typology),
                        conceptID="CLASS_SYSTEM",
                    ),
                    M.ReportedAttribute(
                        M.Value(themes),
                        conceptID="COVERAGE_SECTOR",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="STAT_CONC_DEF",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="STAT_UNIT",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="STAT_POP",
                    ),
                    M.ReportedAttribute(
                        M.Value(ref_area),
                        conceptID="REF_AREA",
                    ),
                    M.ReportedAttribute(
                        M.Value(temporal_coverage),
                        conceptID="COVERAGE_TIME",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="BASE_PER",
                    ),
                    conceptID="STAT_PRES"),
                M.ReportedAttribute(
                    M.Value(units),
                    conceptID="UNIT_MEASURE",
                ),
                M.ReportedAttribute(
                    M.Value("Not available"),
                    conceptID="REF_PERIOD",
                ),
                M.ReportedAttribute(  #INST_MANDATE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(
                            "Regulation (EC) No 401/2009 of the European "
                            "Parliament and of the Council of 23 April 2009 (available at "
                            "http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri="
                            "CELEX:32009R0401:EN:NOT)"),
                        conceptID="INST_MAN_LA_OA",
                    ),
                    M.ReportedAttribute(
                        M.Value(
                            "Regulation (EC) No 401/2009 of the European "
                            "Parliament and of the Council of 23 April 2009 (available at "
                            "http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri="
                            "CELEX:32009R0401:EN:NOT)"),
                        conceptID="INST_MAN_SHAR",
                    ),
                    conceptID="INST_MANDATE",
                ),
                M.ReportedAttribute(  #CONF
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="CONF_DATA_TR",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="CONF_POLICY",
                    ),
                    conceptID="CONF",
                ),
                M.ReportedAttribute(  #REL_POLICY
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="REL_CAL_POLICY",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="REL_CAL_ACCESS",
                    ),
                    M.ReportedAttribute(
                        M.Value("All EEA indicators are public"),
                        conceptID="REL_POL_US_AC",
                    ),
                    conceptID="REL_POLICY",
                ),
                M.ReportedAttribute(
                    M.Value("Not available"),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="NEWS_REL",
                    ),
                    M.ReportedAttribute(
                        M.Value(latest_version.absolute_url()),
                        conceptID="PUBLICATIONS",
                    ),
                    M.ReportedAttribute(
                        M.Value(
                            "https://www.eea.europa.eu/data-and-maps/indicators"
                        ),
                        conceptID="ONLINE_DB",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="MICRO_DAT_ACC",
                    ),
                    M.ReportedAttribute(
                        M.Value(
                            "Twitter: Indicators are automatically "
                            "announced via EEA's Twitter channel (https://twitter.com/euenvironment), "
                            "which users can follow. RSS feed: Indicators are automatically "
                            "announced in a dedicated EEA indicators RSS feed "
                            "(https://www.eea.europa.eu/data-and-maps/indicators/RSS2), which users can "
                            "subscribe to. A catalogue of all indicators is available "
                            "(https://www.eea.europa.eu/data-and-maps/indicators)."
                        ),
                        conceptID="DISS_OTHER",
                    ),
                    conceptID="DISS_FORMAT",
                ),
                M.ReportedAttribute(  #ACCESS_DOC
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(methodology_reference),
                        conceptID="DOC_METHOD",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="QUALITY_DOC",
                    ),
                    conceptID="ACCESS_DOC",
                ),
                M.ReportedAttribute(  #QUALITY_MGMNT
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="QUALITY_ASSURE",
                    ),
                    M.ReportedAttribute(
                        M.Value(uncertainties),
                        conceptID="QUALITY_ASSMNT",
                    ),
                    conceptID="QUALITY_MGMNT",
                ),
                M.ReportedAttribute(  #RELEVANCE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(user_needs),
                        conceptID="USER_NEEDS",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="USER_SAT",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="COMPLETENESS",
                    ),
                    conceptID="RELEVANCE",
                ),
                M.ReportedAttribute(  #ACCURACY
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="ACCURACY_OVERALL",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="SAMPLING_ERR",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="NONSAMPLING_ERR",
                    ),
                    conceptID="ACCURACY",
                ),
                M.ReportedAttribute(  #TIMELINESS_PUNCT
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="TIMELINESS",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="PUNCTUALITY",
                    ),
                    conceptID="TIMELINESS_PUNCT",
                ),
                M.ReportedAttribute(  #COMPARABILITY
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_GEO_COVER",
                        ),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_GEO_COMMENT",
                        ),
                        conceptID="COMPAR_GEO",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_TIME_COVER",
                        ),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_TIME_COMMENT",
                        ),
                        conceptID="COMPAR_TIME",
                    ),
                    conceptID="COMPARABILITY",
                ),
                M.ReportedAttribute(  #COHERENCE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="COHER_X_DOM",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="COHER_INTERNAL",
                    ),
                    conceptID="COHERENCE",
                ),
                M.ReportedAttribute(
                    M.Value("Not applicable"),
                    conceptID="COST_BURDEN",
                ),
                M.ReportedAttribute(  #DATA_REV
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(
                            "Indicator assessments are peer reviewed and "
                            "CSIs go under extended country review process. Previous versions of "
                            "indicators are available. Data coming from EEA's data flows have their own "
                            "QA procedure. The quality of third part data is under responsibily of "
                            "respective data providers."),
                        conceptID="REV_POLICY",
                    ),
                    M.ReportedAttribute(
                        M.Value(
                            "Indicator assessments are peer reviewed and "
                            "CSIs go under extended country review process. Previous versions of "
                            "indicators are available. Data coming from EEA's data flows have their own "
                            "QA procedure. The quality of third part data is under responsibily of "
                            "respective data providers."),
                        conceptID="REV_PRACTICE",
                    ),
                    conceptID="DATA_REV",
                ),
                M.ReportedAttribute(  #STAT_PROCESS
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(out),
                        conceptID="SOURCE_TYPE",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="FREQ_COLL",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="COLL_METHOD",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="DATA_VALIDATION",
                    ),
                    M.ReportedAttribute(
                        M.Value(methodology),
                        conceptID="DATA_COMP",
                    ),
                    M.ReportedAttribute(
                        M.Value(methodology_gapfilling),
                        conceptID="ADJUSTMENT",
                    ),
                    M.ReportedAttribute(
                        M.Value(frequency_of_updates),
                        conceptID="FREQ_DISS",
                    ),
                    conceptID="STAT_PROCESS",
                ),
                M.ReportedAttribute(
                    M.Value(
                        "Please note that more metadata and additional "
                        "information about this indicator is available online at %s. For technical "
                        "issues contact EEA web team at https://www.eea.europa.eu/help/contact-info. "
                        "Metadata extracted automatically by EEA IMS at %s." %
                        (self.context.absolute_url(), now.isoformat())),
                    conceptID="COMMENT_DSET",
                ),
            ),
        )

        xsi = "http://www.w3.org/2001/XMLSchema-instance"
        schemaLocation = "http://www.SDMX.org/resources/SDMXML/schemas/v2_0/genericmetadata SDMXGenericMetadata.xsd " \
                         "http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message SDMXMessage.xsd"
        root = lxml.etree.Element(
            nsel("GenericMetadata"),
            attrib={"{" + xsi + "}schemaLocation": schemaLocation},
            nsmap=NAMESPACES)
        root.append(header)
        root.append(metadata)

        return lxml.etree.tostring(root,
                                   pretty_print=True,
                                   xml_declaration=True,
                                   encoding='UTF-8',
                                   standalone="yes")
Exemplo n.º 2
0
    def __call__(self):
        self.request.response.setHeader('Content-Type', 'text/xml')

        now = datetime.datetime.now()
        year_start = datetime.datetime(year=now.year, month=1, day=1)
        year_end = datetime.datetime(year=now.year, month=12, day=31)
        #maybe it should be done as timedelta of 1sec from previous year

        def getTextKeepHTML(value):
            """ Retrieve text content from html input while keeping the html
            """
            value = escapeSpecialChars(value)
            return _toUnicode("<![CDATA[{0}]]>".format((value)))

        def getTextStripHTML(value):
            """ Retrieve text content from html input removing the html
            """
            value = escapeSpecialChars(value)
            return BeautifulSoup(value, 'lxml').get_text()

        getText = getTextKeepHTML \
            if self.request.get("keepHTML", "false") == "true"\
            else getTextStripHTML


        #we extract some info here to simplify code down below
        spec = self.context.aq_parent

        effective = self.context.getEffectiveDate()
        if effective:
            publish_date = effective.asdatetime().date().strftime("%d/%m/%Y")
        else:
            publish_date = ""

        spec_modified = spec.modified().asdatetime().date().strftime("%d/%m/%Y")
        latest_version = IGetVersions(self.context).latest_version()

        ref_area = u", ".join([c.decode('utf-8') for c in
                              self.context.getLocation()])

        manager_id = spec.getManager_user_id()
        mtool = getToolByName(spec, 'portal_membership')
        manager_name = (mtool.getMemberInfo(manager_id)
                        or {}).get('fullname', 'Missing')
        manager_name = manager_name.decode('utf-8')

        dpsir_vocab = NamedVocabulary('indicator_dpsir'
                                        ).getVocabularyDict(spec)
        typology_vocab = NamedVocabulary('indicator_typology'
                                        ).getVocabularyDict(spec)

        dpsir = dpsir_vocab.get(spec.getDpsir())
        typology = typology_vocab.get(spec.getTypology())
        dpsir_typology = "DPSIR: %s - Typology: %s" % (dpsir,
                _toUnicode(typology))

        themes_vocab = dict(spec._getMergedThemes())
        themes = ", ".join([themes_vocab.get(l) for l in spec.getThemes()])

        #let's use the already well-formatted temporal coverage browser view
        temporal_coverage = getMultiAdapter(
            (self.context, self.request), name=u'formatTempCoverage')()

        units = getText(spec.getUnits()) or u'Not available'

        data_sets = [rel for rel in spec.getRelatedItems()
                        if rel.portal_type == 'Data']
        ext_data_sets = [rel for rel in spec.getRelatedItems()
                        if rel.portal_type == 'ExternalDataSpec']

        out = ""

        for dataowner in data_sets:
            out += u" ".join((_toUnicode(dataowner.Title()),
                                    dataowner.absolute_url()))
            out += u" "
            for provider_url in dataowner.getDataOwner():
                org = spec.getOrganisationName(provider_url)
                if org:
                    out += u" ".join((_toUnicode(org.Title),
                                            provider_url))
                    out += u" "

        for eds in ext_data_sets:
            out += u" ".join((_toUnicode(eds.Title()),
                                    eds.absolute_url()))
            out += u" "
            org = spec.getOrganisationName(eds.getProvider_url())
            if org:
                out += u" ".join((_toUnicode(org.Title),
                                        eds.getProvider_url()))
                out += u" "

        mrefs = [b.getObject() for b in spec.getFolderContents(
                        contentFilter={'portal_type':'MethodologyReference'})]

        methodology_reference = getText(
            "\n".join(
                [(o.Title() + "\n" + o.getDescription()) for o in mrefs]))


        uncertainties = getText('Methodology uncertainty: ' +\
                                spec.getMethodology_uncertainty() +\
                                '\nData uncertainty: ' +\
                                spec.getData_uncertainty() +\
                                '\nRationale uncertainty: ' +\
                                spec.getRationale_uncertainty())

        questions = [b.getObject() for b in spec.getFolderContents(
                        contentFilter={'portal_type':'PolicyQuestion'})]
        qpart = ""
        if questions:
            main_q = None
            for q in questions:
                if q.getIs_key_question():
                    main_q = q
            if main_q is not None:
                qpart += "Key policy question: %s\n" % main_q.Title()

            for q in questions:
                if q == main_q:
                    continue
                qpart += "Specific policy question: %s\n" % q.Title()

        user_needs = getText('Justification for indicator selection: '+\
                             spec.getRationale_justification()+ "\n" + qpart)

        methodology = getText(spec.getMethodology())
        methodology_gapfilling = getText(spec.getMethodology_gapfilling())
        indicator_definition = getText(spec.Title() + ". " + \
                                       spec.getDefinition())
        frequency_of_updates = getText(spec.get_frequency_of_updates())

        #The xml construction
        E = ElementMaker(nsmap=NAMESPACES)

        header = E.Header(
            E.ID("DMBB_ESMSIPEEA_A"),
            E.Prepared(now.replace(microsecond=0).isoformat()),
            E.Sender(id="4D0"),
            E.DataSetID("DMBB_ESMSIPEEA_A_1353407791410"),
            E.DataSetAction("Append"),
            E.Extracted(now.replace(microsecond=0).isoformat()),
            E.ReportingBegin(year_start.replace(microsecond=0).isoformat()),
            E.ReportingEnd(year_end.replace(microsecond=0).isoformat()),
        )

        M = ElementMaker(namespace=NAMESPACES['GenericMetadata'],
                         nsmap=NAMESPACES)

        metadata = M.MetadataSet(
            M.MetadataStructureRef('ESMSIPEEA_MSD'),
            M.MetadataStructureAgencyRef("ESTAT"),
            M.ReportRef('ESMS_REPORT_FULL'),
            M.AttributeValueSet(
                M.TargetRef("FULL_ESMS"),
                M.TargetValues(
                    M.ComponentValue("2013-A0", component="TIME_PERIOD",
                                     object="TimeDimension"),
                    M.ComponentValue("4D0", component="DATA_PROVIDER",
                                     object="DataProvider"),
                    M.ComponentValue("DMBB_ESMSIPEEA_A", component="DATAFLOW",
                                     object="DataFlow"),
                ),
                M.ReportedAttribute(    #CONTACT
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value('European Environment Agency (EEA)'),
                        conceptID="CONTACT_ORGANISATION",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="ORGANISATION_UNIT",
                    ),
                    M.ReportedAttribute(
                        M.Value(manager_name),
                        conceptID="CONTACT_NAME",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="CONTACT_FUNC",
                    ),
                    M.ReportedAttribute(
                        M.Value('Kongens Nytorv 6, 1050, '
                                'Copenhagen K, Denmark'),
                        conceptID="CONTACT_MAIL",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="CONTACT_EMAIL",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not available'),
                        conceptID="CONTACT_PHONE",
                    ),
                    M.ReportedAttribute(
                        M.Value('Not applicable'),
                        conceptID="CONTACT_FAX",
                    ),
                    conceptID="CONTACT",
                ),
                M.ReportedAttribute(    #META_UPDATE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(publish_date),
                        conceptID="META_CERTIFIED",
                    ),
                    M.ReportedAttribute(
                        M.Value(publish_date),
                        conceptID="META_POSTED",
                    ),
                    M.ReportedAttribute(
                        M.Value(spec_modified),
                        conceptID="META_LAST_UPDATE",
                    ),
                    conceptID="META_UPDATE",
                ),
                M.ReportedAttribute(    #STAT_PRES
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(indicator_definition),
                        conceptID="DATA_DESCR",
                    ),
                    M.ReportedAttribute(
                        M.Value(dpsir_typology),
                        conceptID="CLASS_SYSTEM",
                    ),
                    M.ReportedAttribute(
                        M.Value(themes),
                        conceptID="COVERAGE_SECTOR",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="STAT_CONC_DEF",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="STAT_UNIT",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="STAT_POP",
                    ),
                    M.ReportedAttribute(
                        M.Value(ref_area),
                        conceptID="REF_AREA",
                    ),
                    M.ReportedAttribute(
                        M.Value(temporal_coverage),
                        conceptID="COVERAGE_TIME",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="BASE_PER",
                    ),
                    conceptID="STAT_PRES"
                ),
                M.ReportedAttribute(
                    M.Value(units),
                    conceptID="UNIT_MEASURE",
                ),
                M.ReportedAttribute(
                    M.Value("Not available"),
                    conceptID="REF_PERIOD",
                ),
                M.ReportedAttribute(    #INST_MANDATE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Regulation (EC) No 401/2009 of the European "
"Parliament and of the Council of 23 April 2009 (available at "
"http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri="
"CELEX:32009R0401:EN:NOT)"),
                        conceptID="INST_MAN_LA_OA",
                    ),
                    M.ReportedAttribute(
                        M.Value("Regulation (EC) No 401/2009 of the European "
"Parliament and of the Council of 23 April 2009 (available at "
"http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri="
"CELEX:32009R0401:EN:NOT)"),
                        conceptID="INST_MAN_SHAR",
                    ),
                    conceptID="INST_MANDATE",
                ),
                M.ReportedAttribute(    #CONF
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="CONF_DATA_TR",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="CONF_POLICY",
                    ),
                    conceptID="CONF",
                ),
                M.ReportedAttribute(    #REL_POLICY
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="REL_CAL_POLICY",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="REL_CAL_ACCESS",
                    ),
                    M.ReportedAttribute(
                        M.Value("All EEA indicators are public"),
                        conceptID="REL_POL_US_AC",
                    ),
                    conceptID="REL_POLICY",
                ),
                M.ReportedAttribute(
                    M.Value("Not available"),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="NEWS_REL",
                    ),
                    M.ReportedAttribute(
                        M.Value(latest_version.absolute_url()),
                        conceptID="PUBLICATIONS",
                    ),
                    M.ReportedAttribute(
                        M.Value(
                        "https://www.eea.europa.eu/data-and-maps/indicators"),
                        conceptID="ONLINE_DB",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="MICRO_DAT_ACC",
                    ),
                    M.ReportedAttribute(
                        M.Value("Twitter: Indicators are automatically "
"announced via EEA's Twitter channel (https://twitter.com/euenvironment), "
"which users can follow. RSS feed: Indicators are automatically "
"announced in a dedicated EEA indicators RSS feed "
"(https://www.eea.europa.eu/data-and-maps/indicators/RSS2), which users can "
"subscribe to. A catalogue of all indicators is available "
"(https://www.eea.europa.eu/data-and-maps/indicators)."),
                        conceptID="DISS_OTHER",
                    ),
                    conceptID="DISS_FORMAT",
                ),
                M.ReportedAttribute(    #ACCESS_DOC
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(methodology_reference),
                        conceptID="DOC_METHOD",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="QUALITY_DOC",
                    ),
                    conceptID="ACCESS_DOC",
                ),
                M.ReportedAttribute(    #QUALITY_MGMNT
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="QUALITY_ASSURE",
                    ),
                    M.ReportedAttribute(
                        M.Value(uncertainties),
                        conceptID="QUALITY_ASSMNT",
                    ),
                    conceptID="QUALITY_MGMNT",
                ),
                M.ReportedAttribute(    #RELEVANCE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(user_needs),
                        conceptID="USER_NEEDS",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="USER_SAT",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="COMPLETENESS",
                    ),
                    conceptID="RELEVANCE",
                ),
                M.ReportedAttribute(    #ACCURACY
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="ACCURACY_OVERALL",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="SAMPLING_ERR",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="NONSAMPLING_ERR",
                    ),
                    conceptID="ACCURACY",
                ),
                M.ReportedAttribute(    #TIMELINESS_PUNCT
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="TIMELINESS",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="PUNCTUALITY",
                    ),
                    conceptID="TIMELINESS_PUNCT",
                ),
                M.ReportedAttribute(    #COMPARABILITY
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_GEO_COVER",
                        ),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_GEO_COMMENT",
                        ),
                        conceptID="COMPAR_GEO",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_TIME_COVER",
                        ),
                        M.ReportedAttribute(
                            M.Value("Not available"),
                            conceptID="COMPAR_TIME_COMMENT",
                        ),
                        conceptID="COMPAR_TIME",
                    ),
                    conceptID="COMPARABILITY",
                ),
                M.ReportedAttribute(    #COHERENCE
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Not applicable"),
                        conceptID="COHER_X_DOM",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="COHER_INTERNAL",
                    ),
                    conceptID="COHERENCE",
                ),
                M.ReportedAttribute(
                    M.Value("Not applicable"),
                    conceptID="COST_BURDEN",
                ),
                M.ReportedAttribute(    #DATA_REV
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value("Indicator assessments are peer reviewed and "
"CSIs go under extended country review process. Previous versions of "
"indicators are available. Data coming from EEA's data flows have their own "
"QA procedure. The quality of third part data is under responsibily of "
"respective data providers."),
                        conceptID="REV_POLICY",
                    ),
                    M.ReportedAttribute(
                        M.Value("Indicator assessments are peer reviewed and "
"CSIs go under extended country review process. Previous versions of "
"indicators are available. Data coming from EEA's data flows have their own "
"QA procedure. The quality of third part data is under responsibily of "
"respective data providers."),
                        conceptID="REV_PRACTICE",
                    ),
                    conceptID="DATA_REV",
                ),
                M.ReportedAttribute(    #STAT_PROCESS
                    M.Value(),
                    M.ReportedAttribute(
                        M.Value(out),
                        conceptID="SOURCE_TYPE",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="FREQ_COLL",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="COLL_METHOD",
                    ),
                    M.ReportedAttribute(
                        M.Value("Not available"),
                        conceptID="DATA_VALIDATION",
                    ),
                    M.ReportedAttribute(
                        M.Value(methodology),
                        conceptID="DATA_COMP",
                    ),
                    M.ReportedAttribute(
                        M.Value(methodology_gapfilling),
                        conceptID="ADJUSTMENT",
                    ),
                    M.ReportedAttribute(
                        M.Value(frequency_of_updates),
                        conceptID="FREQ_DISS",
                    ),
                    conceptID="STAT_PROCESS",
                ),
                M.ReportedAttribute(
                    M.Value("Please note that more metadata and additional "
"information about this indicator is available online at %s. For technical "
"issues contact EEA web team at https://www.eea.europa.eu/help/contact-info. "
"Metadata extracted automatically by EEA IMS at %s." %
(self.context.absolute_url(), now.isoformat())),
                    conceptID="COMMENT_DSET",
                ),
            ),
        )

        xsi = "http://www.w3.org/2001/XMLSchema-instance"
        schemaLocation = "http://www.SDMX.org/resources/SDMXML/schemas/v2_0/genericmetadata SDMXGenericMetadata.xsd " \
                         "http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message SDMXMessage.xsd"
        root = lxml.etree.Element(nsel("GenericMetadata"), attrib={
            "{" + xsi + "}schemaLocation": schemaLocation}, nsmap=NAMESPACES)
        root.append(header)
        root.append(metadata)

        return lxml.etree.tostring(root, pretty_print=True,
                                   xml_declaration=True, encoding='UTF-8',
                                   standalone="yes")