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) 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) # 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()