From 76348ccca4d988d1de9f1d96cd163477cd2dfb06 2022-09-20 18:53:23 From: Edson Date: 2022-09-20 18:53:23 Subject: [PATCH] v2.9.2 :: Add 'download_files_advance' API function --- diff --git a/CKAN_JRO-2.9.2.0.tar.gz b/CKAN_JRO-2.9.2.0.tar.gz index 46953d40108c92d6042e5061ea892ab405d57ee2..a909638146824fae59d5c5fe1da3a4c1a1a0a0f1 100644 GIT binary patch literal 11202 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 literal 8383 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 VRjN{zs`PtF{|}bLCtUy-0RSTwni2p2 diff --git a/script/CKAN_JRO/jro_api.py b/script/CKAN_JRO/jro_api.py index 0641033..f3e5035 100755 --- a/script/CKAN_JRO/jro_api.py +++ b/script/CKAN_JRO/jro_api.py @@ -1,6 +1,7 @@ from ckanapi import RemoteCKAN from datetime import datetime from tqdm import tqdm +from CKAN_JRO import logic_download #from ckanapi.errors import NotAuthorized, NotFound, ValidationError, SearchQueryError, SearchError, CKANAPIError, ServerIncompatibleError import sys import platform @@ -932,4 +933,90 @@ class JROAPI(): shutil.rmtree(dir_name[:-1]) return 'NO FILES WERE DOWNLOADED' else: - return 'FILES NOT FOUND' \ No newline at end of file + return 'FILES NOT FOUND' + + def download_files_advance(self, id_or_name, processes=1, path=os.path.expanduser("~"), **kwargs): + ''' + FINALIDAD: + Funcion personalizada avanzada para la descarga de archivos existentes de un(os) dataset(s). + + PARAMETROS DISPONIBLES: + CONSULTAR: "GUIA DE SCRIPT.pdf" + + ESTRUCTURA: + .download_files_advance(id_or_name= , param_1 = , ...) + ''' + #------------------ PATH ----------------------# + if isinstance(path, str): + if os.path.isdir(path): + if not path.endswith(os.sep): + path = path + os.sep + test_txt = path + datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")+'.txt' + try: + file_txt = open(test_txt, 'w') + file_txt.close() + os.remove(test_txt) + except: + return 'ERROR:: Access denied, you are not authorized to write files: "%s"' % (path) + else: + return 'ERROR:: "path" does not exist' + else: + return 'ERROR:: "path" must be: ' + + #------------------ PROCESSES -----------------# + if not isinstance(processes, int): + return 'ERROR:: "processes" must be: ' + + #------------------ ID OR NAME ----------------# + if isinstance(id_or_name, str): + id_or_name = [id_or_name] + elif isinstance(id_or_name, list): + id_or_name = list(map(str, id_or_name)) + else: + return 'ERROR:: dataset "id_or_name" must be: ' + #----------------------------------------------# + arguments = { + '--apikey': self.Authorization, + '--ckan-user': None, + '--config': None, + '--datapackages': path, + '--datastore-fields': False, + '--get-request': False, + '--insecure': not self.verify, + '--log': '/home/soporte/DUMP/download.txt', + '--processes': str(processes), + '--quiet': False, + '--remote': self.url, + '--worker': False, + #'--all': False, + #'--gzip': False, + #'--output': None, + #'--max-records': None, + #'--output-json': False, + #'--output-jsonl': False, + #'--create-only': False, + #'--help': False, + #'--input': None, + #'--input-json': False, + #'--start-record': '1', + #'--update-only': False, + #'--upload-logo': False, + #'--upload-resources': False, + #'--version': False, + 'ID_OR_NAME': id_or_name, + 'datasets': True, + 'dump': True, + #'ACTION_NAME': None, + #'KEY:JSON': [], + #'KEY=STRING': [], + #'KEY@FILE': [], + #'action': False, + #'delete': False, + #'groups': False, + #'load': False, + #'organizations': False, + #'related': False, + #'search': False, + #'users': False + } + return logic_download.dump_things_change(self.ckan, 'datasets', arguments, **kwargs) \ No newline at end of file diff --git a/script/CKAN_JRO/logic_download.py b/script/CKAN_JRO/logic_download.py new file mode 100644 index 0000000..3e258d6 --- /dev/null +++ b/script/CKAN_JRO/logic_download.py @@ -0,0 +1,228 @@ +#from ckanapi.datapackage import populate_schema_from_datastore +from ckanapi.cli import workers, dump +from ckanapi.cli.utils import pretty_json, completion_stats, compact_json, quiet_int_pipe +from datetime import datetime +import sys +import json +import os +import requests +import six + +if sys.version_info.major == 3: + from urllib.parse import urlparse +else: + import urlparse + +DL_CHUNK_SIZE = 100 * 1024 + +print() + +def dump_things_change(ckan, thing, arguments, worker_pool=None, stdout=None, stderr=None, **kwargs): + if worker_pool is None: + worker_pool = workers.worker_pool + if stdout is None: + stdout = getattr(sys.__stdout__, 'buffer', sys.__stdout__) + if stderr is None: + stderr = getattr(sys.stderr, 'buffer', sys.stderr) + + if arguments['--worker']: + return dump.dump_things_worker(ckan, thing, arguments) + ''' + log = None + if arguments['--log']: + log = open(arguments['--log'], 'a') + ''' + jsonl_output = stdout + if arguments['--datapackages']: + jsonl_output = open(os.devnull, 'wb') + + names = arguments['ID_OR_NAME'] + + if names and isinstance(names[0], dict): + names = [rec.get('name',rec.get('id')) for rec in names] + ''' + if arguments['--datapackages']: + arguments['--datastore-fields'] = True + ''' + #----------------------------# + filtered_urls = {} + for name in names: + try: + response = getattr(ckan.action, 'url_resources')(id=name, **kwargs) + except: + _, exc_value, _ = sys.exc_info() + return exc_value + filtered_urls[name] = response + #----------------------------# + + cmd = dump._worker_command_line(thing, arguments) + processes = int(arguments['--processes']) + if hasattr(ckan, 'parallel_limit'): + processes = min(processes, ckan.parallel_limit) + stats = completion_stats(processes) + pool = worker_pool(cmd, processes, enumerate(compact_json(n) + b'\n' for n in names)) + + results = {} + expecting_number = 0 + with quiet_int_pipe() as errors: + for job_ids, finished, result in pool: + if not result: + return 1 + timestamp, error, record = json.loads(result.decode('utf-8')) + results[finished] = record + + if not arguments['--quiet']: + stderr.write('** Finished: {0} | Job IDs: {1} | Next Report: {2} | Error: {3} | Dataset Name: {4}\n'.format( + finished, + job_ids, + next(stats), + error, + record.get('name', '') if record else '', + ).encode('utf-8')) + ''' + if log: + log.write(compact_json([ + timestamp, + finished, + error, + record.get('name', '') if record else None, + ]) + b'\n') + ''' + datapackages_path = arguments['--datapackages'] + if datapackages_path: + create_datapackage_change(record, filtered_urls[record.get('name', '')], datapackages_path, stderr, arguments['--apikey'], arguments['--remote'], arguments['--insecure']) + while expecting_number in results: + record = results.pop(expecting_number) + if record: + jsonl_output.write(compact_json(record, sort_keys=True) + b'\n') + expecting_number += 1 + if 'pipe' in errors: + return 1 + if 'interrupt' in errors: + return 2 + +def create_datapackage_change(record, filtered_url, base_path, stderr, apikey, host_url, insecure): + resource_formats_to_ignore = ['API', 'api'] + #----------------------------------------# + datapackage_dir = name_no_repetition(record.get('name', ''), base_path) + #----------------------------------------# + os.makedirs(os.path.join(datapackage_dir, 'data')) + record['path'] = datapackage_dir + + ckan_resources = [] + for resource in record.get('resources', []): + if resource['format'] in resource_formats_to_ignore: + continue + + if not {'name': resource['name'], 'url': resource['url']} in filtered_url: + continue + + if len(resource['url']) == 0: + continue + + filename = name_no_repetition(resource['name'], os.path.join(datapackage_dir, 'data'), 'resource') + resource['path'] = os.path.join(datapackage_dir, 'data', filename) + + cres = create_resource_change(resource, stderr, apikey, host_url, insecure) + if not cres: + continue + ''' + #----------------------------------------# + dres = {'path': os.path.join('data', filename), + 'description': cres.get('description', ''), + 'format': cres.get('format', ''), + 'name': cres.get('name', ''), + 'title': cres.get('name', '').title()} + #----------------------------------------# + populate_schema_from_datastore(cres, dres) + ''' + ckan_resources.append(resource) + + dataset = dict(record, resources=ckan_resources) + datapackage = dataset_to_datapackage_change(dataset) + + json_path = os.path.join(datapackage_dir, 'datapackage.json') + with open(json_path, 'wb') as out: + out.write(pretty_json(datapackage)) + + return datapackage_dir, datapackage, json_path + +def create_resource_change(resource, stderr, apikey, host_url, insecure): + # ---------- REPLACE URL --------- # + if urlparse(host_url).netloc != 'www.igp.gob.pe' and urlparse(resource['url']).netloc == 'www.igp.gob.pe': + resource['url'] = resource['url'].replace(urlparse(resource['url']).scheme + '://' + urlparse(resource['url']).netloc, + urlparse(host_url).scheme + '://' + urlparse(host_url).netloc) + #----------------------------------# + try: + r = requests.get(resource['url'], headers={'Authorization': apikey}, stream=True, verify=not insecure) + #---------------------------------------# + try: + r.raise_for_status() + except requests.exceptions.HTTPError as e: + return False + #---------------------------------------# + with open(resource['path'], 'wb') as f: + for chunk in r.iter_content(chunk_size=DL_CHUNK_SIZE): + if chunk: + f.write(chunk) + + except requests.ConnectionError: + stderr.write('URL {0} refused connection. The resource will not be downloaded\n'.format(resource['url']).encode('utf-8')) + except requests.exceptions.RequestException as e: + stderr.write('{0}\n'.format(str(e.args[0]) if len(e.args) > 0 else '').encode('utf-8')) + except Exception as e: + stderr.write('{0}'.format(str(e.args[0]) if len(e.args) > 0 else '').encode('utf-8')) + return resource + +def dataset_to_datapackage_change(dataset_dict): + dp = {'name': dataset_dict['name'], + 'id': dataset_dict['id'], + 'path': dataset_dict['path'], + 'last_update': datetime.strptime(dataset_dict['metadata_modified'], "%Y-%m-%dT%H:%M:%S.%f").strftime("%d-%b-%Y %I.%M %p")} + + resources = dataset_dict.get('resources') + if resources: + dp['resources'] = [convert_to_datapackage_resource_change(r) + for r in resources] + return dp + +def convert_to_datapackage_resource_change(resource_dict): + resource = {} + + if resource_dict.get('id'): + resource['id'] = resource_dict['id'] + + if resource_dict.get('name'): + resource['name'] = resource_dict['name'] + + if resource_dict.get('path'): + resource['path'] = resource_dict['path'] + + schema = resource_dict.get('schema') + if isinstance(schema, six.string_types): + try: + resource['schema'] = json.loads(schema) + except ValueError: + resource['schema'] = schema + elif isinstance(schema, dict): + resource['schema'] = schema + + return resource + +def name_no_repetition(name, dir, option=''): + count = 0 + while True: + count = count + 1 + if not os.path.exists(os.path.join(dir, name)): + if option == 'resource': + return name + else: + return os.path.join(dir, name) + + elif not os.path.exists(os.path.join(dir, '('+str(count)+')'+name)): + if option == 'resource': + return '('+str(count)+')'+name + else: + return os.path.join(dir, '('+str(count)+')'+name) + else: + pass \ No newline at end of file diff --git a/script/setup.py b/script/setup.py index 64ed0a5..717274e 100755 --- a/script/setup.py +++ b/script/setup.py @@ -7,6 +7,6 @@ setup( description = "Data Repository - JRO", author = "Edson Ynilupu Mattos", author_email = "eynilupu@igp.gob.pe", - url = "", + url = "http://intranet.igp.gob.pe:8082/DATABASES/ckanext-jro/api-cliente", packages = ["CKAN_JRO"] ) \ No newline at end of file