|
|
@@ -1,8 +1,10 @@
|
|
|
-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
|
|
|
|
|
|
+# TODO! Move to ENV file...
|
|
|
+PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN = "juwiV9MjP4r3NTsvd9qRsPQ2FMdk5soJjxksYKhruza3wskG23h4cygTEPiFAGo2"
|
|
|
+
|
|
|
|
|
|
class ProgrammedReport(models.Model):
|
|
|
REPORT_FORMATS = [
|
|
|
@@ -13,52 +15,50 @@ class ProgrammedReport(models.Model):
|
|
|
name = models.CharField(max_length=100)
|
|
|
user_id = models.CharField(max_length=2048)
|
|
|
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.DateTimeField(
|
|
|
- blank=True, null=True, default=None)
|
|
|
start_report_date = models.DateTimeField(
|
|
|
default=timezone.now)
|
|
|
+ last_report_date = models.DateTimeField(
|
|
|
+ blank=True, null=True, default=None)
|
|
|
|
|
|
# Valores que configuran al reporte:
|
|
|
format = models.CharField(
|
|
|
max_length=5, choices=REPORT_FORMATS)
|
|
|
- option = models.CharField(max_length=50)
|
|
|
+ option = models.CharField(max_length=50, default="all")
|
|
|
stations = models.JSONField(validators=[json_not_empty_string_array])
|
|
|
modules = models.JSONField(validators=[json_not_empty_string_array])
|
|
|
+ notified_emails = models.JSONField(
|
|
|
+ validators=[json_not_empty_string_array, json_email_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
|
|
|
+ # Basicamente: 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", {
|
|
|
+ response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
|
|
|
"format": self.format,
|
|
|
- "code[]": self.stations,
|
|
|
- "start": start,
|
|
|
- "end": end,
|
|
|
+ "stations": self.stations,
|
|
|
+ "modules": self.modules,
|
|
|
"option": self.option,
|
|
|
- "selections": self.modules
|
|
|
- })
|
|
|
-
|
|
|
- # TODO! Testear y luego remover:
|
|
|
- logger.info("Response: %s", response)
|
|
|
- logger.info(response)
|
|
|
+ "start_date": start,
|
|
|
+ "end_date": end,
|
|
|
+ "notified_emails": self.notified_emails
|
|
|
+ }, headers={"AUTHORIZATION": PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
|
|
|
|
|
|
if response.status_code != 200:
|
|
|
- logger.error(
|
|
|
- "No se pudo enviar el reporte asincrono: %s\n Response: %s", self, response)
|
|
|
+ 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
|
|
|
+ return False
|
|
|
+
|
|
|
# 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()
|
|
|
+ return True
|