models.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from django.db import models
  2. from .validators import json_email_array, json_not_empty_string_array, valid_frequency_format
  3. from django.utils import timezone
  4. from api.config import CALENDAR_FREQUENCIES, get_next_calendar_date
  5. from django.conf import settings
  6. import requests
  7. import logging
  8. logger = logging.getLogger('django')
  9. class ProgrammedReport(models.Model):
  10. REPORT_FORMATS = [
  11. ("excel", "Excel"),
  12. ("csv", "CSV")
  13. ]
  14. name = models.CharField(max_length=100)
  15. user_id = models.CharField(max_length=2048)
  16. frequency = models.CharField(max_length=20, default="monthly", validators=[valid_frequency_format])
  17. start_report_date = models.DateTimeField(
  18. default=timezone.now)
  19. last_report_date = models.DateTimeField(
  20. blank=True, null=True, default=None)
  21. due_date = models.DateTimeField(blank=True, null=True, default=None)
  22. # Valores que configuran al reporte:
  23. format = models.CharField(
  24. max_length=5, choices=REPORT_FORMATS)
  25. option = models.CharField(max_length=50, default="all")
  26. stations = models.JSONField(validators=[json_not_empty_string_array])
  27. modules = models.JSONField(validators=[json_not_empty_string_array])
  28. notified_emails = models.JSONField(
  29. validators=[json_not_empty_string_array, json_email_array])
  30. # Actualiza la due_date en cada save del modelo.
  31. def save(self, *args, **kwargs):
  32. base_date = self.last_report_date if self.last_report_date is not None else self.start_report_date
  33. self.due_date = get_next_calendar_date(base_date, self.frequency)
  34. super().save(*args, **kwargs)
  35. # Metodo que envía la petición a Clima para enviar el reporte.
  36. def send_report(self):
  37. # Calculamos el formato en el que Clima requiere recibir los rangos.
  38. start_date = (self.last_report_date if self.last_report_date is not None else self.start_report_date).strftime(
  39. "%d/%m/%Y %H:%M")
  40. end_date = self.due_date.strftime("%d/%m/%Y %H:%M")
  41. # Enviamos la request:
  42. response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
  43. "id": self.id,
  44. "user_id": self.user_id,
  45. "format": self.format,
  46. "stations": self.stations,
  47. "modules": self.modules,
  48. "option": self.option,
  49. "start_date": start_date,
  50. "end_date": end_date,
  51. "notified_emails": self.notified_emails
  52. }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
  53. if response.status_code != 200:
  54. logger.critical(
  55. "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
  56. # TODO! Seria ideal enviar un email al administrador para ver que paso.
  57. return False
  58. self.last_report_date = timezone.now()
  59. self.save()
  60. return True
  61. def send_report_now(self):
  62. # Calculamos el formato en el que Clima requiere recibir los rangos.
  63. end_date = timezone.datetime.now()
  64. start_date = (self.last_report_date if self.last_report_date is not None else self.start_report_date).strftime(
  65. "%d/%m/%Y %H:%M")
  66. end_date = end_date.strftime("%d/%m/%Y %H:%M")
  67. start_date = start_date.strftime("%d/%m/%Y %H:%M")
  68. # Enviamos la request:
  69. response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
  70. "id": self.id,
  71. "user_id": self.user_id,
  72. "format": self.format,
  73. "stations": self.stations,
  74. "modules": self.modules,
  75. "option": self.option,
  76. "start_date": start_date,
  77. "end_date": end_date,
  78. "notified_emails": self.notified_emails
  79. }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
  80. if response.status_code != 200:
  81. logger.critical(
  82. "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
  83. # TODO! Seria ideal enviar un email al administrador para ver que paso.
  84. return False
  85. return True