diff --git a/catalog/views.py b/catalog/views.py index cfe1067b3775d488d527fd49678bf960176be115..63d1b70a275e17c93e28ac2fb1c4032e5154bc1d 100644 --- a/catalog/views.py +++ b/catalog/views.py @@ -586,93 +586,58 @@ import requests from django.http import JsonResponse, HttpResponseNotAllowed from django.core.management import call_command from django.views.decorators.csrf import csrf_exempt +import os +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +from django.conf import settings +import subprocess @csrf_exempt def run_update_and_report(request): if request.method != 'POST': - return HttpResponseNotAllowed(['POST']) - - # Inicializar variables para recopilar resultados y errores - results = { - 'status': 'success', - 'messages': [], - 'errors': [], - 'api_response': None - } - status_code = 200 - - try: - # Leer y validar JSON del request - try: - data = json.loads(request.body) - except json.JSONDecodeError as e: - results['status'] = 'partial_success' - results['errors'].append('JSON inválido') - status_code = 400 - data = {} # Usar valores por defecto - - db_path = data.get('db_path', '/data/m3/news/') - json_output_path = data.get('output_path', 'catalog/static/js/data.js') - - # Ejecutar updateDB - try: - call_command('updateDB', db_path) - results['messages'].append('updateDB ejecutado correctamente') - except Exception as e: - results['status'] = 'partial_success' - results['errors'].append(f'Error en updateDB: {str(e)}') - # No hacemos return, continuamos con el siguiente comando - - # Ejecutar report - try: - call_command('report', json_output_path) - results['messages'].append(f'Reporte generado en {json_output_path}') - except Exception as e: - results['status'] = 'partial_success' - results['errors'].append(f'Error en report: {str(e)}') - - # Obtener la última fecha de ejecución + return JsonResponse({'status': 'error', 'message': 'Only POST requests are allowed'}, status=405) + + # Get the base directory (where manage.py is located) + base_dir = settings.BASE_DIR + script_path = os.path.join(base_dir, 'update.sh') + + # Check if the script exists + if not os.path.exists(script_path): + return JsonResponse({'status': 'error', 'message': 'update.sh not found'}, status=404) + + # Check if the script is executable + if not os.access(script_path, os.X_OK): try: - last_execution_date = read_last_execution_date() or datetime.date.today().strftime('%Y-%m-%d') - fecha_inicio = last_execution_date - fecha_final = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d') + os.chmod(script_path, 0o755) # Make the script executable except Exception as e: - results['status'] = 'partial_success' - results['errors'].append(f'Error al leer fecha de ejecución: {str(e)}') - # Usar fechas por defecto si hay error - fecha_inicio = datetime.date.today().strftime('%Y-%m-%d') - fecha_final = (datetime.date.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d') - - # Enviar solicitud POST a API externa - try: - payload = {"fecha_inicio": fecha_inicio, "fecha_final": fecha_final} - response = requests.post("https://em.geoint.mx/m3/processnews", json=payload, timeout=10) - response.raise_for_status() - results['api_response'] = response.json() - results['messages'].append('API externa llamada correctamente') - except requests.exceptions.RequestException as e: - results['status'] = 'partial_success' - results['errors'].append(f'Error en API externa: {str(e)}') - - # Guardar nueva fecha de ejecución - try: - write_execution_date() - results['messages'].append('Fecha de ejecución actualizada') - except Exception as e: - results['status'] = 'partial_success' - results['errors'].append(f'Error al escribir fecha de ejecución: {str(e)}') - + return JsonResponse({'status': 'error', 'message': f'Cannot make script executable: {str(e)}'}, status=500) + + try: + # Run the script and capture output + result = subprocess.run( + [script_path], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + + output = { + 'status': 'success', + 'return_code': result.returncode, + 'stdout': result.stdout, + 'stderr': result.stderr + } + return JsonResponse(output) + + except subprocess.CalledProcessError as e: + return JsonResponse({ + 'status': 'error', + 'message': 'Script execution failed', + 'return_code': e.returncode, + 'stdout': e.stdout, + 'stderr': e.stderr + }, status=500) + except Exception as e: - # Este bloque captura errores inesperados no manejados en los bloques try internos - print(traceback.format_exc()) - results['status'] = 'error' - results['errors'].append(f'Error inesperado: {str(e)}') - status_code = 500 - - # Determinar el código de estado final - if results['status'] == 'error': - status_code = 500 - elif results['status'] == 'partial_success' and status_code == 200: - status_code = 207 # Multi-Status, si todo fue parcial - - return JsonResponse(results, status=status_code) \ No newline at end of file + return JsonResponse({'status': 'error', 'message': str(e)}, status=500) \ No newline at end of file