This diff has been collapsed as it changes many lines, (556 lines changed)
Show them
Hide them
|
|
@@
-1,25
+1,12
|
|
1
|
from ckanapi import RemoteCKAN
|
|
1
|
from ckanapi import RemoteCKAN
|
|
2
|
from datetime import datetime
|
|
2
|
from datetime import datetime
|
|
3
|
from tqdm import tqdm
|
|
|
|
|
4
|
from CKAN_JRO import logic_download
|
|
3
|
from CKAN_JRO import logic_download
|
|
5
|
from CKAN_JRO import resource
|
|
4
|
from CKAN_JRO import resource
|
|
6
|
#from ckanapi.errors import NotAuthorized, NotFound, ValidationError, SearchQueryError, SearchError, CKANAPIError, ServerIncompatibleError
|
|
5
|
#from ckanapi.errors import NotAuthorized, NotFound, ValidationError, SearchQueryError, SearchError, CKANAPIError, ServerIncompatibleError
|
|
7
|
import sys
|
|
6
|
import sys
|
|
8
|
import platform
|
|
7
|
import platform
|
|
9
|
import os
|
|
8
|
import os
|
|
10
|
import tempfile
|
|
|
|
|
11
|
import shutil
|
|
|
|
|
12
|
import zipfile
|
|
|
|
|
13
|
import concurrent.futures
|
|
|
|
|
14
|
import requests
|
|
9
|
import requests
|
|
15
|
import json
|
|
|
|
|
16
|
#import pathlib
|
|
|
|
|
17
|
import uuid
|
|
|
|
|
18
|
|
|
|
|
|
19
|
if sys.version_info.major == 3:
|
|
|
|
|
20
|
from urllib.parse import urlparse
|
|
|
|
|
21
|
else:
|
|
|
|
|
22
|
import urlparse
|
|
|
|
|
23
|
|
|
10
|
|
|
24
|
class JROAPI():
|
|
11
|
class JROAPI():
|
|
25
|
"""
|
|
12
|
"""
|
|
@@
-28,22
+15,12
class JROAPI():
|
|
28
|
|
|
15
|
|
|
29
|
REQUISITIOS PREVIOS:
|
|
16
|
REQUISITIOS PREVIOS:
|
|
30
|
- Paso 1: Tener "pip [Python 2]" o "pip3 [Python 3]" instalado:
|
|
17
|
- Paso 1: Tener "pip [Python 2]" o "pip3 [Python 3]" instalado:
|
|
31
|
- Paso 2: Instalar lo siguiente como admininstrador:
|
|
18
|
- Paso 2: Instalar los siguientes paquetes:
|
|
32
|
En Python 2
|
|
19
|
ckanapi==4.7
|
|
33
|
- pip install ckanapi==4.5
|
|
20
|
requests
|
|
34
|
- pip install requests
|
|
|
|
|
35
|
- pip install futures
|
|
|
|
|
36
|
- pip install tqdm
|
|
|
|
|
37
|
En Python > 3
|
|
|
|
|
38
|
- pip3 install ckanapi==4.5
|
|
|
|
|
39
|
- pip3 install requests
|
|
|
|
|
40
|
- pip3 install tqdm
|
|
|
|
|
41
|
|
|
21
|
|
|
42
|
FUNCIONES DISPONIBLES:
|
|
22
|
FUNCIONES DISPONIBLES:
|
|
43
|
- action
|
|
23
|
- action
|
|
44
|
- upload_file
|
|
|
|
|
45
|
- upload_multiple_files
|
|
|
|
|
46
|
- upload_multiple_files_advance
|
|
|
|
|
47
|
- show
|
|
24
|
- show
|
|
48
|
- search
|
|
25
|
- search
|
|
49
|
- create
|
|
26
|
- create
|
|
@@
-126,347
+103,7
class JROAPI():
|
|
126
|
except:
|
|
103
|
except:
|
|
127
|
_, exc_value, _ = sys.exc_info()
|
|
104
|
_, exc_value, _ = sys.exc_info()
|
|
128
|
return exc_value
|
|
105
|
return exc_value
|
|
129
|
|
|
106
|
|
|
130
|
def upload_file(self, dataset_id, file_date, file_type, file_path=False, url_or_path=False, ignore_repetition=False, **kwargs):
|
|
|
|
|
131
|
# Agregar si es interruptido por teclado
|
|
|
|
|
132
|
'''
|
|
|
|
|
133
|
FINALIDAD:
|
|
|
|
|
134
|
Funcion para crear un unico recurso (puede incluir un archivo asociado) al repositorio del ROJ.
|
|
|
|
|
135
|
|
|
|
|
|
136
|
PARAMETROS DISPONIBLES:
|
|
|
|
|
137
|
CONSULTAR: "GUIA DE SCRIPT.pdf"
|
|
|
|
|
138
|
|
|
|
|
|
139
|
ESTRUCTURA:
|
|
|
|
|
140
|
<access_name>.upload_file(dataset_id = <class 'str'>, file_date = <class 'str'>, file_type = <class 'str'>, file_path = <class 'str'>, url_or_path = <class 'str'>, param_1 = <class 'param_1'>, ...)
|
|
|
|
|
141
|
'''
|
|
|
|
|
142
|
#self.list = ['package_id', 'upload', 'voc_file_type', 'name'] #file_date
|
|
|
|
|
143
|
self.list = ['package_id', 'upload', 'voc_file_type'] #file_date
|
|
|
|
|
144
|
for key1, value1 in kwargs.items():
|
|
|
|
|
145
|
if not key1 in self.list:
|
|
|
|
|
146
|
self.dict[key1] = value1
|
|
|
|
|
147
|
|
|
|
|
|
148
|
#---------------------------#
|
|
|
|
|
149
|
if not 'others' in kwargs:
|
|
|
|
|
150
|
self.dict['others'] = ''
|
|
|
|
|
151
|
else:
|
|
|
|
|
152
|
if isinstance(kwargs['others'], list):
|
|
|
|
|
153
|
self.dict['others'] = json.dumps(kwargs['others'])
|
|
|
|
|
154
|
#---------------------------#
|
|
|
|
|
155
|
|
|
|
|
|
156
|
if isinstance(file_path, str) and isinstance(url_or_path, str):
|
|
|
|
|
157
|
return 'ERROR:: Choose one: "file_path" or "url_or_path" parameters'
|
|
|
|
|
158
|
|
|
|
|
|
159
|
if isinstance(file_path, str):
|
|
|
|
|
160
|
if not os.path.isfile(file_path):
|
|
|
|
|
161
|
return 'File "%s" not exist' % (file_path)
|
|
|
|
|
162
|
|
|
|
|
|
163
|
self.dict['upload'] = open(file_path, 'rb')
|
|
|
|
|
164
|
self.dict['name'] = os.path.basename(file_path)
|
|
|
|
|
165
|
elif isinstance(url_or_path, str):
|
|
|
|
|
166
|
self.dict['url'] = url_or_path
|
|
|
|
|
167
|
if not 'name' in self.dict:
|
|
|
|
|
168
|
self.dict['name'] = os.path.basename(url_or_path)
|
|
|
|
|
169
|
else:
|
|
|
|
|
170
|
return 'ERROR: Verify "file_path" or "url_or_path" parameters: <class "str"> or choose one'
|
|
|
|
|
171
|
|
|
|
|
|
172
|
#if not 'format' in self.dict:
|
|
|
|
|
173
|
# self.str = ''.join(pathlib.Path(file_path).suffixes)
|
|
|
|
|
174
|
# if len(self.str) > 0:
|
|
|
|
|
175
|
# self.dict['format'] = self.str.upper()[1:]
|
|
|
|
|
176
|
|
|
|
|
|
177
|
#-------------------------PACKAGE SHOW-----------------------#
|
|
|
|
|
178
|
try:
|
|
|
|
|
179
|
dataset_show = getattr(self.ckan.action, 'package_show')(id=dataset_id)['resources']
|
|
|
|
|
180
|
except:
|
|
|
|
|
181
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
182
|
print('ERROR obtaining metadata dataset:: Use the "print" for more information')
|
|
|
|
|
183
|
return exc_value
|
|
|
|
|
184
|
|
|
|
|
|
185
|
resources_name = []
|
|
|
|
|
186
|
for u in dataset_show:
|
|
|
|
|
187
|
resources_name.append(u['name'].lower())
|
|
|
|
|
188
|
|
|
|
|
|
189
|
if self.dict['name'].lower() in resources_name:
|
|
|
|
|
190
|
if not ignore_repetition:
|
|
|
|
|
191
|
return 'ERROR:: "%s" resource already exist in this dataset' % (self.dict['name'])
|
|
|
|
|
192
|
print('WARRING:: "'+ str(self.dict['name']) +'" resource already exist in this dataset')
|
|
|
|
|
193
|
#------------------------------------------------------------#
|
|
|
|
|
194
|
try:
|
|
|
|
|
195
|
return getattr(self.ckan.action, 'resource_create')(package_id=dataset_id, file_date=file_date, voc_file_type=file_type, **self.dict)
|
|
|
|
|
196
|
except:
|
|
|
|
|
197
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
198
|
return exc_value
|
|
|
|
|
199
|
|
|
|
|
|
200
|
def upload_multiple_files_advance(self, dataset_id, path_files, file_date, file_type, max_size=100, max_count=500, ignore_repetition=False, **kwargs):
|
|
|
|
|
201
|
# Agregar si es interruptido por teclado
|
|
|
|
|
202
|
'''
|
|
|
|
|
203
|
FINALIDAD:
|
|
|
|
|
204
|
Funcion para subir multiples archivos al repositorio del ROJ.
|
|
|
|
|
205
|
|
|
|
|
|
206
|
PARAMETROS DISPONIBLES:
|
|
|
|
|
207
|
CONSULTAR: "GUIA DE SCRIPT.pdf"
|
|
|
|
|
208
|
|
|
|
|
|
209
|
ESTRUCTURA:
|
|
|
|
|
210
|
<access_name>.upload_multiple_files_advance(dataset_id = <class 'str'>, path_files = <class 'list of strings'>, file_date = <class 'str'>, file_type = <class 'str'>, param_1 = <class 'param_1'>, ...)
|
|
|
|
|
211
|
'''
|
|
|
|
|
212
|
#-------------------------PACKAGE SHOW-----------------------#
|
|
|
|
|
213
|
try:
|
|
|
|
|
214
|
dataset_show = getattr(self.ckan.action, 'package_show')(id=dataset_id)['resources']
|
|
|
|
|
215
|
except:
|
|
|
|
|
216
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
217
|
print('ERROR obtaining metadata dataset:: Use the "print" for more information')
|
|
|
|
|
218
|
return exc_value
|
|
|
|
|
219
|
#------------------------------------------------------------#
|
|
|
|
|
220
|
resources_name = []
|
|
|
|
|
221
|
for u in dataset_show:
|
|
|
|
|
222
|
resources_name.append(u['name'].lower())
|
|
|
|
|
223
|
#------------------------------------------------------------#
|
|
|
|
|
224
|
self.list = ['package_id', 'upload', 'voc_file_type', 'name']
|
|
|
|
|
225
|
for key1, value1 in kwargs.items():
|
|
|
|
|
226
|
if not key1 in self.list:
|
|
|
|
|
227
|
self.dict[key1] = value1
|
|
|
|
|
228
|
#------------------------------------------------------------#
|
|
|
|
|
229
|
if not 'others' in kwargs:
|
|
|
|
|
230
|
self.dict['others'] = ''
|
|
|
|
|
231
|
else:
|
|
|
|
|
232
|
if isinstance(kwargs['others'], list):
|
|
|
|
|
233
|
self.dict['others'] = json.dumps(kwargs['others'])
|
|
|
|
|
234
|
#------------------------------------------------------------#
|
|
|
|
|
235
|
total_list = []
|
|
|
|
|
236
|
#---------------CASO : "path" or "path_list"-----------------#
|
|
|
|
|
237
|
if type(path_files) is list:
|
|
|
|
|
238
|
if len(path_files) != 0:
|
|
|
|
|
239
|
path_files.sort()
|
|
|
|
|
240
|
for u in path_files:
|
|
|
|
|
241
|
if os.path.isfile(u):
|
|
|
|
|
242
|
if os.path.basename(u).lower() in resources_name:
|
|
|
|
|
243
|
if not ignore_repetition:
|
|
|
|
|
244
|
return 'ERROR:: "%s" file already exist in this dataset' % (os.path.basename(u))
|
|
|
|
|
245
|
print('WARRING:: "'+ str(os.path.basename(u)) +'" file was ignored because already exist in this dataset')
|
|
|
|
|
246
|
else:
|
|
|
|
|
247
|
total_list.append({'name':os.path.basename(u), 'size': os.stat(u).st_size, 'upload':open(u, 'rb')})
|
|
|
|
|
248
|
else:
|
|
|
|
|
249
|
return 'File "%s" does not exist' % (u)
|
|
|
|
|
250
|
else:
|
|
|
|
|
251
|
return 'ERROR:: "path_list is empty"'
|
|
|
|
|
252
|
|
|
|
|
|
253
|
elif type(path_files) is str:
|
|
|
|
|
254
|
if os.path.isdir(path_files):
|
|
|
|
|
255
|
path_order = [f for f in os.listdir(path_files) if os.path.isfile(os.path.join(path_files, f))]
|
|
|
|
|
256
|
path_order.sort()
|
|
|
|
|
257
|
if path_order:
|
|
|
|
|
258
|
for name in path_order:
|
|
|
|
|
259
|
if name.lower() in resources_name:
|
|
|
|
|
260
|
if not ignore_repetition:
|
|
|
|
|
261
|
return 'ERROR:: "%s" file already exist in this dataset' % (name)
|
|
|
|
|
262
|
print('WARRING:: "'+ name +'" file was ignored because already exist in this dataset')
|
|
|
|
|
263
|
else:
|
|
|
|
|
264
|
total_list.append({'name':name, 'size': os.stat(os.path.join(path_files, name)).st_size, 'upload':open(os.path.join(path_files, name), 'rb')})
|
|
|
|
|
265
|
else:
|
|
|
|
|
266
|
return "ERROR:: There aren't files in this directory"
|
|
|
|
|
267
|
else:
|
|
|
|
|
268
|
return 'ERROR:: Directory "%s" does not exist' % (path_files)
|
|
|
|
|
269
|
else:
|
|
|
|
|
270
|
return 'ERROR:: "path_files" must be a str or list'
|
|
|
|
|
271
|
#------------------------------------------------------------#
|
|
|
|
|
272
|
try:
|
|
|
|
|
273
|
uuid.UUID(str(dataset_id), version=4)
|
|
|
|
|
274
|
package_id_or_name = '"id": "' + str(dataset_id) + '"'
|
|
|
|
|
275
|
except ValueError:
|
|
|
|
|
276
|
package_id_or_name = '"name": "' + str(dataset_id) + '"'
|
|
|
|
|
277
|
#------------------------------------------------------------#
|
|
|
|
|
278
|
blocks = [[]]
|
|
|
|
|
279
|
size_file = 0
|
|
|
|
|
280
|
count_file = 0
|
|
|
|
|
281
|
inter_num = 0
|
|
|
|
|
282
|
for value in total_list:
|
|
|
|
|
283
|
if value['size'] > 1024 * 1024 * float(max_size):
|
|
|
|
|
284
|
return 'ERROR:: The size of the "%s" file is %sMB aprox, please change "max_size" value' % (value['name'], str(round(value['size']/(1024 * 1024), 2)))
|
|
|
|
|
285
|
if not 1 <= int(max_count) <= 999:
|
|
|
|
|
286
|
return 'ERROR:: The count of the number of files must be between 1 and 999, please change "max_count" value'
|
|
|
|
|
287
|
|
|
|
|
|
288
|
size_file = size_file + value['size']
|
|
|
|
|
289
|
count_file = count_file + 1
|
|
|
|
|
290
|
if size_file <= 1024 * 1024 * float(max_size) and count_file <= int(max_count):
|
|
|
|
|
291
|
del value['size']
|
|
|
|
|
292
|
blocks[inter_num].append(value)
|
|
|
|
|
293
|
else:
|
|
|
|
|
294
|
inter_num = inter_num + 1
|
|
|
|
|
295
|
size_file = value['size']
|
|
|
|
|
296
|
count_file = 1
|
|
|
|
|
297
|
blocks.append([])
|
|
|
|
|
298
|
del value['size']
|
|
|
|
|
299
|
blocks[inter_num].append(value)
|
|
|
|
|
300
|
#------------------------------------------------------------#
|
|
|
|
|
301
|
if len(blocks[0]) > 0:
|
|
|
|
|
302
|
print('BLOCK(S) IN TOTAL:: {}'.format(len(blocks)))
|
|
|
|
|
303
|
for count1, block in enumerate(blocks):
|
|
|
|
|
304
|
print('---- BLOCK N°{} ----'.format(count1 + 1))
|
|
|
|
|
305
|
resource_extend = []
|
|
|
|
|
306
|
files_dict = {}
|
|
|
|
|
307
|
for count2, value2 in enumerate(block):
|
|
|
|
|
308
|
value2['file_date'] = file_date
|
|
|
|
|
309
|
value2['voc_file_type'] = file_type
|
|
|
|
|
310
|
value2.update(self.dict)
|
|
|
|
|
311
|
|
|
|
|
|
312
|
#if not 'format' in value2:
|
|
|
|
|
313
|
# format = ''.join(pathlib.Path(value2['name']).suffixes)
|
|
|
|
|
314
|
# if len(format) > 0:
|
|
|
|
|
315
|
# value2['format'] = format.upper()[1:]
|
|
|
|
|
316
|
|
|
|
|
|
317
|
files_dict['update__resources__-'+ str(len(block)-count2) +'__upload'] = (value2['name'], value2['upload'])
|
|
|
|
|
318
|
del value2['upload']
|
|
|
|
|
319
|
resource_extend.append(value2)
|
|
|
|
|
320
|
|
|
|
|
|
321
|
print('BLOCK N°{} :: "{}" file(s) found >> uploading'.format(count1 + 1, len(block)))
|
|
|
|
|
322
|
try:
|
|
|
|
|
323
|
result = self.ckan.call_action(
|
|
|
|
|
324
|
'package_revise',
|
|
|
|
|
325
|
{'match': '{'+ str(package_id_or_name) +'}', 'update__resources__extend': json.dumps(resource_extend)},
|
|
|
|
|
326
|
files=files_dict
|
|
|
|
|
327
|
)
|
|
|
|
|
328
|
print('BLOCK N°{} :: Uploaded file(s) successfully'.format(count1 + 1))
|
|
|
|
|
329
|
if len(blocks) == count1 + 1:
|
|
|
|
|
330
|
return result
|
|
|
|
|
331
|
except:
|
|
|
|
|
332
|
print('ERROR :: Use the "print" for more information')
|
|
|
|
|
333
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
334
|
return exc_value
|
|
|
|
|
335
|
else:
|
|
|
|
|
336
|
return "ERROR:: No file(s) found to upload"
|
|
|
|
|
337
|
|
|
|
|
|
338
|
def upload_multiple_files(self, dataset_id, path_files, date_files, type_files, ignore_repetition=False, **kwargs):
|
|
|
|
|
339
|
# Agregar si es interruptido por teclado
|
|
|
|
|
340
|
'''
|
|
|
|
|
341
|
FINALIDAD:
|
|
|
|
|
342
|
Funcion para subir multiples archivos al repositorio del ROJ.
|
|
|
|
|
343
|
|
|
|
|
|
344
|
PARAMETROS DISPONIBLES:
|
|
|
|
|
345
|
CONSULTAR: "GUIA DE SCRIPT.pdf"
|
|
|
|
|
346
|
|
|
|
|
|
347
|
ESTRUCTURA:
|
|
|
|
|
348
|
<access_name>.upload_multiple_files(dataset_id = <class 'str'>, path_files = <class 'str'> or <class 'list of strings'>, date_files = <class 'str'> or <class 'list of strings'>, type_files = <class 'str'> or <class 'list of strings'>, param_1 = <class 'param_1'>, ...)
|
|
|
|
|
349
|
'''
|
|
|
|
|
350
|
#-------------------------PACKAGE SHOW-----------------------#
|
|
|
|
|
351
|
try:
|
|
|
|
|
352
|
dataset_show = getattr(self.ckan.action, 'package_show')(id=dataset_id)['resources']
|
|
|
|
|
353
|
except:
|
|
|
|
|
354
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
355
|
print('ERROR obtaining metadata dataset:: Use the "print" for more information')
|
|
|
|
|
356
|
return exc_value
|
|
|
|
|
357
|
#------------------------------------------------------------#
|
|
|
|
|
358
|
resources_name = []
|
|
|
|
|
359
|
for u in dataset_show:
|
|
|
|
|
360
|
resources_name.append(u['name'].lower())
|
|
|
|
|
361
|
#------------------------------------------------------------#
|
|
|
|
|
362
|
|
|
|
|
|
363
|
params_dict = {'upload':[], 'name':[]}
|
|
|
|
|
364
|
#if not 'format' in kwargs:
|
|
|
|
|
365
|
# params_dict.update({'format':[]})
|
|
|
|
|
366
|
#---------------CASO : "path" or "path_list"-----------------#
|
|
|
|
|
367
|
if type(path_files) is list:
|
|
|
|
|
368
|
if len(path_files) != 0:
|
|
|
|
|
369
|
path_files.sort()
|
|
|
|
|
370
|
for u in path_files:
|
|
|
|
|
371
|
if os.path.isfile(u):
|
|
|
|
|
372
|
if os.path.basename(u).lower() in resources_name:
|
|
|
|
|
373
|
if not ignore_repetition:
|
|
|
|
|
374
|
return 'ERROR:: "%s" file already exist in this dataset' % (os.path.basename(u))
|
|
|
|
|
375
|
print('WARRING:: "'+ str(os.path.basename(u)) +'" file was ignored because already exist in this dataset')
|
|
|
|
|
376
|
else:
|
|
|
|
|
377
|
params_dict['upload'].append(open(u, 'rb'))
|
|
|
|
|
378
|
params_dict['name'].append(os.path.basename(u))
|
|
|
|
|
379
|
#if not 'format' in kwargs:
|
|
|
|
|
380
|
# format = ''.join(pathlib.Path(u).suffixes)
|
|
|
|
|
381
|
# if len(format) > 0:
|
|
|
|
|
382
|
# params_dict['format'].append(format.upper()[1:])
|
|
|
|
|
383
|
# else:
|
|
|
|
|
384
|
# params_dict['format'].append('')
|
|
|
|
|
385
|
else:
|
|
|
|
|
386
|
return 'File "%s" does not exist' % (u)
|
|
|
|
|
387
|
else:
|
|
|
|
|
388
|
return 'ERROR:: "path_list is empty"'
|
|
|
|
|
389
|
elif type(path_files) is str:
|
|
|
|
|
390
|
if os.path.isdir(path_files):
|
|
|
|
|
391
|
path_order = [f for f in os.listdir(path_files) if os.path.isfile(os.path.join(path_files, f))]
|
|
|
|
|
392
|
path_order.sort()
|
|
|
|
|
393
|
if path_order:
|
|
|
|
|
394
|
for name in path_order:
|
|
|
|
|
395
|
if name.lower() in resources_name:
|
|
|
|
|
396
|
if not ignore_repetition:
|
|
|
|
|
397
|
return 'ERROR:: "%s" file already exist in this dataset' % (name)
|
|
|
|
|
398
|
print('WARRING:: "'+ str(name) +'" file was ignored because already exist in this dataset')
|
|
|
|
|
399
|
else:
|
|
|
|
|
400
|
params_dict['upload'].append(open(os.path.join(path_files, name), 'rb'))
|
|
|
|
|
401
|
params_dict['name'].append(name)
|
|
|
|
|
402
|
#if not 'format' in kwargs:
|
|
|
|
|
403
|
# format = ''.join(pathlib.Path(name).suffixes)
|
|
|
|
|
404
|
# if len(format) > 0:
|
|
|
|
|
405
|
# params_dict['format'].append(format.upper()[1:])
|
|
|
|
|
406
|
# else:
|
|
|
|
|
407
|
# params_dict['format'].append('')
|
|
|
|
|
408
|
else:
|
|
|
|
|
409
|
return "ERROR:: There aren't files in this directory"
|
|
|
|
|
410
|
else:
|
|
|
|
|
411
|
return 'ERROR:: Directory "%s" does not exist' % (path_files)
|
|
|
|
|
412
|
else:
|
|
|
|
|
413
|
return 'ERROR:: "path_files" must be a str or list'
|
|
|
|
|
414
|
#------------------------------------------------------------#
|
|
|
|
|
415
|
params_no_dict = {'package_id': dataset_id}
|
|
|
|
|
416
|
if type(date_files) is list:
|
|
|
|
|
417
|
params_dict['file_date'] = date_files
|
|
|
|
|
418
|
else:
|
|
|
|
|
419
|
params_no_dict['file_date'] = date_files
|
|
|
|
|
420
|
|
|
|
|
|
421
|
if type(type_files) is list:
|
|
|
|
|
422
|
params_dict['voc_file_type'] = type_files
|
|
|
|
|
423
|
else:
|
|
|
|
|
424
|
params_no_dict['voc_file_type'] = type_files
|
|
|
|
|
425
|
|
|
|
|
|
426
|
for key1, value1 in kwargs.items():
|
|
|
|
|
427
|
if not key1 in params_dict and not key1 in params_no_dict and key1 != 'others':
|
|
|
|
|
428
|
if type(value1) is list:
|
|
|
|
|
429
|
params_dict[key1] = value1
|
|
|
|
|
430
|
else:
|
|
|
|
|
431
|
params_no_dict[key1] = value1
|
|
|
|
|
432
|
#------------------------------------------#
|
|
|
|
|
433
|
if not 'others' in kwargs:
|
|
|
|
|
434
|
params_no_dict['others'] = ''
|
|
|
|
|
435
|
else:
|
|
|
|
|
436
|
if isinstance(kwargs['others'], tuple):
|
|
|
|
|
437
|
params_dict['others'] = [json.dumps(w) for w in kwargs['others']]
|
|
|
|
|
438
|
elif isinstance(kwargs['others'], list):
|
|
|
|
|
439
|
params_no_dict['others'] = json.dumps(kwargs['others'])
|
|
|
|
|
440
|
elif isinstance(kwargs['others'], str):
|
|
|
|
|
441
|
params_no_dict['others'] = kwargs['others']
|
|
|
|
|
442
|
else:
|
|
|
|
|
443
|
return 'ERROR:: "others" must be a tuple, list or str'
|
|
|
|
|
444
|
#------------------------------------------#
|
|
|
|
|
445
|
len_params_dict = []
|
|
|
|
|
446
|
for value2 in params_dict.values():
|
|
|
|
|
447
|
len_params_dict.append(len(value2))
|
|
|
|
|
448
|
|
|
|
|
|
449
|
if len(list(set(len_params_dict))) > 1:
|
|
|
|
|
450
|
return 'ERROR:: All lists must be the same length: %s' % (len(params_dict['name']))
|
|
|
|
|
451
|
#------------------------------------------------------------#
|
|
|
|
|
452
|
print('"{}" file(s) found >> uploading'.format(len(params_dict['name'])))
|
|
|
|
|
453
|
for v in range(len(params_dict['name'])):
|
|
|
|
|
454
|
try:
|
|
|
|
|
455
|
send = {}
|
|
|
|
|
456
|
for key_dict, value_dict in params_dict.items():
|
|
|
|
|
457
|
send[key_dict] = value_dict[v]
|
|
|
|
|
458
|
for key_no_dict, value_no_dict in params_no_dict.items():
|
|
|
|
|
459
|
send[key_no_dict] = value_no_dict
|
|
|
|
|
460
|
|
|
|
|
|
461
|
self.list.append(getattr(self.ckan.action, 'resource_create')(**send))
|
|
|
|
|
462
|
print('File #{} :: "{}" was uploaded successfully'.format(v+1, params_dict['name'][v]))
|
|
|
|
|
463
|
except:
|
|
|
|
|
464
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
465
|
self.list.append(exc_value)
|
|
|
|
|
466
|
print('File #{} :: Error uploading "{}" file'.format(v+1, params_dict['name'][v]))
|
|
|
|
|
467
|
return self.list
|
|
|
|
|
468
|
#------------------------------------------------------------#
|
|
|
|
|
469
|
|
|
|
|
|
470
|
def show(self, type_option, id, **kwargs):
|
|
107
|
def show(self, type_option, id, **kwargs):
|
|
471
|
'''
|
|
108
|
'''
|
|
472
|
FINALIDAD:
|
|
109
|
FINALIDAD:
|
|
@@
-775,189
+412,8
class JROAPI():
|
|
775
|
return exc_value
|
|
412
|
return exc_value
|
|
776
|
else:
|
|
413
|
else:
|
|
777
|
return 'ERROR:: "type_option" must be <str>'
|
|
414
|
return 'ERROR:: "type_option" must be <str>'
|
|
778
|
|
|
|
|
|
779
|
def f_status_note(self, total, result, path):
|
|
|
|
|
780
|
file_txt = open(path+'status_note.txt', 'w')
|
|
|
|
|
781
|
file_txt = open(path+'status_note.txt', 'a')
|
|
|
|
|
782
|
|
|
|
|
|
783
|
file_txt.write('DOWNLOADED FILE(S): "%s"' % (len(result['name'])))
|
|
|
|
|
784
|
file_txt.write(''+ os.linesep)
|
|
|
|
|
785
|
for u in result['name']:
|
|
|
|
|
786
|
file_txt.write(' - '+ u + os.linesep)
|
|
|
|
|
787
|
file_txt.write(''+ os.linesep)
|
|
|
|
|
788
|
|
|
|
|
|
789
|
file_txt.write('FAILED FILE(S): "%s"' % (len(total['name'])-len(result['name'])))
|
|
|
|
|
790
|
file_txt.write(''+ os.linesep)
|
|
|
|
|
791
|
if len(total['name'])-len(result['name']) != 0:
|
|
|
|
|
792
|
for u in total['name']:
|
|
|
|
|
793
|
if not u in result['name']:
|
|
|
|
|
794
|
file_txt.write(' - '+ u + os.linesep)
|
|
|
|
|
795
|
else:
|
|
|
|
|
796
|
file_txt.write(' "None"'+ os.linesep)
|
|
|
|
|
797
|
|
|
|
|
|
798
|
def f_name(self, name_dataset, ext, tempdir):
|
|
|
|
|
799
|
while self.check:
|
|
|
|
|
800
|
self.str = ''
|
|
|
|
|
801
|
if self.cont == 0:
|
|
|
|
|
802
|
if os.path.exists(tempdir + name_dataset + ext):
|
|
|
|
|
803
|
self.str = name_dataset+'('+str(self.cont+1)+')'+ext
|
|
|
|
|
804
|
else:
|
|
|
|
|
805
|
self.check = self.check * 0
|
|
|
|
|
806
|
self.str = name_dataset + ext
|
|
|
|
|
807
|
else:
|
|
|
|
|
808
|
if not os.path.exists(tempdir + name_dataset+'('+str(self.cont)+')'+ext):
|
|
|
|
|
809
|
self.check = self.check * 0
|
|
|
|
|
810
|
self.str = name_dataset+'('+str(self.cont)+')'+ ext
|
|
|
|
|
811
|
self.cont = self.cont+1
|
|
|
|
|
812
|
return self.str
|
|
|
|
|
813
|
|
|
|
|
|
814
|
def f_zipdir(self, path, ziph, zip_name):
|
|
|
|
|
815
|
for root, _, files in os.walk(path):
|
|
|
|
|
816
|
print('.....')
|
|
|
|
|
817
|
print('Creating: "{}" >>'.format(zip_name))
|
|
|
|
|
818
|
for __file in tqdm(iterable=files, total=len(files)):
|
|
|
|
|
819
|
new_dir = os.path.relpath(os.path.join(root, __file), os.path.join(path, '..'))
|
|
|
|
|
820
|
ziph.write(os.path.join(root, __file), new_dir)
|
|
|
|
|
821
|
print('Created >>')
|
|
|
|
|
822
|
|
|
|
|
|
823
|
def download_by_step(self, response, tempdir_name):
|
|
|
|
|
824
|
try:
|
|
|
|
|
825
|
# ---------- REPLACE URL --------- #
|
|
|
|
|
826
|
if urlparse(self.url).netloc != 'www.igp.gob.pe' and urlparse(response['url']).netloc == 'www.igp.gob.pe':
|
|
|
|
|
827
|
response['url'] = response['url'].replace(urlparse(response['url']).scheme + '://' + urlparse(response['url']).netloc,
|
|
|
|
|
828
|
urlparse(self.url).scheme + '://' + urlparse(self.url).netloc)
|
|
|
|
|
829
|
#----------------------------------#
|
|
|
|
|
830
|
with requests.get(response['url'], stream=True, headers={'Authorization': self.Authorization}, verify=self.verify) as resp:
|
|
|
|
|
831
|
if resp.status_code == 200:
|
|
|
|
|
832
|
with open(tempdir_name+response['name'], 'wb') as file:
|
|
|
|
|
833
|
for chunk in resp.iter_content(chunk_size = self.chunk_size):
|
|
|
|
|
834
|
if chunk:
|
|
|
|
|
835
|
file.write(chunk)
|
|
|
|
|
836
|
except requests.exceptions.RequestException:
|
|
|
|
|
837
|
pass
|
|
|
|
|
838
|
|
|
415
|
|
|
839
|
def download_files(self, **kwargs):
|
|
416
|
def download_files(self, id_or_name, processes=1, path=os.path.expanduser("~"), **kwargs):
|
|
840
|
'''
|
|
|
|
|
841
|
FINALIDAD:
|
|
|
|
|
842
|
Funcion personalizada para la descarga de archivos existentes de un dataset.
|
|
|
|
|
843
|
|
|
|
|
|
844
|
PARAMETROS DISPONIBLES:
|
|
|
|
|
845
|
CONSULTAR: "GUIA DE SCRIPT.pdf"
|
|
|
|
|
846
|
|
|
|
|
|
847
|
ESTRUCTURA:
|
|
|
|
|
848
|
<access_name>.download_files(id = <class 'str'>, param_1 = <class 'param_1'>, ...)
|
|
|
|
|
849
|
'''
|
|
|
|
|
850
|
dict_local = {}
|
|
|
|
|
851
|
#----------------------------------------------#
|
|
|
|
|
852
|
if 'zip' in kwargs:
|
|
|
|
|
853
|
if type(kwargs['zip']) is not bool:
|
|
|
|
|
854
|
return 'ERROR:: "zip" must be: <class "bool">'
|
|
|
|
|
855
|
else:
|
|
|
|
|
856
|
dict_local['zip'] = kwargs['zip']
|
|
|
|
|
857
|
else:
|
|
|
|
|
858
|
dict_local['zip'] = False
|
|
|
|
|
859
|
#----------------------------------------------#
|
|
|
|
|
860
|
if 'status_note' in kwargs:
|
|
|
|
|
861
|
if type(kwargs['status_note']) is not bool:
|
|
|
|
|
862
|
return 'ERROR:: "status_note" must be: <class "bool">'
|
|
|
|
|
863
|
else:
|
|
|
|
|
864
|
dict_local['status_note'] = kwargs['status_note']
|
|
|
|
|
865
|
else:
|
|
|
|
|
866
|
dict_local['status_note'] = False
|
|
|
|
|
867
|
#----------------------------------------------#
|
|
|
|
|
868
|
if 'path' in kwargs:
|
|
|
|
|
869
|
if type(kwargs['path']) is str:
|
|
|
|
|
870
|
if os.path.isdir(kwargs['path']) == False:
|
|
|
|
|
871
|
return 'ERROR:: "path" does not exist'
|
|
|
|
|
872
|
else:
|
|
|
|
|
873
|
if kwargs['path'][-1:] != self.separator:
|
|
|
|
|
874
|
dict_local['path'] = kwargs['path']+self.separator
|
|
|
|
|
875
|
else:
|
|
|
|
|
876
|
dict_local['path'] = kwargs['path']
|
|
|
|
|
877
|
|
|
|
|
|
878
|
txt = dict_local['path']+datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")+'.txt'
|
|
|
|
|
879
|
if int(platform.python_version()[0]) == 3:
|
|
|
|
|
880
|
try:
|
|
|
|
|
881
|
file_txt = open(txt, 'w')
|
|
|
|
|
882
|
file_txt.close()
|
|
|
|
|
883
|
os.remove(txt)
|
|
|
|
|
884
|
except PermissionError:
|
|
|
|
|
885
|
return 'ERROR:: Access denied, you are not authorized to write files: "%s"' % (dict_local['path'])
|
|
|
|
|
886
|
else:
|
|
|
|
|
887
|
try:
|
|
|
|
|
888
|
file_txt = open(txt, 'w')
|
|
|
|
|
889
|
file_txt.close()
|
|
|
|
|
890
|
os.remove(txt)
|
|
|
|
|
891
|
except:
|
|
|
|
|
892
|
return 'ERROR:: Access denied, you are not authorized to write files: "%s"' % (dict_local['path'])
|
|
|
|
|
893
|
else:
|
|
|
|
|
894
|
return 'ERROR:: "path" must be: <class "str">'
|
|
|
|
|
895
|
else:
|
|
|
|
|
896
|
dict_local['path'] = ''
|
|
|
|
|
897
|
#----------------------------------------------#
|
|
|
|
|
898
|
for key, value in kwargs.items():
|
|
|
|
|
899
|
if not key in dict_local:
|
|
|
|
|
900
|
self.dict[key] = value
|
|
|
|
|
901
|
try:
|
|
|
|
|
902
|
response = getattr(self.ckan.action, 'url_resources')(**self.dict)
|
|
|
|
|
903
|
except:
|
|
|
|
|
904
|
_, exc_value, _ = sys.exc_info()
|
|
|
|
|
905
|
return exc_value
|
|
|
|
|
906
|
|
|
|
|
|
907
|
if len(response) != 0:
|
|
|
|
|
908
|
#--------------TEMP PATH---------------#
|
|
|
|
|
909
|
if dict_local['zip']:
|
|
|
|
|
910
|
tempdir = tempfile.mkdtemp(prefix=kwargs['id']+'-')+self.separator
|
|
|
|
|
911
|
os.mkdir(tempdir+kwargs['id'])
|
|
|
|
|
912
|
dir_name = tempdir + kwargs['id'] + self.separator
|
|
|
|
|
913
|
else:
|
|
|
|
|
914
|
dir = self.f_name(kwargs['id'], '', dict_local['path'])
|
|
|
|
|
915
|
os.mkdir(dict_local['path'] + dir)
|
|
|
|
|
916
|
dir_name = dict_local['path'] + dir + self.separator
|
|
|
|
|
917
|
#-----------DOWNLOAD FILES-------------#
|
|
|
|
|
918
|
print('.....')
|
|
|
|
|
919
|
print('Downloading "{}" file(s) >>'.format(len(response)))
|
|
|
|
|
920
|
name_total = {'name': []}
|
|
|
|
|
921
|
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
|
|
|
922
|
for u in tqdm(iterable=response, total=len(response)):
|
|
|
|
|
923
|
name_total['name'].append(u['name'])
|
|
|
|
|
924
|
executor.submit(self.download_by_step, u, dir_name)
|
|
|
|
|
925
|
name_check = {}
|
|
|
|
|
926
|
name_check['name'] = [f for f in os.listdir(dir_name) if os.path.isfile(os.path.join(dir_name, f))]
|
|
|
|
|
927
|
print('"{}" downloaded file(s) successfully >>'.format(len(name_check['name'])))
|
|
|
|
|
928
|
#--------------------------------------#
|
|
|
|
|
929
|
if len(name_check['name']) != 0:
|
|
|
|
|
930
|
#----------Status Note---------#
|
|
|
|
|
931
|
if dict_local['status_note']:
|
|
|
|
|
932
|
print('.....')
|
|
|
|
|
933
|
print('Creating: "status_note.txt" >>')
|
|
|
|
|
934
|
self.f_status_note(name_total, name_check, dir_name)
|
|
|
|
|
935
|
print('Created>>')
|
|
|
|
|
936
|
#----------ZIP CREATE----------#
|
|
|
|
|
937
|
if dict_local['zip']:
|
|
|
|
|
938
|
zip_name = self.f_name(kwargs['id'], '.zip', dict_local['path'])
|
|
|
|
|
939
|
ziph = zipfile.ZipFile(dict_local['path'] + zip_name, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
|
|
|
|
|
940
|
self.f_zipdir(dir_name, ziph, zip_name)
|
|
|
|
|
941
|
ziph.close()
|
|
|
|
|
942
|
#Delete Temporal Path
|
|
|
|
|
943
|
if os.path.exists(tempdir[:-1]):
|
|
|
|
|
944
|
shutil.rmtree(tempdir[:-1])
|
|
|
|
|
945
|
#------------------------------#
|
|
|
|
|
946
|
print('.....')
|
|
|
|
|
947
|
return 'DOWNLOAD FINISHED'
|
|
|
|
|
948
|
else:
|
|
|
|
|
949
|
#Delete Temporal Path
|
|
|
|
|
950
|
if dict_local['zip']:
|
|
|
|
|
951
|
if os.path.exists(tempdir[:-1]):
|
|
|
|
|
952
|
shutil.rmtree(tempdir[:-1])
|
|
|
|
|
953
|
else:
|
|
|
|
|
954
|
if os.path.exists(dir_name[:-1]):
|
|
|
|
|
955
|
shutil.rmtree(dir_name[:-1])
|
|
|
|
|
956
|
return 'NO FILES WERE DOWNLOADED'
|
|
|
|
|
957
|
else:
|
|
|
|
|
958
|
return 'FILES NOT FOUND'
|
|
|
|
|
959
|
|
|
|
|
|
960
|
def download_files_advance(self, id_or_name, processes=1, path=os.path.expanduser("~"), **kwargs):
|
|
|
|
|
961
|
'''
|
|
417
|
'''
|
|
962
|
FINALIDAD:
|
|
418
|
FINALIDAD:
|
|
963
|
Funcion personalizada avanzada para la descarga de archivos existentes de un(os) dataset(s).
|
|
419
|
Funcion personalizada avanzada para la descarga de archivos existentes de un(os) dataset(s).
|
|
@@
-966,7
+422,7
class JROAPI():
|
|
966
|
CONSULTAR: "GUIA DE SCRIPT.pdf"
|
|
422
|
CONSULTAR: "GUIA DE SCRIPT.pdf"
|
|
967
|
|
|
423
|
|
|
968
|
ESTRUCTURA:
|
|
424
|
ESTRUCTURA:
|
|
969
|
<access_name>.download_files_advance(id_or_name= <class 'str' or 'list'>, param_1 = <class 'param_1'>, ...)
|
|
425
|
<access_name>.download_files(id_or_name= <class 'str' or 'list'>, param_1 = <class 'param_1'>, ...)
|
|
970
|
'''
|
|
426
|
'''
|
|
971
|
#------------------ PATH ----------------------#
|
|
427
|
#------------------ PATH ----------------------#
|
|
972
|
if isinstance(path, str):
|
|
428
|
if isinstance(path, str):
|