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