|
|
@@ -1,3 +1,4 @@
|
|
|
+from datetime import date, timedelta
|
|
|
from django.db import models
|
|
|
from .validators import json_email_array, json_not_empty_string_array, valid_frequency_format
|
|
|
from django.utils import timezone
|
|
|
@@ -28,13 +29,18 @@ class ProgrammedReport(models.Model):
|
|
|
notified_emails = models.JSONField(
|
|
|
validators=[json_not_empty_string_array, json_email_array])
|
|
|
|
|
|
+ @property
|
|
|
+ def timestamp_freq(self) -> timezone.timedelta:
|
|
|
+ return CALENDAR_FREQUENCIES.get(self.frequency) if self.frequency in CALENDAR_FREQUENCIES else timezone.timedelta(seconds=int(self.frequency))
|
|
|
+
|
|
|
+
|
|
|
# Actualiza la due_date en cada save del modelo.
|
|
|
def save(self, *args, **kwargs):
|
|
|
base_date = self.last_report_date if self.last_report_date is not None else self.start_report_date
|
|
|
- self.due_date = base_date + CALENDAR_FREQUENCIES.get(
|
|
|
- self.frequency) if self.frequency in CALENDAR_FREQUENCIES else base_date + timezone.timedelta(seconds=int(self.frequency))
|
|
|
+ self.due_date = base_date + self.timestamp_freq
|
|
|
super().save(*args, **kwargs)
|
|
|
|
|
|
+
|
|
|
# Metodo que envía la petición a Clima para enviar el reporte.
|
|
|
def send_report(self):
|
|
|
import requests
|
|
|
@@ -67,3 +73,37 @@ class ProgrammedReport(models.Model):
|
|
|
|
|
|
self.last_report_date = timezone.now()
|
|
|
self.save()
|
|
|
+ return True
|
|
|
+
|
|
|
+ def send_report_now(self):
|
|
|
+ import requests
|
|
|
+ from django.conf import settings
|
|
|
+
|
|
|
+ # Calculamos el formato en el que Clima requiere recibir los rangos.
|
|
|
+ end_date = timezone.datetime.now()
|
|
|
+ start_date = end_date - self.timestamp_freq
|
|
|
+
|
|
|
+ end_date = end_date.strftime("%d/%m/%Y %H:%M")
|
|
|
+ start_date = start_date.strftime("%d/%m/%Y %H:%M")
|
|
|
+
|
|
|
+ # Enviamos la request:
|
|
|
+ response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
|
|
|
+ "id": self.id,
|
|
|
+ "user_id": self.user_id,
|
|
|
+ "format": self.format,
|
|
|
+ "stations": self.stations,
|
|
|
+ "modules": self.modules,
|
|
|
+ "option": self.option,
|
|
|
+ "start_date": start_date,
|
|
|
+ "end_date": end_date,
|
|
|
+ "notified_emails": self.notified_emails
|
|
|
+ }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
|
|
|
+
|
|
|
+ if response.status_code != 200:
|
|
|
+ import logging
|
|
|
+ logging.getLogger('django').error(
|
|
|
+ "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
|
|
|
+ # TODO! Seria ideal enviar un email al administrador para ver que paso.
|
|
|
+ return False
|
|
|
+
|
|
|
+ return True
|