diff --git a/docs/rest/upload.rest b/docs/rest/upload.rest index ddcbdba..7427288 100644 --- a/docs/rest/upload.rest +++ b/docs/rest/upload.rest @@ -12,6 +12,11 @@ Content-Type: application/json "password": "usuario1" } + +### +GET {{server}}/upload/zip +Authorization: Bearer {{token}} + ### POST {{server}}/upload/zip/ Authorization: Bearer {{token}} diff --git a/project/api/views/upload.py b/project/api/views/upload.py index 8eaf196..20544b0 100644 --- a/project/api/views/upload.py +++ b/project/api/views/upload.py @@ -1,26 +1,46 @@ from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse +from django.http import HttpResponse from rest_framework.decorators import action from django.db import connection import tempfile import threading -import time -import shutil import logging import zipfile import os import csv +import redis + @csrf_exempt -@action(detail=False, methods=['post']) +@action(detail=False, methods=['get','post']) def upload_zip(request): - if request.method == 'POST': - filezip = request.FILES['filezip'] + db_host = os.getenv('DB_REDIS_HOST') + db_port = os.getenv('DB_REDIS_PORT') + r = redis.Redis(host=db_host, port=db_port, decode_responses=True) + if request.method == 'GET': + filezip = r.get('filezip') + return JsonResponse({ + 'process': filezip != None, + 'filename': filezip + }) + + if request.method == 'POST': + + status = r.get('filezip') + if status != None: + return HttpResponse('Ya existe un proceso en ejecución', status=400) + + filezip = request.FILES['filezip'] if filezip.closed == False and hasattr(filezip,'temporary_file_path'): + + # Notificar a Redis que proceso ha iniciado + r.set('filezip', filezip.name) + hilo = threading.Thread(target=procesa_zip, args=(filezip,)) hilo.start() return JsonResponse({ @@ -33,9 +53,11 @@ def upload_zip(request): 'message': 'Error en archivo zip enviado' }) + + + def procesa_zip(file_upload): carpeta_destino = tempfile.gettempdir() - # shutil.copy(filezip.temporary_file_path(), carpeta_destino) # descomprimir archivo zip archivo_zip = zipfile.ZipFile(file_upload.temporary_file_path(), "r") @@ -72,13 +94,15 @@ def procesa_zip(file_upload): cur.close() connection.commit() - # for i in range(10): - # time.sleep(1) - # print('.', end='', flush=True) - print('==============', flush=True) print(f'fin proceso archivo: {archivo_zip}', flush=True) + # notificar a Redis que proceso ha finalizado + db_host = os.getenv('DB_REDIS_HOST') + db_port = os.getenv('DB_REDIS_PORT') + r = redis.Redis(host=db_host, port=db_port, decode_responses=True) + r.delete('filezip') + # Función para crear la definición de la tabla como texto y cargar los datos