Crea un Script AJAX con intérvalos de ejecución usando Django
Hace poco me encontré con una dificultad que me tomó al menos 4 días en resolver, esta dificultad se basaba en que necesitaba informar a un usuario de una aplicación (que estoy haciendo aún) en el momento que el estatus de un campo de la base de datos cambiaba.
Este cambio de la base de datos era establecido por la acción de otro usuario, básicamente aceptaba o rechazaba una tarea. En cualquiera de las dos situaciones el usuario "jefe" por llamarlo de alguna manera tenía que saber en un período de tiempo corto el cambio del estatus.
Para ello lo que hice primero fué configurar las notificaciones push para que el usuario "empleado" recibiera el aviso de que había una tarea asignada para él, además también recibía un e-mail. Si quieres saber cómo configurar notificaciones push sigue este tutorial.
La vista que desarrollé fué la siguiente:
@login_required
def verificar_cambios_orden(request):
orden = OrdenDeServicio.objects.filter(payment_intent_id=request.session.get('id_orden_abierta')).values()
if orden != None:
return JsonResponse({'data': list(orden)}, status=200,content_type="application/json")
else:
return False
En esta vista se hace una query que filtra la información de la base de datos utilizando una variable de sesión previamente establecida con los datos de una transacción de Stripe la cual se compara con el valor guardado en el registro para esa orden; Si la orden existe, el ajax que he configurado en la plantilla recibe una lista con la información del registro ('data': list(orden) en forma de json.
Esta vista es accesible usando la url previamente configurada:
path('verificar/orden/', views.verificar_cambios_orden, name='verificar-orden')
Luego esta información es procesada así:
En la plantilla:
{% extends "backend/base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
{% include 'backend/navbar.html' %}
<section>
<H4 class="m-5 text-center">Se ha ejecutado la retención del pago con éxito, estamos en espera de que el repartidor confirme la recogida</H4>
<div class="d-flex justify-content-center">
<img class="img-responsive" src="{% static 'backend/images/mobileguy.svg' %}">
<div class="spinner-border text-center m-5" style="width: 3rem; height: 3rem;" role="status"role="status">
<span class="sr-only text-center">Loading...</span>
</div>
</div>
<h2 class="text-center m-5">Por Favor no cierre esta pestaña</h2>
</section>
<script type="text/javascript">
let verificaAccionDelRider= setInterval(function() {
$.ajax("{% url 'verificar-orden' %}", {
method: "GET",
async: "True",
dataType: "json",
success: function (response) {
var orden = response;
console.log(response['data'][0]['estado'])
if(response['data'][0]['estado'] == 'CANCELADA'){
window.location.replace('/rechazada/'+response['data'][0]['id']);
clearInterval(verificaAccionDelRider);
}else if(response['data'][0]['estado'] == 'ACEPTADA'){
window.location.replace('/aceptada/');
clearInterval(verificaAccionDelRider);
}
}
})
}, 15000);
</script>
{% endblock content %}
Primero debo mencionar que mientras el "jefe" está visualizando esta plantilla renderizada por la vista, se le avisa que no puede cerrar la pestaña hasta que no reciba respuesta.
En este script lo que sucede es lo siguiente:
Ejecuto un método llamado setInterval que lo que hace es ejecutar el código dentro de su ámbito cada determinados milisegundos, en este caso particular son "15000".
Este script accessa la url "verificar-orden" que a su vez ejecuta la vista "verificar_cambios_orden" cada 15000 segundos(Tú estableces el tiempo que más te convenga).
Una vez que el usuario acepta o cancela la orden, el estatus de la base de datos cambia a CANCELADA ó ACEPTADA y el ajax redirige al "jefe" a su panel de control(usando un par de vistas ya configuradas) mostrándole un mensaje según la selección del "empleado".
Estas urls son las siguientes:
path('rechazada/<id>', views.cancelled_view, name='order-cancelada'),
path('aceptada/', views.accepted_view, name='order-aceptada'),
A partir de aquí ya el "jefe" pude generar una nueva orden (o la misma) asignándola a otro "empleado".
(Aparte de ésto suceden muchas cosas en el proceso, como por ejemplo, el estatus del empleado es establecido a "inactivo" mientras tiene una orden asignada ó que en este proceso se realiza la retención de un monto x en euros el cual se cancelará o se cobrará dependiendo de las acciones realizadas, pero no las he mencionado para no hacer más largo el artículo)
Espero que te sirva de ayuda, si te ha gustado o tienes dudas sobre algo ¡Deja tu comentario! :-D