diff --git a/ckanext/odsh/helpers.py b/ckanext/odsh/helpers.py index aaff41c8272def2c4802c1a617abd731c02560b6..1dfa379163c36f82a59dedcb15ca3538d8067446 100644 --- a/ckanext/odsh/helpers.py +++ b/ckanext/odsh/helpers.py @@ -15,6 +15,7 @@ import urllib.parse import urllib.error import hashlib import re +import os import csv from ckan.common import config, request, g, c from urllib.parse import urlsplit, urlunsplit @@ -500,65 +501,48 @@ def short_name_for_category(category_name): } return translations.get(category_name) -def odsh_load_applicable_legislations(): + +def _load_mapping(mapping_file_path, uri=None): + result = None + try: + with open(mapping_file_path) as mapping_json: + MAPPING = json.load(mapping_json, object_pairs_hook=OrderedDict) + + if uri: + # Filter MAPPING to find the entry with the matching uri + filtered_entries = [entry for entry in MAPPING if entry.get('uri') == uri] + result = filtered_entries[0] if filtered_entries else None + else: + # If no uri provided, return all entries in key/value format (used in form) + result = [{'key': entry['uri'], 'value': entry.get('short_title', entry['title'])} for entry in MAPPING] + except FileNotFoundError: + print("File not found or path is incorrect.") + except json.JSONDecodeError: + print("Error decoding JSON.") + + return result + +def odsh_load_applicable_legislations(uri=None): ''' Load applicable legislations. ''' extension_path = pkg_resources.resource_filename('ckanext.odsh', '') - default_mapping_file_path = extension_path + '/resources/applicable_legislations.json' - mapping_file_path = config.get( - 'ckanext.odsh.applicable_legislations_file_path', default_mapping_file_path) + default_mapping_file_path = os.path.join(extension_path, 'resources', 'applicable_legislations.json') + mapping_file_path = config.get('ckanext.odsh.applicable_legislations_file_path', default_mapping_file_path) - try: - with open(mapping_file_path) as mapping_json: - MAPPING = json.loads( - mapping_json.read(), object_pairs_hook=OrderedDict) - options = [{'key': key, 'value': MAPPING[key]} - for key in MAPPING] - except IOError as err: - log.error( - 'Could not load mapping file from {}' - .format(mapping_file_path) - ) - raise - except ValueError as err: - log.error( - 'Could not convert mapping file from json. \nMapping file: {}' - .format(mapping_file_path) - ) - raise - return options + return _load_mapping(mapping_file_path, uri) -def odsh_load_hvd_categories(): +def odsh_load_hvd_categories(uri=None): ''' Load HVD categories. ''' extension_path = pkg_resources.resource_filename('ckanext.odsh', '') - default_mapping_file_path = extension_path + '/resources/hvd_categories.json' - mapping_file_path = config.get( - 'ckanext.odsh.hvd_categories_file_path', default_mapping_file_path) + default_mapping_file_path = os.path.join(extension_path, 'resources', 'hvd_categories.json') + mapping_file_path = config.get('ckanext.odsh.hvd_categories_file_path', default_mapping_file_path) - try: - with open(mapping_file_path) as mapping_json: - MAPPING = json.loads( - mapping_json.read(), object_pairs_hook=OrderedDict) - options = [{'key': key, 'value': MAPPING[key]} - for key in MAPPING] - except IOError as err: - log.error( - 'Could not load mapping file from {}' - .format(mapping_file_path) - ) - raise - except ValueError as err: - log.error( - 'Could not convert mapping file from json. \nMapping file: {}' - .format(mapping_file_path) - ) - raise - return options + return _load_mapping(mapping_file_path, uri) def odsh_load_mdk_sample_dataset(): ''' @@ -855,12 +839,12 @@ def format_resource_format(format_str): def extract_email(text): if not isinstance(text, str): return None # Return None for non-string inputs - + # Regular expression pattern to match email addresses email_pattern = r'[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}' - + # Find all email addresses in the input text using the regular expression pattern matches = re.findall(email_pattern, text) - + # If there are matches, return the first email address found, else return None - return matches[0] if matches else None \ No newline at end of file + return matches[0] if matches else None