diff --git a/ckanext/odsh/helpers.py b/ckanext/odsh/helpers.py index 06d83e403ae637cf8f704280171fba318d9fb8e4..efcb5fceb3e1a5d7e8658a4227e00e5ff3a52604 100644 --- a/ckanext/odsh/helpers.py +++ b/ckanext/odsh/helpers.py @@ -23,6 +23,8 @@ import pdb from urlparse import urlsplit, urlunsplit import subprocess import ckan.lib.helpers as helpers +import os.path +from collections import OrderedDict get_action = logic.get_action log = logging.getLogger(__name__) @@ -456,3 +458,37 @@ def short_name_for_category(category_name): 'tech': u'Wissenschaft', } return translations.get(category_name) + +def odsh_load_mdk_sample_dataset(): + ''' + Load sample dataset (Musterkatalog/Musterdatensatz). + + See https://bertelsmannstift.github.io/Musterdatenkatalog/def/musterdatensatz.rdf + and corresponding mapping in mdk_mapping.json file. + ''' + + path = os.path.abspath(os.path.dirname(__file__)) + default_sample_data_file_path = os.path.join(path, "../../mdk_mapping.json") + sample_data_file_path = config.get( + 'ckanext.odsh.sample_data_file_path', default_sample_data_file_path) + + try: + with open(sample_data_file_path) as mapping_json: + MDK_MAPPING = json.loads(mapping_json.read(), object_pairs_hook=OrderedDict) + default = [{'value': u'Musterdatensatz wählen..', 'key': u''}] + mdk = [{'key': key, 'value': MDK_MAPPING[key]} for key in MDK_MAPPING] + result = default+mdk + except IOError as err: + log.error( + 'Could not load sample dataset mapping file from {}' + .format(sample_data_file_path) + ) + raise + except ValueError as err: + log.error( + 'Could not convert sample dataset mapping file from json. \nSample dataset mapping file: {}' + .format(sample_data_file_path) + ) + raise + return result + diff --git a/ckanext/odsh/plugin.py b/ckanext/odsh/plugin.py index 46bebec5a1bdf3ada7ee4f8d60bdf5a5bd2fc292..8bf494dcc5f8fb89f55263184fe4618d5c2b9610 100644 --- a/ckanext/odsh/plugin.py +++ b/ckanext/odsh/plugin.py @@ -96,6 +96,13 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm for field in ['title', 'license_id']: schema.update({field: [toolkit.get_converter('not_empty')]}) + schema.update({ + 'reference': [ + toolkit.get_validator('ignore_missing'), + toolkit.get_converter('convert_to_extras') + ] + }) + for i, item in enumerate(schema['tags']['name']): if item == toolkit.get_validator('tag_name_validator'): schema['tags']['name'][i] = toolkit.get_validator( @@ -374,6 +381,7 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm 'tpsh_get_resource_size': helpers_tpsh.get_resource_size, 'tpsh_get_address_org':helpers_tpsh.get_address_org, 'tpsh_get_body_mail':helpers_tpsh.get_body_mail, + 'odsh_load_mdk_sample_dataset': odsh_helpers.odsh_load_mdk_sample_dataset, } diff --git a/ckanext/odsh/profiles/__init__.py b/ckanext/odsh/profiles/__init__.py index 97866f2c45e7082d5a10821327b0507e90eb2091..f87530b7c8b2c3d7eb8dc717ef414fad44ba1a55 100644 --- a/ckanext/odsh/profiles/__init__.py +++ b/ckanext/odsh/profiles/__init__.py @@ -1 +1,2 @@ from odsh_dcat_de_profile import ODSHDCATdeProfile +from odsh_european_dcatap_profile import ODSHEuropeanDCATAPProfile \ No newline at end of file diff --git a/ckanext/odsh/profiles/odsh_dcat_de_profile.py b/ckanext/odsh/profiles/odsh_dcat_de_profile.py index 190e7c49a65803e0bf5f73f106783dc902565adf..08dc69022dd4c2eb339debe0c83c52e42c00f277 100644 --- a/ckanext/odsh/profiles/odsh_dcat_de_profile.py +++ b/ckanext/odsh/profiles/odsh_dcat_de_profile.py @@ -8,6 +8,7 @@ from ckanext.dcat.utils import resource_uri import ckanext.dcatde.dataset_utils as ds_utils from ckanext.dcatde.profiles import DCATdeProfile, DCATDE, DCAT, DCATDE_1_0, DCATDE_1_0_1, DCATDE_1_0_2 +import ckanext.odsh.helpers as odsh_helpers import ckanext.odsh.helpers_tpsh as helpers_tpsh import ckanext.odsh.collection.helpers as helpers_collection @@ -72,6 +73,7 @@ class ODSHDCATdeProfile(DCATdeProfile): self._add_license_attribution_by_text(dataset_dict, dataset_ref) self._add_type(dataset_dict, dataset_ref) self._add_modified_and_issued(dataset_dict, dataset_ref) + self._add_references(dataset_dict, dataset_ref) if self._is_dataset_collection(dataset_dict): self._remove_predefined_collection_members() self._add_collection_members(dataset_dict, dataset_ref) @@ -100,6 +102,19 @@ class ODSHDCATdeProfile(DCATdeProfile): rdflib.Literal(licenseAttributionByText)) ) + def _add_references(self, dataset_dict, dataset_ref): + ''' + Adds reference (Musterdatenkatalog/Musterdatensatz) extra field to + dcat:references. + ''' + sample_dataset_uri = odsh_helpers.odsh_extract_value_from_extras(dataset_dict.get('extras'), 'reference') + if sample_dataset_uri: + self.g.set( + (dataset_ref, DCT.references, + rdflib.URIRef(sample_dataset_uri) + ) + ) + def _add_modified_and_issued(self, dataset_dict, dataset_ref): ''' Adds distributions last_modified and created values to @@ -190,4 +205,4 @@ class ODSHDCATdeProfile(DCATdeProfile): (dataset_ref, DCT.isVersionOf, rdflib.URIRef(collection_uri) ) - ) \ No newline at end of file + ) diff --git a/ckanext/odsh/profiles/odsh_european_dcatap_profile.py b/ckanext/odsh/profiles/odsh_european_dcatap_profile.py new file mode 100644 index 0000000000000000000000000000000000000000..544323bd1d9b32db11f84e78b93f4a5fb364f92d --- /dev/null +++ b/ckanext/odsh/profiles/odsh_european_dcatap_profile.py @@ -0,0 +1,139 @@ +import logging +import rdflib + +from ckan.common import config, json +from ckan.model.license import LicenseRegister +from ckanext.dcat.profiles import EuropeanDCATAPProfile, DCT, URIRefOrLiteral +from ckanext.dcatde.profiles import DCAT + +log = logging.getLogger(__name__) +DCT = rdflib.namespace.Namespace("http://purl.org/dc/terms/") +DCAT = rdflib.namespace.Namespace("http://www.w3.org/ns/dcat#") + + +class ODSHEuropeanDCATAPProfile(EuropeanDCATAPProfile): + + def _license(self, dataset_ref): + if self._licenceregister_cache is not None: + license_uri2id, license_title2id = self._licenceregister_cache + else: + license_uri2id = {} + license_title2id = {} + for license_id, license in LicenseRegister().items(): + license_uri2id[license_id] = license_id + license_uri2id[license.url] = license_id + license_title2id[license.title] = license_id + self._licenceregister_cache = license_uri2id, license_title2id + + for distribution in self._distributions(dataset_ref): + # If distribution has a license, attach it to the dataset + license = self._object(distribution, DCT.license) + if license: + # Try to find a matching license comparing URIs, then titles + license_id = license_uri2id.get(license.toPython()) + if not license_id: + license_id = license_title2id.get( + self._object_value(license, DCT.title)) + if license_id: + return license_id + return '' + + def _distribution_format(self, distribution, normalize_ckan_format=True): + imt, label = super(ODSHEuropeanDCATAPProfile, self)._distribution_format( + distribution, normalize_ckan_format) + if label in resource_formats_import(): + label = resource_formats_import()[label] + return imt, label + + def graph_from_dataset(self, dataset_dict, dataset_ref): + super(ODSHEuropeanDCATAPProfile, self).graph_from_dataset( + dataset_dict, dataset_ref) + for s, p, o in self.g.triples((None, rdflib.RDF.type, DCAT.Distribution)): + for s2, p2, o2 in self.g.triples((s, DCT['format'], None)): + if o2.decode() in resource_formats_export(): + self.g.set((s, DCT['format'], rdflib.URIRef( + resource_formats_export()[o2.decode()]))) + for s, p, o in self.g.triples((None, DCT.language, None)): + if o.decode() in get_language(): + self.g.set((s, p, rdflib.URIRef(get_language()[o.decode()]))) + elif type(o) == rdflib.Literal and type(URIRefOrLiteral(o.decode())) == rdflib.URIRef: + self.g.set((s, p, rdflib.URIRef(o.decode()))) + + license = dataset_dict.get('license_id', None) + if license: + self.g.add((dataset_ref, DCT.license, rdflib.URIRef(license))) + for dist in self.g.objects(dataset_ref, DCAT.distribution): + self.g.add((dist, DCT.license, rdflib.URIRef(license))) + + +_RESOURCE_FORMATS_IMPORT = None +_RESOURCE_FORMATS_EXPORT = None + +def resource_formats(): + global _RESOURCE_FORMATS_IMPORT + global _RESOURCE_FORMATS_EXPORT + _RESOURCE_FORMATS_IMPORT = {} + _RESOURCE_FORMATS_EXPORT = {} + g = rdflib.Graph() + # Something went wrong with trying to get the file formats online, try to use backup instead + try: + fallback_filepath = config.get( + 'ckan.odsh.resource_formats_fallback_filepath') + g.parse(fallback_filepath) + assert len(set([s for s in g.subjects()])) > 120 + except: + log.exception("failed to process resource_formats") + raise Exception('failed to load formats') + file_types = [subj.decode() for subj in g.subjects()] + + for elem in sorted(set(file_types)): + if elem.split('/')[-1] != 'file-type': + _RESOURCE_FORMATS_EXPORT[elem.split('/')[-1]] = elem + _RESOURCE_FORMATS_IMPORT[elem] = elem.split('/')[-1] + +def resource_formats_export(): + global _RESOURCE_FORMATS_EXPORT + if not _RESOURCE_FORMATS_EXPORT: + resource_formats() + return _RESOURCE_FORMATS_EXPORT + +def resource_formats_import(): + global _RESOURCE_FORMATS_IMPORT + if not _RESOURCE_FORMATS_IMPORT: + resource_formats() + return _RESOURCE_FORMATS_IMPORT + + +_LANGUAGES = None + +def get_language(): + ''' When datasets are exported in rdf-format, their language-tag + should be given as + "<dct:language rdf:resource="http://publications.europa.eu/.../XXX"/>", + where XXX represents the language conforming to iso-639-3 standard. + However, some imported datasets represent their language as + "<dct:language>de</dct:language>", which will be interpreted here as + iso-639-1 values. As we do not display the language setting in the + web frontend, this function only assures the correct export format, + by using 'languages.json' as mapping table. + ''' + global _LANGUAGES + if not _LANGUAGES: + _LANGUAGES = {} + languages_file_path = config.get('ckanext.odsh.language.mapping') + if not languages_file_path: + log.warning( + "Could not find config setting: 'ckanext.odsh.language.mapping', using fallback instead.") + languages_file_path = '/usr/lib/ckan/default/src/ckanext-odsh/languages.json' + with open(languages_file_path) as languages_file: + try: + language_mapping_table = json.loads(languages_file.read()) + except ValueError, e: + # includes simplejson.decoder.JSONDecodeError + raise ValueError('Invalid JSON syntax in %s: %s' % + (languages_file_path, e)) + + for language_line in language_mapping_table: + _LANGUAGES[language_line[0]] = language_line[1] + + return _LANGUAGES \ No newline at end of file diff --git a/ckanext/odsh/public/odsh.css b/ckanext/odsh/public/odsh.css index 9efa2ecbf01d9a449778351ad4697382815d9bbf..25f377099fe17dc44152829a9b11367e87c9232b 100644 --- a/ckanext/odsh/public/odsh.css +++ b/ckanext/odsh/public/odsh.css @@ -1938,7 +1938,8 @@ body { } .field-organization .select2-container .select2-choice, -.field-spatial_uri .select2-container .select2-choice +.field-spatial_uri .select2-container .select2-choice, +.field-reference .select2-container .select2-choice { background-color: #F6F7F9; background-image: none; diff --git a/ckanext/odsh/templates/package/snippets/package_basic_fields.html b/ckanext/odsh/templates/package/snippets/package_basic_fields.html index ada4778f2c438600cabce8295223a229ed2e87b6..7b1354747ac099d5b6cb3267797b3b9ce0492365 100644 --- a/ckanext/odsh/templates/package/snippets/package_basic_fields.html +++ b/ckanext/odsh/templates/package/snippets/package_basic_fields.html @@ -320,3 +320,10 @@ dataset_is_draft)) %} </div> </div> </div> + + +{# field reference #} +{% set field = 'reference' %} +{% set error_reference = h.odsh_extract_error(field, errors) %} +{% set value = h.odsh_extract_value_from_extras(data.extras,field) or '' %} +{{ form.select_autocomplete(field, label=_('Musterdatensatz'), selected=value, options=h.odsh_load_mdk_sample_dataset(), error=error_reference, is_required=False, classes=['control-full', 'field-reference'])}} diff --git a/mdk_mapping.json b/mdk_mapping.json new file mode 100644 index 0000000000000000000000000000000000000000..85077b17687d46b305a7a0dc7a042f9933bb8e01 --- /dev/null +++ b/mdk_mapping.json @@ -0,0 +1,307 @@ +{ + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/abfallkalender":"Abfallwirtschaft - Abfallkalender", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/abfallmengen":"Abfallwirtschaft - Abfallmengen", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/abgabestellen":"Abfallwirtschaft - Abgabestellen", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/beteiligungen":"Abfallwirtschaft - Beteiligungen", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/betriebe":"Abfallwirtschaft - Betriebe", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/container":"Abfallwirtschaft - Container", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/entwaesserung":"Abfallwirtschaft - Entwässerung", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/gremien":"Abfallwirtschaft - Gremien", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/muellabfuhr":"Abfallwirtschaft - Müllabfuhr", + "https://musterdatenkatalog.de/def/musterdatensatz/abfallwirtschaft/muellgebuehren":"Abfallwirtschaft - Müllgebühren", + "https://musterdatenkatalog.de/def/musterdatensatz/bau/baufertigstellungen":"Bau - Baufertigstellungen", + "https://musterdatenkatalog.de/def/musterdatensatz/bau/baugenehmigungen":"Bau - Baugenehmigungen", + "https://musterdatenkatalog.de/def/musterdatensatz/bau/bauprojekte":"Bau - Bauprojekte", + "https://musterdatenkatalog.de/def/musterdatensatz/bau/gebaeude":"Bau - Gebäude", + "https://musterdatenkatalog.de/def/musterdatensatz/bau/grundstueckbewertung":"Bau - Grundstückbewertung", + "https://musterdatenkatalog.de/def/musterdatensatz/behoerden/einrichtungen":"Behörden - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/arbeit":"Bevölkerung - Arbeit", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/bedarfsgemeinschaften":"Bevölkerung - Bedarfsgemeinschaften", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/demografie":"Bevölkerung - Demografie", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/einwohnerzahl":"Bevölkerung - Einwohnerzahl", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/fluechtlingszahlen":"Bevölkerung - Flüchtlingszahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/geburtenUndSterbefaelle":"Bevölkerung - Geburten und Sterbefälle", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/integration":"Bevölkerung - Integration", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/menschenMitBehinderung":"Bevölkerung - Menschen mit Behinderung", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/migrationshintergrund":"Bevölkerung - Migrationshintergrund", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/religionszugehoerigkeit":"Bevölkerung - Religionszugehörigkeit", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/staatsangehoerigkeit":"Bevölkerung - Staatsangehörigkeit", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/vornamen":"Bevölkerung - Vornamen", + "https://musterdatenkatalog.de/def/musterdatensatz/bevoelkerung/wohnen":"Bevölkerung - Wohnen", + "https://musterdatenkatalog.de/def/musterdatensatz/bibliotheken/ausleihen":"Bibliotheken - Ausleihen", + "https://musterdatenkatalog.de/def/musterdatensatz/bibliotheken/bestaende":"Bibliotheken - Bestände", + "https://musterdatenkatalog.de/def/musterdatensatz/bibliotheken/besucherzahlen":"Bibliotheken - Besucherzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/bibliotheken/budget":"Bibliotheken - Budget", + "https://musterdatenkatalog.de/def/musterdatensatz/bibliotheken/einrichtungen":"Bibliotheken - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/bibliotheken/kennzahlen":"Bibliotheken - Kennzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/bildungstraeger/einrichtungen":"Bildungsträger - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerbeteiligung/buergerentscheid":"Bürgerbeteiligung - Bürgerentscheid", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerbeteiligung/buergerhaushalt":"Bürgerbeteiligung - Bürgerhaushalt", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerbeteiligung/information":"Bürgerbeteiligung - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerbeteiligung/umfrage":"Bürgerbeteiligung - Umfrage", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerservice/anliegenmanagement":"Bürgerservice - Anliegenmanagement", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerservice/produkte":"Bürgerservice - Produkte", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerservice/telefonverzeichnis":"Bürgerservice - Telefonverzeichnis", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerservice/termine":"Bürgerservice - Termine", + "https://musterdatenkatalog.de/def/musterdatensatz/buergerservice/wartezeiten":"Bürgerservice - Wartezeiten", + "https://musterdatenkatalog.de/def/musterdatensatz/energiewirtschaft/energieberichte":"Energiewirtschaft - Energieberichte", + "https://musterdatenkatalog.de/def/musterdatensatz/energiewirtschaft/heizung":"Energiewirtschaft - Heizung", + "https://musterdatenkatalog.de/def/musterdatensatz/energiewirtschaft/solar":"Energiewirtschaft - Solar", + "https://musterdatenkatalog.de/def/musterdatensatz/energiewirtschaft/strom":"Energiewirtschaft - Strom", + "https://musterdatenkatalog.de/def/musterdatensatz/energiewirtschaft/wasser":"Energiewirtschaft - Wasser", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/coworkingSpaces":"Externe Infrastruktur - Coworking Spaces", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/einkaufsfuehrer":"Externe Infrastruktur - Einkaufsführer", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/einzelhandel":"Externe Infrastruktur - Einzelhandel", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/kirchenKappellenUndKloester":"Externe Infrastruktur - Kirchen, Kapellen und Klöster", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/maerkte":"Externe Infrastruktur - Märkte", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/oeffnungszeiten":"Externe Infrastruktur - Öffnungszeiten", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/polizei":"Externe Infrastruktur - Polizei", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/postfilialen":"Externe Infrastruktur - Postfilialen", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/weihnachtsmaerkte":"Externe Infrastruktur - Weihnachtsmärkte", + "https://musterdatenkatalog.de/def/musterdatensatz/externeInfrastruktur/wochenmaerkte":"Externe Infrastruktur - Wochenmärkte", + "https://musterdatenkatalog.de/def/musterdatensatz/feuerwehr/einrichtungen":"Feuerwehr - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/feuerwehr/einsaetze":"Feuerwehr - Einsätze", + "https://musterdatenkatalog.de/def/musterdatensatz/feuerwehr/kennzahlen":"Feuerwehr - Kennzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/freizeit/baeder":"Freizeit - Bäder", + "https://musterdatenkatalog.de/def/musterdatensatz/freizeit/einrichtungen":"Freizeit - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/freizeit/ferienangebot":"Freizeit - Ferienangebot", + "https://musterdatenkatalog.de/def/musterdatensatz/freizeit/grillplaetze":"Freizeit - Grillplätze", + "https://musterdatenkatalog.de/def/musterdatensatz/freizeit/sitzgelegenheiten":"Freizeit - Sitzgelegenheiten", + "https://musterdatenkatalog.de/def/musterdatensatz/friedhoefe/ehrengraeber":"Friedhöfe - Ehrengräber", + "https://musterdatenkatalog.de/def/musterdatensatz/friedhoefe/einrichtungen":"Friedhöfe - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/friedhoefe/grabstaetten":"Friedhöfe - Grabstätten", + "https://musterdatenkatalog.de/def/musterdatensatz/fuhrpark/kfzBestand":"Fuhrpark - KFZ-Bestand", + "https://musterdatenkatalog.de/def/musterdatensatz/geschichte/archivbestand":"Geschichte - Archivbestand", + "https://musterdatenkatalog.de/def/musterdatensatz/geschichte/entschaedigungen":"Geschichte - Entschädigungen", + "https://musterdatenkatalog.de/def/musterdatensatz/geschichte/historischeLuftaufnahmen":"Geschichte - Historische Luftaufnahmen", + "https://musterdatenkatalog.de/def/musterdatensatz/geschichte/information":"Geschichte - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/geschichte/personalverzeichnisHistorisch":"Geschichte - Personalverzeichnis historisch", + "https://musterdatenkatalog.de/def/musterdatensatz/gesundheitseinrichtungen/apotheken":"Gesundheitseinrichtungen - Apotheken", + "https://musterdatenkatalog.de/def/musterdatensatz/gesundheitseinrichtungen/baeder":"Gesundheitseinrichtungen - Bäder", + "https://musterdatenkatalog.de/def/musterdatensatz/gesundheitseinrichtungen/drogenhilfe":"Gesundheitseinrichtungen - Drogenhilfe", + "https://musterdatenkatalog.de/def/musterdatensatz/gesundheitseinrichtungen/hebammen":"Gesundheitseinrichtungen - Hebammen", + "https://musterdatenkatalog.de/def/musterdatensatz/gesundheitseinrichtungen/krankenhaeuser":"Gesundheitseinrichtungen - Krankenhäuser", + "https://musterdatenkatalog.de/def/musterdatensatz/gesundheitseinrichtungen/pflege":"Gesundheitseinrichtungen - Pflege", + "https://musterdatenkatalog.de/def/musterdatensatz/gewaesser/pegelstaende":"Gewässer - Pegelstände", + "https://musterdatenkatalog.de/def/musterdatensatz/gewaesser/wasserflaechen":"Gewässer - Wasserflächen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/ausgleichsflaechen":"Grünflächen - Ausgleichsflächen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/baumbestandBaumkataster":"Grünflächen - Baumbestand/Baumkataster", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/baumfaellungen":"Grünflächen - Baumfällungen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/biotopflaechen":"Grünflächen - Biotopflächen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/blumenampeln":"Grünflächen - Blumenampeln", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/brunnen":"Grünflächen - Brunnen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/gruenflaechenGruenflaechenkataster":"Grünflächen - Grünflächen/Grünflächenkataster", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/hundekottueten":"Grünflächen - Hundekottüten", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/hundewiesen":"Grünflächen - Hundewiesen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/jagdbezirke":"Grünflächen - Jagdbezirke", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/kleingaerten":"Grünflächen - Kleingärten", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/naturschutz":"Grünflächen - Naturschutz", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/parkanlagen":"Grünflächen - Parkanlagen", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/urbanGardening":"Grünflächen - Urban Gardening", + "https://musterdatenkatalog.de/def/musterdatensatz/gruenflaechen/waldflaechen":"Grünflächen - Waldflächen", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/ausserplanmaessigeAufwendungen":"Haushalt - Außerplanmäßige Aufwendungen", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/controlling":"Haushalt - Controlling", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/eckdaten":"Haushalt - Eckdaten", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/einzeldarstellungen":"Haushalt - Einzeldarstellungen", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/ergebnisplan":"Haushalt - Ergebnisplan", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/finanzplan":"Haushalt - Finanzplan", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/foerderungen":"Haushalt - Förderungen", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/haushaltskonsolidierung":"Haushalt - Haushaltskonsolidierung", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/haushaltsplan":"Haushalt - Haushaltsplan", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/jahresabschluss":"Haushalt - Jahresabschluss", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/metadaten":"Haushalt - Metadaten", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/produktbereichsummen":"Haushalt - Produktbereichssummen", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/produktgruppen":"Haushalt - Produktgruppen", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/produktplaene":"Haushalt - Produktpläne", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/satzung":"Haushalt - Satzung", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/sicherungskonzept":"Haushalt - Sicherungskonzept", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/sponsoring":"Haushalt - Sponsoring", + "https://musterdatenkatalog.de/def/musterdatensatz/haushalt/zuwendungenPolitischeGremien":"Haushalt - Zuwendungen Politische Gremien", + "https://musterdatenkatalog.de/def/musterdatensatz/hochschulen/gebaeude":"Hochschulen - Gebäude", + "https://musterdatenkatalog.de/def/musterdatensatz/hochschulen/studierendenzahlen":"Hochschulen - Studierendenzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/baustellen":"Individualverkehr - Baustellen", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/bussgelder":"Individualverkehr - Bußgelder", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/carsharing":"Individualverkehr - Carsharing", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/fahrzeugzulassungen":"Individualverkehr - Fahrzeugzulassungen", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/kennzahlen":"Individualverkehr - Kennzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/kfzBestand":"Individualverkehr - KFZ-Bestand", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/laerm":"Individualverkehr - Lärm", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/messstellen":"Individualverkehr - Messstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/schwerlastverkehr":"Individualverkehr - Schwerlastverkehr", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/sondernutzungen":"Individualverkehr - Sondernutzungen", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/strassenverkehr":"Individualverkehr - Straßenverkehr", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/taxis":"Individualverkehr - Taxis", + "https://musterdatenkatalog.de/def/musterdatensatz/individualverkehr/unfaelle":"Individualverkehr - Unfälle", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/adressen":"Infrastruktur - Adressen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/ampelanlagen":"Infrastruktur - Ampelanlagen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/autobahnbindung":"Infrastruktur - Autobahnanbindung", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/baustellen":"Infrastruktur - Baustellen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/beleuchtungen":"Infrastruktur - Beleuchtung", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/bruecken":"Infrastruktur - Brücken", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/elektrotankstellen":"Infrastruktur - Elektrotankstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/fahrradstrassen":"Infrastruktur - Fahrradstraßen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/flughaefen":"Infrastruktur - Flughäfen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/fussgaengerzonen":"Infrastruktur - Fußgängerzonen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/laufstrecken":"Infrastruktur - Laufstrecken", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/oeffentlicheToiletten":"Infrastruktur - Öffentliche Toiletten", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/parkplaetze":"Infrastruktur - Parkplätze", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/schiffsanlegestellen":"Infrastruktur - Schiffsanlegestellen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/strassen":"Infrastruktur - Straßen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/strassenreinigung":"Infrastruktur - Straßenreinigung", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/tankstellen":"Infrastruktur - Tankstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/infrastruktur/wlanUndMobilfunk":"Infrastruktur - WLAN und Mobilfunk", + "https://musterdatenkatalog.de/def/musterdatensatz/jugend/einrichtungen":"Jugend - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/justiz/einrichtungen":"Justiz - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/justiz/gesetzestexte":"Justiz - Gesetzestexte", + "https://musterdatenkatalog.de/def/musterdatensatz/kindertageseinrichtungen/betreuungsplaetze":"Kindertageseinrichtungen - Betreuungsplätze", + "https://musterdatenkatalog.de/def/musterdatensatz/kindertageseinrichtungen/kindertagesstaetten":"Kindertageseinrichtungen - Kindertagestätten", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/besucherzahlen":"Kultur - Besucherzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/denkmaeler":"Kultur - Denkmäler", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/foerderungen":"Kultur - Förderungen", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/information":"Kultur - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/kunstwerke":"Kultur - Kunstwerke", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/lehrUndWanderpfade":"Kultur - Lehr- und Wanderpfade", + "https://musterdatenkatalog.de/def/musterdatensatz/kultur/veranstaltungen":"Kultur - Veranstaltungen", + "https://musterdatenkatalog.de/def/musterdatensatz/liegenschaften/gebaeude":"Liegenschaften - Gebäude", + "https://musterdatenkatalog.de/def/musterdatensatz/liegenschaften/grundstuecke":"Liegenschaften - Grundstücke", + "https://musterdatenkatalog.de/def/musterdatensatz/liegenschaften/jahresberichte":"Liegenschaften - Jahresberichte", + "https://musterdatenkatalog.de/def/musterdatensatz/liegenschaften/satzungen":"Liegenschaften - Satzungen", + "https://musterdatenkatalog.de/def/musterdatensatz/museen/besucherzahlen":"Museen - Besucherzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/museen/einrichtungen":"Museen - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/musikschulen/jahresrechnung":"Musikschulen - Jahresrechnung", + "https://musterdatenkatalog.de/def/musterdatensatz/musikschulen/teilnehmer":"Musikschulen - Teilnehmer", + "https://musterdatenkatalog.de/def/musterdatensatz/musikschulen/unterrichtsangebot":"Musikschulen - Unterrichtsangebot", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlicheWirtschaft/ausschreibungenVergaben":"Öffentliche Wirtschaft - Ausschreibungen Vergaben", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlicheWirtschaft/beteiligungen":"Öffentliche Wirtschaft - Beteiligungen", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlichkeitsarbeit/amtsblatt":"Öffentlichkeitsarbeit - Amtsblatt", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlichkeitsarbeit/ehrenbuerrger":"Öffentlichkeitsarbeit - Ehrenbürger", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlichkeitsarbeit/fotos":"Öffentlichkeitsarbeit - Fotos", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlichkeitsarbeit/information":"Öffentlichkeitsarbeit - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/oeffentlichkeitsarbeit/pressemitteilungen":"Öffentlichkeitsarbeit - Pressemitteilungen", + "https://musterdatenkatalog.de/def/musterdatensatz/openData/information":"Open Data - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/openData/wunschlisten":"Open Data - Wunschlisten", + "https://musterdatenkatalog.de/def/musterdatensatz/openData/zugriffe":"Open Data - Zugriffe", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/aufzuegeUndRolltreppen":"ÖPNV - Aufzüge und Rolltreppen", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/befragungen":"ÖPNV - Befragung", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/fahrgastzahlen":"ÖPNV - Fahrgastzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/haltestellen":"ÖPNV - Haltestellen", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/liniennetz":"ÖPNV - Liniennetz", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/sollfahrdaten":"ÖPNV - Sollfahrdaten", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/verkehrsnetz":"ÖPNV - Verkehrsnetz", + "https://musterdatenkatalog.de/def/musterdatensatz/oepnv/vertriebsstellen":"ÖPNV - Vertriebsstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/personal/stellenplan":"Personal - Stellenplan", + "https://musterdatenkatalog.de/def/musterdatensatz/politischeVertretung/buergermeister":"Politische Vertretung - Bürgermeister", + "https://musterdatenkatalog.de/def/musterdatensatz/politischeVertretung/gremien":"Politische Vertretung - Gremien", + "https://musterdatenkatalog.de/def/musterdatensatz/politischeVertretung/mandatstraeger":"Politische Vertretung - Mandatsträger", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/buergerbeteiligung":"Radverkehr - Bürgerbeteiligung", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/fahrraeder":"Radverkehr - Fahrräder", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/foerderungen":"Radverkehr - Förderungen", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/ladestationen":"Radverkehr - Ladestationen", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/messstellen":"Radverkehr - Messstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/radrouten":"Radverkehr - Radrouten", + "https://musterdatenkatalog.de/def/musterdatensatz/radverkehr/stellplaetze":"Radverkehr - Stellplätze", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/adressen":"Raumordnung - Adressen", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/baublockgrenzen":"Raumordnung - Baublockgrenzen", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/bebauungsplaene":"Raumordnung - Bebauungspläne", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/bloecke":"Raumordnung - Blöcke", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/flaechennutzungen":"Raumordnung - Flächennutzungen", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/hausnummern":"Raumordnung - Hausnummern", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/liegenschaftskataster":"Raumordnung - Liegenschaftskataster", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/orthofotos":"Raumordnung - Orthofotos", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/ortsteile":"Raumordnung - Ortsteile", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/postleitzahlengebiete":"Raumordnung - Postleitzahlengebiete", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/sozialraeume":"Raumordnung - Sozialräume", + "https://musterdatenkatalog.de/def/musterdatensatz/raumordnung/stadtgebiet":"Raumordnung - Stadtgebiet", + "https://musterdatenkatalog.de/def/musterdatensatz/rettungsdienst/defibrillatoren":"Rettungsdienst - Defibrillatoren", + "https://musterdatenkatalog.de/def/musterdatensatz/rettungsdienst/einsaetze":"Rettungsdienst - Einsätze", + "https://musterdatenkatalog.de/def/musterdatensatz/rettungsdienst/reanimationen":"Rettungsdienst - Reanimationen", + "https://musterdatenkatalog.de/def/musterdatensatz/rettungsdienst/rettungspunkt":"Rettungsdienst - Rettungspunkt", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/einrichtungen":"Schulen - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/internetanbindung":"Schulen - Internetanbindung", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/schulangebot":"Schulen - Schulangebot", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/schuleingangsuntersuchungen":"Schulen - Schuleingangsunteruchungen", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/schulentwicklungsplan":"Schulen - Schulentwicklungsplan", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/schuelerzahlen":"Schulen - Schülerzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/schulen/wunschschule":"Schulen - Wunschschule", + "https://musterdatenkatalog.de/def/musterdatensatz/senioren/einrichtungen":"Senioren - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/sicherheit/karneval":"Sicherheit - Karneval", + "https://musterdatenkatalog.de/def/musterdatensatz/sicherheit/kriminalitaetsstatistik":"Sicherheit - Kriminalitätsstatistik", + "https://musterdatenkatalog.de/def/musterdatensatz/sicherheit/notinseln":"Sicherheit - Notinseln", + "https://musterdatenkatalog.de/def/musterdatensatz/sicherheit/ordnungsamt":"Sicherheit - Ordnungsamt", + "https://musterdatenkatalog.de/def/musterdatensatz/sicherheit/silvester":"Sicherheit - Silvester", + "https://musterdatenkatalog.de/def/musterdatensatz/sozialeHilfen/asylbewerber":"Soziale Hilfen - Asylwerber", + "https://musterdatenkatalog.de/def/musterdatensatz/sozialeHilfen/behindertenwohnheime":"Soziale Hilfen - Behindertenwohnheime", + "https://musterdatenkatalog.de/def/musterdatensatz/sozialeHilfen/einrichtungen":"Soziale Hilfen - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/sozialeHilfen/leistungsbezieher":"Soziale Hilfen - Leistungsbezieher", + "https://musterdatenkatalog.de/def/musterdatensatz/sozialeHilfen/strassen":"Soziale Hilfen - Straßen", + "https://musterdatenkatalog.de/def/musterdatensatz/sozialeHilfen/wohngeld":"Soziale Hilfen - Wohngeld", + "https://musterdatenkatalog.de/def/musterdatensatz/sportUndSpielstaetten/belegung":"Sport- und Spielstätten - Belegung", + "https://musterdatenkatalog.de/def/musterdatensatz/sportUndSpielstaetten/einrichtungen":"Sport- und Spielstätten - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/sportUndSpielstaetten/freibaeder":"Sport- und Spielstätten - Freibäder", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtarchiv/bestaende":"Stadtarchiv - Bestände", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtmarketing/information":"Stadtmarketing - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtmarketing/staedterankings":"Stadtmarketing - Städterankings", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtmarketing/standortentwicklung":"Stadtmarketing - Standortentwicklung", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtmarketing/zahlenUndFakten":"Stadtmarketing - Zahlen und Fakten", + "https://musterdatenkatalog.de/def/musterdatensatz/Stadtplan/Stadtmodell3d":"Stadtplan - Stadtmodell 3D", + "https://musterdatenkatalog.de/def/musterdatensatz/Stadtplan/stadtplaene":"Stadtplan - Stadtpläne", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtwerke/ausschreibungenVergaben":"Stadtwerke - Ausschreibungen Vergaben", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtwerke/immobilienangebote":"Stadtwerke - Immobilienangebote", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtwerke/information":"Stadtwerke - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/stadtwerke/kennzahlen":"Stadtwerke - Kennzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/steuernUndAbgaben/hundesteuer":"Steuern und Abgaben - Hundesteuer", + "https://musterdatenkatalog.de/def/musterdatensatz/steuernUndAbgaben/nettoeinnahmen":"Steuern und Abgaben - Nettoeinnahmen", + "https://musterdatenkatalog.de/def/musterdatensatz/theater/besucherzahlen":"Theater - Besucherzahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/tiefbau/geschaeftsberichte":"Tiefbau - Geschäftsberichte", + "https://musterdatenkatalog.de/def/musterdatensatz/tourismus/campingplaetze":"Tourismus - Campingplätze", + "https://musterdatenkatalog.de/def/musterdatensatz/tourismus/gaestezahlen":"Tourismus - Gästezahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/tourismus/privatunterkuenfte":"Tourismus - Privatunterkünfte", + "https://musterdatenkatalog.de/def/musterdatensatz/tourismus/sehenswuerdigkeiten":"Tourismus - Sehenswürdigkeiten", + "https://musterdatenkatalog.de/def/musterdatensatz/tourismus/stadtfuehrungen":"Tourismus - Stadtführungen", + "https://musterdatenkatalog.de/def/musterdatensatz/tourismus/uebernachtungen":"Tourismus - Übernachtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/umweltschutz/grundwasser":"Umweltschutz - Grundwasser", + "https://musterdatenkatalog.de/def/musterdatensatz/umweltschutz/klimabilanz":"Umweltschutz - Klimabilanz", + "https://musterdatenkatalog.de/def/musterdatensatz/umweltschutz/messstellen":"Umweltschutz - Messstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/umweltschutz/nachhaltigkeit":"Umweltschutz - Nachhaltigkeit", + "https://musterdatenkatalog.de/def/musterdatensatz/umweltschutz/trinkwasser":"Umweltschutz - Trinkwasser", + "https://musterdatenkatalog.de/def/musterdatensatz/umweltschutz/umweltzonen":"Umweltschutz - Umweltzonen", + "https://musterdatenkatalog.de/def/musterdatensatz/vereineVerbaende/einrichtungen":"Vereine, Verbände - Einrichtungen", + "https://musterdatenkatalog.de/def/musterdatensatz/volkshochschulen/information":"Volkshochschulen - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/volkshochschulen/programm":"Volkshochschulen - Programm", + "https://musterdatenkatalog.de/def/musterdatensatz/volkshochschulen/teilnehmer":"Volkshochschulen - Teilnehmer", + "https://musterdatenkatalog.de/def/musterdatensatz/volkshochschulen/veranstaltungen":"Volkshochschulen - Veranstaltungen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/kandidatenlisten":"Wahlen - Kandidatenlisten", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/kommunalwahl":"Wahlen - Kommunalwahl", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/strassen":"Wahlen - Straßen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlbeteiligungBundestagswahlen":"Wahlen - Wahlbeteiligung Bundestagswahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlbteiligungKommunalwahlen":"Wahlen - Wahlbeteiligung Kommunalwahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlbezirke":"Wahlen - Wahlbezirke", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlergebnisBeiratswahlen":"Wahlen - Wahlergebnis Beiratswahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlergebnisBundestagswahlen":"Wahlen - Wahlergebnis Bundestagswahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlergebnisEuropawahlen":"Wahlen - Wahlergebnis Europawahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlergebnisKommunalwahlen":"Wahlen - Wahlergebnis Kommunalwahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlergebnisLandtagswahlen":"Wahlen - Wahlergebnis Landtagswahlen", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahlkreise":"Wahlen - Wahlkreise", + "https://musterdatenkatalog.de/def/musterdatensatz/wahlen/wahllokale":"Wahlen - Wahllokale", + "https://musterdatenkatalog.de/def/musterdatensatz/websiten/zugriffe":"Website - Zugriffe", + "https://musterdatenkatalog.de/def/musterdatensatz/wetter/hitze":"Wetter - Hitze", + "https://musterdatenkatalog.de/def/musterdatensatz/wetter/messstellen":"Wetter - Messstellen", + "https://musterdatenkatalog.de/def/musterdatensatz/wirtschaft/bueroflaechen":"Wirtschaft - Büroflächen", + "https://musterdatenkatalog.de/def/musterdatensatz/wirtschaft/industrieUndGewerbeflaechen":"Wirtschaft - Industrie- und Gewerbeflächen", + "https://musterdatenkatalog.de/def/musterdatensatz/wirtschaft/meldungen":"Wirtschaft - Meldungen", + "https://musterdatenkatalog.de/def/musterdatensatz/wirtschaft/wirtschaftsfoerderung":"Wirtschaft - Wirtschaftsförderung", + "https://musterdatenkatalog.de/def/musterdatensatz/wirtschaft/wirtschaftsstandorte":"Wirtschaft - Wirtschaftsstandorte", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/bauprojekte":"Wohnen - Bauprojekte", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/flaechengroessen":"Wohnen - Flächengrößen", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/fluechtlingsunterbringung":"Wohnen - Flüchtlingsunterbringung", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/gefoerderterWohnbau":"Wohnen - geförderter Wohnbau", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/information":"Wohnen - Information", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/sozialraeume":"Wohnen - Sozialräume", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/studentenwohnheime":"Wohnen - Studentenwohnheime", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/wohnplaetze":"Wohnen - Wohnplätze", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/wohnquartiere":"Wohnen - Wohnquartiere", + "https://musterdatenkatalog.de/def/musterdatensatz/wohnen/wohnungseigentum":"Wohnen - Wohnungseigentum", + "https://musterdatenkatalog.de/def/musterdatensatz/zivilUndKatastrophenschutz/kampfmittelfunde":"Zivil- und Katastrophenschutz - Kampfmittelfunde", + "https://musterdatenkatalog.de/def/musterdatensatz/zivilUndKatastrophenschutz/sirenen":"Zivil- und Katastrophenschutz - Sirenen" +} + diff --git a/out.uls b/out.uls new file mode 100644 index 0000000000000000000000000000000000000000..de4db1551cc3abf0e549b6545439211fd1fe70df --- /dev/null +++ b/out.uls @@ -0,0 +1,30 @@ +V;2019-04-25 12:18:36;ckan274;"ULS";"Exception";"traceback";"Text";" +Traceback (most recent call last): +File \\"/usr/lib/ckan/default/src/ckanext-odsh/ckanext/odsh/plugin.py\\", line 358, in before_search +raise BaseException('boom') +BaseException: boom +"; +V;2019-04-25 12:18:37;ckan274;"ULS";"Exception";"traceback";"Text";" +Traceback (most recent call last): +File \\"/usr/lib/ckan/default/src/ckanext-odsh/ckanext/odsh/plugin.py\\", line 358, in before_search +raise BaseException('boom') +BaseException: boom +"; +V;2019-04-25 12:18:38;ckan274;"ULS";"Exception";"traceback";"Text";" +Traceback (most recent call last): +File \\"/usr/lib/ckan/default/src/ckanext-odsh/ckanext/odsh/plugin.py\\", line 358, in before_search +raise BaseException('boom') +BaseException: boom +"; +V;2019-04-25 12:18:40;ckan274;"ULS";"Exception";"traceback";"Text";" +Traceback (most recent call last): +File \\"/usr/lib/ckan/default/src/ckanext-odsh/ckanext/odsh/plugin.py\\", line 358, in before_search +raise BaseException('boom') +BaseException: boom +"; +V;2019-04-25 12:18:41;ckan274;"ULS";"Exception";"traceback";"Text";" +Traceback (most recent call last): +File \\"/usr/lib/ckan/default/src/ckanext-odsh/ckanext/odsh/plugin.py\\", line 358, in before_search +raise BaseException('boom') +BaseException: boom +"; diff --git a/setup.py b/setup.py index 6a60a5112fb1134b4d6b28b47b44b2c4ed6cebcc..56287f08b92df2409200a83f764ab61a294c50df 100755 --- a/setup.py +++ b/setup.py @@ -96,6 +96,7 @@ setup( ckan = ckan.lib.extract:extract_ckan [ckan.rdf.profiles] + odsheuro_dcat_ap=ckanext.odsh.profiles:ODSHEuropeanDCATAPProfile odshdcatap_de=ckanext.odsh.profiles:ODSHDCATdeProfile ''', diff --git a/validation.py b/validation.py new file mode 100644 index 0000000000000000000000000000000000000000..e50cbb4394ddbcc447a7fe87d200e738ba6019e6 --- /dev/null +++ b/validation.py @@ -0,0 +1,241 @@ +# This Python file uses the following encoding: utf-8 +import logging +import csv +import re +import urllib2 +import json +from itertools import count +from dateutil.parser import parse + +import ckan.plugins.toolkit as toolkit +import ckan.model as model +from ckan.lib.navl.dictization_functions import Missing + +from pylons import config + +import pdb + +_ = toolkit._ + +log = logging.getLogger(__name__) + + +def _extract_value(data, field): + key = None + for k in data.keys(): + if data[k] == field: + key = k + break + if key is None: + return None + return data[(key[0], key[1], 'value')] + + +def validate_extra_groups(data, requireAtLeastOne, errors): + value = _extract_value(data, 'groups') + if value != None: + # 'value != None' means the extra key 'groups' was found, + # so the dataset came from manual editing via the web-frontend. + if not value: + if requireAtLeastOne: + errors['groups'] = 'at least one group needed' + data[('groups', 0, 'id')] = '' + return + + groups = [g.strip() for g in value.split(',') if value.strip()] + for k in data.keys(): + if len(k) == 3 and k[0] == 'groups': + data[k] = '' + # del data[k] + if len(groups) == 0: + if requireAtLeastOne: + errors['groups'] = 'at least one group needed' + return + + for num, group in zip(range(len(groups)), groups): + data[('groups', num, 'id')] = group + else: # no extra-field 'groups' + # dataset might come from a harvest process + if not data.get(('groups', 0, 'id'), False) and \ + not data.get(('groups', 0, 'name'), False): + errors['groups'] = 'at least one group needed' + + +def validate_extras(key, data, errors, context): + extra_errors = {} + isStaNord = ('id',) in data and data[('id',)][:7] == 'StaNord' + + validate_extra_groups(data, True, extra_errors) + validate_extra_date_new(key, 'issued', data, isStaNord, extra_errors) + validate_extra_date_new(key, 'temporal_start', + data, isStaNord, extra_errors) + validate_extra_date_new(key, 'temporal_end', data, True, extra_errors) + + if len(extra_errors.values()): + raise toolkit.Invalid(extra_errors) + + +def _set_value(data, field, value): + key = None + for k in data.keys(): + if data[k] == field: + key = k + break + if key is None: + return None + data[(key[0], key[1], 'value')] = value + + +def validate_extra_date_new(key, field, data, optional, errors): + value = _extract_value(data, field) + + if not value: + if not optional: + errors[field] = 'empty' + return + else: + if re.match(r'\d\d\d\d-\d\d-\d\d', value): + try: + dt = parse(value) + _set_value(data, field, dt.isoformat()) + return + except ValueError: + pass + errors[field] = 'not a valid date' + + +def validate_licenseAttributionByText(key, data, errors, context): + register = model.Package.get_license_register() + isByLicense = False + for k in data: + if len(k) > 0 and k[0] == 'license_id' and data[k] and not isinstance(data[k], Missing) and \ + 'Namensnennung' in register[data[k]].title: + isByLicense = True + break + hasAttribution = False + for k in data: + if data[k] == 'licenseAttributionByText': + if isinstance(data[(k[0], k[1], 'value')], Missing) or (k[0], k[1], 'value') not in data: + del data[(k[0], k[1], 'value')] + del data[(k[0], k[1], 'key')] + break + else: + value = data[(k[0], k[1], 'value')] + hasAttribution = value != '' + break + if not hasAttribution: + current_indexes = [k[1] for k in data.keys() + if len(k) > 1 and k[0] == 'extras'] + + new_index = max(current_indexes) + 1 if current_indexes else 0 + data[('extras', new_index, 'key')] = 'licenseAttributionByText' + data[('extras', new_index, 'value')] = '' + + if isByLicense and not hasAttribution: + raise toolkit.Invalid( + 'licenseAttributionByText: empty not allowed') + + if not isByLicense and hasAttribution: + raise toolkit.Invalid( + 'licenseAttributionByText: text not allowed for this license') + + +def known_spatial_uri(key, data, errors, context): + value = _extract_value(data, 'spatial_uri') + + if not value: + poly = None + + # some harvesters might import a polygon directly... + # pdb.set_trace() + poly = _extract_value(data, 'spatial') + + has_old_uri = False + pkg = context.get('package', None) + if pkg: + old_uri = pkg.extras.get('spatial_uri', None) + has_old_uri = old_uri != None and len(old_uri) > 0 + if not poly: + poly = pkg.extras.get('spatial', None) + if not poly or has_old_uri: + raise toolkit.Invalid('spatial_uri: empty not allowed') + else: + if poly: + new_index = next_extra_index(data) + data[('extras', new_index+1, 'key')] = 'spatial' + data[('extras', new_index+1, 'value')] = poly + return + + mapping_file = config.get('ckanext.odsh.spatial.mapping') + try: + mapping_file = urllib2.urlopen(mapping_file) + except Exception: + raise Exception("Could not load spatial mapping file!") + + not_found = True + spatial_text = str() + spatial = str() + cr = csv.reader(mapping_file, delimiter="\t") + for row in cr: + if row[0].encode('UTF-8') == value: + not_found = False + spatial_text = row[1] + loaded = json.loads(row[2]) + spatial = json.dumps(loaded['geometry']) + break + if not_found: + raise toolkit.Invalid( + 'spatial_uri: uri unknown') + + new_index = next_extra_index(data) + + data[('extras', new_index, 'key')] = 'spatial_text' + data[('extras', new_index, 'value')] = spatial_text + data[('extras', new_index+1, 'key')] = 'spatial' + data[('extras', new_index+1, 'value')] = spatial + + +def next_extra_index(data): + current_indexes = [k[1] for k in data.keys() + if len(k) > 1 and k[0] == 'extras'] + + return max(current_indexes) + 1 if current_indexes else 0 + + +def tag_name_validator(value, context): + tagname_match = re.compile('[\w \-.\:\(\)\´\`]*$', re.UNICODE) + if not tagname_match.match(value): + raise toolkit.Invalid(_('Tag "%s" must be alphanumeric ' + 'characters or symbols: -_.:()') % (value)) + return value + + +def tag_string_convert(key, data, errors, context): + '''Takes a list of tags that is a comma-separated string (in data[key]) + and parses tag names. These are added to the data dict, enumerated. They + are also validated.''' + if isinstance(data[key], basestring): + tags = [tag.strip() + for tag in data[key].split(',') + if tag.strip()] + else: + tags = data[key] + + current_index = max([int(k[1]) for k in data.keys() + if len(k) == 3 and k[0] == 'tags'] + [-1]) + + for num, tag in zip(count(current_index+1), tags): + data[('tags', num, 'name')] = tag + + for tag in tags: + toolkit.get_validator('tag_length_validator')(tag, context) + tag_name_validator(tag, context) + + +def get_validators(): + return { + 'known_spatial_uri': known_spatial_uri, + 'odsh_tag_name_validator': tag_name_validator, + 'odsh_validate_extras': validate_extras, + 'validate_licenseAttributionByText': validate_licenseAttributionByText + }