|
|
@@ -1,12 +1,64 @@
|
|
|
+from email.policy import default
|
|
|
from django.db import models
|
|
|
from .validators import json_email_array, json_not_empty_string_array
|
|
|
+from django.utils import timezone
|
|
|
|
|
|
|
|
|
class ProgrammedReport(models.Model):
|
|
|
+ REPORT_FORMATS = [
|
|
|
+ ("excel", "Excel"),
|
|
|
+ ("csv", "CSV")
|
|
|
+ ]
|
|
|
+
|
|
|
+ name = models.CharField(max_length=100)
|
|
|
user_id = models.CharField(max_length=2048)
|
|
|
- report_type = models.CharField(max_length=50)
|
|
|
- modules = models.JSONField(
|
|
|
- validators=[json_not_empty_string_array])
|
|
|
+ frequency = models.DurationField(default=timezone.timedelta(days=1))
|
|
|
notified_emails = models.JSONField(
|
|
|
validators=[json_not_empty_string_array, json_email_array])
|
|
|
- last_report_date = models.DateField(blank=True, null=True, default=None)
|
|
|
+ last_report_date = models.DateTimeField(
|
|
|
+ blank=True, null=True, default=None)
|
|
|
+ start_report_date = models.DateTimeField(
|
|
|
+ default=timezone.now)
|
|
|
+
|
|
|
+ # Valores que configuran al reporte:
|
|
|
+ format = models.CharField(
|
|
|
+ max_length=5, choices=REPORT_FORMATS)
|
|
|
+ option = models.CharField(max_length=50)
|
|
|
+ stations = models.JSONField(validators=[json_not_empty_string_array])
|
|
|
+ modules = models.JSONField(validators=[json_not_empty_string_array])
|
|
|
+
|
|
|
+ # Metodo que envía la petición a Clima para enviar el reporte.
|
|
|
+ # TODO! Tecnicamente start_date y end_date podrían ser calculados por el modelo,
|
|
|
+ # hay que ver si hay un caso borde que requiere de que el llamador especifique el rango.
|
|
|
+ # Basicamente: TODO! Testear
|
|
|
+ def send_report(self, start_date, end_date):
|
|
|
+ import requests
|
|
|
+ import logging
|
|
|
+ from django.conf import settings
|
|
|
+ logger = logging.getLogger('django')
|
|
|
+
|
|
|
+ # Calculamos el formato en el que Clima requiere recibir los rangos.
|
|
|
+ start = start_date.strftime("%d/%m/%Y %H:%M")
|
|
|
+ end = end_date.strftime("%d/%m/%Y %H:%M")
|
|
|
+ response = requests.post(settings.CLIMA_URL + "/async_reports", {
|
|
|
+ "format": self.format,
|
|
|
+ "code[]": self.stations,
|
|
|
+ "start": start,
|
|
|
+ "end": end,
|
|
|
+ "option": self.option,
|
|
|
+ "selections": self.modules
|
|
|
+ })
|
|
|
+
|
|
|
+ # TODO! Testear y luego remover:
|
|
|
+ logger.info("Response: %s", response)
|
|
|
+ logger.info(response)
|
|
|
+
|
|
|
+ if response.status_code != 200:
|
|
|
+ logger.error(
|
|
|
+ "No se pudo enviar el reporte asincrono: %s\n Response: %s", self, response)
|
|
|
+ # TODO! Seria ideal enviar un email al administrador para ver que paso.
|
|
|
+ return
|
|
|
+ # TODO! Si se utiliza una Message Queue para la confirmación del envío entonces
|
|
|
+ # hay que mover esto al listener de la Queue.
|
|
|
+ self.last_report_date = timezone.now()
|
|
|
+ self.save()
|