Created
December 13, 2016 16:43
-
-
Save rudmanmrrod/55664d843eade583987c2533fe0d75d5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def cargar_datos(request): | |
"""! | |
Función para cargar los datos de carga masiva | |
@author Ing. Roldan Vargas (rvargas at cenditel.gob.ve)/ Rodrigo Boet (rboet at cenditel.gob.ve) | |
@copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a> | |
@date 11-08-2016 | |
@param request <b>{object}</b> Objeto que contiene la petición | |
@return Devuelve un HttpResponse con el JSON correspondiente al estado de la petición | |
""" | |
try: | |
if not request.is_ajax(): | |
return HttpResponse(json.dumps({'result': False, 'message': MSG_NOT_AJAX})) | |
## Nombre de la aplicación o módulo | |
app = request.GET.get('app', None) | |
## Nombre del modelo en el cual se va a buscar la información a incluir en el archivo | |
mod = request.GET.get('mod', None) | |
## Año para el que se esta solicitando el registro de datos | |
anho = request.GET.get('anho', None) | |
## Aplicación de la Relación | |
rel_app = request.GET.get('rel_app', None) | |
## Modelo de la relación | |
rel_mod = request.GET.get('rel_mod', None) | |
## Modelo padre | |
father_id = request.GET.get('father_id', None) | |
## Archivo que se va a cargar | |
archivo = request.FILES['file'] | |
if app and mod and anho and archivo and father_id: | |
anho_registro = AnhoRegistro.objects.filter(anho=anho).get() | |
instance = apps.get_model(app, mod) | |
modelo = instance() | |
datos = modelo.carga_masiva_init(anho=anho, rel_id=father_id) | |
rel_model = None | |
ruta = 'carga_masiva/files/'+str(archivo) | |
path = default_storage.save(ruta, ContentFile(archivo.read())) | |
load_file = pyexcel.get_sheet(file_name=path) | |
for i in range(1,len(load_file.row_range())): | |
modelo = instance() | |
if(rel_app and rel_mod): | |
instance_rel = apps.get_model(rel_app, rel_mod) | |
rel_model = instance_rel() | |
for j in range(len(datos['cabecera'])): | |
if(load_file[0,j]==datos['cabecera'][j]['title']): | |
# Se comprueba si viene algo en la columna id | |
if(datos['cabecera'][j]['title']=='Etiqueta' and load_file[i,j]==''): | |
pass | |
# Se comprueba si el modelo tiene relación | |
elif(datos['cabecera'][j]['related']): | |
# Si tiene una relación con otro modelo | |
if(datos['cabecera'][j]['depend'] and not 'need_object' in datos['cabecera'][j]): | |
model_dep = apps.get_model(datos['cabecera'][j]['related_app'], datos['cabecera'][j]['related_model']) | |
model_dep = model_dep.objects.get(pk=load_file[i,j]) | |
setattr(rel_model, datos['cabecera'][j]['field'], model_dep) | |
#Si se requieren modelos externos | |
elif(datos['cabecera'][j]['depend'] and 'need_object' in datos['cabecera'][j]): | |
filtro = {} | |
filtro[datos['cabecera'][j]['filtro']] = load_file[i,j] | |
model_dep = apps.get_model(datos['cabecera'][j]['related_app'], datos['cabecera'][j]['related_model']) | |
model_dep = model_dep.objects.filter(**filtro).get() | |
if(datos['relation']['padre']['mod'] == datos['cabecera'][j]['related_model']): | |
datos['relation']['padre']['instance'] = model_dep | |
else: | |
setattr(rel_model, datos['cabecera'][j]['field'], model_dep) | |
#Si existe una relación doble | |
if('ambigous' in datos['cabecera'][j]): | |
filtro = {} | |
filtro[datos['cabecera'][j]['amb_filter']] = getattr(model_dep,datos['cabecera'][j]['amb_field']) | |
model_amb = apps.get_model(datos['cabecera'][j]['amb_app'], datos['cabecera'][j]['amb_model']) | |
model_amb = model_amb.objects.filter(**filtro).get() | |
setattr(modelo, datos['cabecera'][j]['field'], model_amb) | |
# Si la relación es solo con el padre | |
else: | |
setattr(rel_model, datos['cabecera'][j]['field'], load_file[i,j]) | |
else: | |
# Si tiene una relación con otro modelo | |
if(datos['cabecera'][j]['depend'] and not 'need_object' in datos['cabecera'][j]): | |
model_dep = apps.get_model(datos['cabecera'][j]['related_app'], datos['cabecera'][j]['related_model']) | |
model_dep = model_dep.objects.get(pk=load_file[i,j]) | |
setattr(modelo, datos['cabecera'][j]['field'], model_dep) | |
#Si se requieren modelos externos | |
elif(datos['cabecera'][j]['depend'] and 'need_object' in datos['cabecera'][j]): | |
filtro = {} | |
filtro[datos['cabecera'][j]['filtro']] = load_file[i,j] | |
model_dep = apps.get_model(datos['cabecera'][j]['related_app'], datos['cabecera'][j]['related_model']) | |
model_dep = model_dep.objects.filter(**filtro).get() | |
if(datos['relation']['padre']['mod'] == datos['cabecera'][j]['related_model']): | |
datos['relation']['padre']['instance'] = model_dep | |
else: | |
setattr(modelo, datos['cabecera'][j]['field'], model_dep) | |
#Si existe una relación doble | |
if('ambigous' in datos['cabecera'][j]): | |
filtro = {} | |
filtro[datos['cabecera'][j]['filtro']] = load_file[i,j] | |
model_amb = apps.get_model(datos['cabecera'][j]['amb_app'], datos['cabecera'][j]['amb_model']) | |
model_amb = model_amb.objects.filter(**filtro).get() | |
setattr(rel_model, datos['cabecera'][j]['field'], model_amb) | |
# Si no tiene relación de ningun otro tipo | |
else: | |
setattr(modelo, datos['cabecera'][j]['field'], load_file[i,j]) | |
# Se comprueba quien es el hijo del padre (si el modelo o el relacionado) | |
if(datos['relation']['padre']['child']==mod): | |
setattr(modelo, datos['relation']['padre']['field'], datos['relation']['padre']['instance']) | |
elif(rel_model): | |
setattr(rel_model, datos['relation']['padre']['field'], datos['relation']['padre']['instance']) | |
rel_model.save() | |
#Se guarda el año de registro | |
setattr(modelo, 'anho_registro', anho_registro) | |
#Si existe un relación con un padre, se guarda luego de que se almacene el modelo | |
if(rel_model): | |
setattr(modelo, datos['relation']['relation_model']['field'], rel_model) | |
modelo.save() | |
default_storage.delete(path) | |
return HttpResponse(json.dumps({ | |
'result': True, 'message': "El archivo se cargó éxitosamente" | |
})) | |
return HttpResponse(json.dumps({'result': False, 'error': MSG_NOT_UPLOAD_FILE})) | |
except Exception as e: | |
message = e | |
return HttpResponse(json.dumps({'result': False, 'message': str(message)})) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment