models.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from email.policy import default
  2. from django.db import models
  3. from .validators import json_email_array, json_not_empty_string_array
  4. from django.utils import timezone
  5. class ProgrammedReport(models.Model):
  6. REPORT_FORMATS = [
  7. ("excel", "Excel"),
  8. ("csv", "CSV")
  9. ]
  10. name = models.CharField(max_length=100)
  11. user_id = models.CharField(max_length=2048)
  12. frequency = models.DurationField(default=timezone.timedelta(days=1))
  13. notified_emails = models.JSONField(
  14. validators=[json_not_empty_string_array, json_email_array])
  15. last_report_date = models.DateTimeField(
  16. blank=True, null=True, default=None)
  17. start_report_date = models.DateTimeField(
  18. default=timezone.now)
  19. # Valores que configuran al reporte:
  20. format = models.CharField(
  21. max_length=5, choices=REPORT_FORMATS)
  22. option = models.CharField(max_length=50)
  23. stations = models.JSONField(validators=[json_not_empty_string_array])
  24. modules = models.JSONField(validators=[json_not_empty_string_array])
  25. # Metodo que envía la petición a Clima para enviar el reporte.
  26. # TODO! Tecnicamente start_date y end_date podrían ser calculados por el modelo,
  27. # hay que ver si hay un caso borde que requiere de que el llamador especifique el rango.
  28. # Basicamente: TODO! Testear
  29. def send_report(self, start_date, end_date):
  30. import requests
  31. import logging
  32. from django.conf import settings
  33. logger = logging.getLogger('django')
  34. # Calculamos el formato en el que Clima requiere recibir los rangos.
  35. start = start_date.strftime("%d/%m/%Y %H:%M")
  36. end = end_date.strftime("%d/%m/%Y %H:%M")
  37. response = requests.post(settings.CLIMA_URL + "/async_reports", {
  38. "format": self.format,
  39. "code[]": self.stations,
  40. "start": start,
  41. "end": end,
  42. "option": self.option,
  43. "selections": self.modules
  44. })
  45. # TODO! Testear y luego remover:
  46. logger.info("Response: %s", response)
  47. logger.info(response)
  48. if response.status_code != 200:
  49. logger.error(
  50. "No se pudo enviar el reporte asincrono: %s\n Response: %s", self, response)
  51. # TODO! Seria ideal enviar un email al administrador para ver que paso.
  52. return
  53. # TODO! Si se utiliza una Message Queue para la confirmación del envío entonces
  54. # hay que mover esto al listener de la Queue.
  55. self.last_report_date = timezone.now()
  56. self.save()