models.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 get_next_calendar_date, get_previous_calendar_date
  5. from django.conf import settings
  6. from django.utils.timezone import timedelta as delta
  7. import requests
  8. import logging
  9. logger = logging.getLogger('django')
  10. class ProgrammedReport(models.Model):
  11. REPORT_FORMATS = [
  12. ("excel", "Excel"),
  13. ("csv", "CSV")
  14. ]
  15. name = models.CharField(max_length=100)
  16. user_id = models.CharField(max_length=2048)
  17. frequency = models.CharField(max_length=20, default="monthly", validators=[valid_frequency_format])
  18. start_report_date = models.DateTimeField(
  19. default=timezone.now)
  20. last_report_date = models.DateTimeField(
  21. blank=True, null=True, default=None)
  22. due_date = models.DateTimeField(blank=True, null=True, default=None)
  23. # Valores que configuran al reporte:
  24. format = models.CharField(
  25. max_length=5, choices=REPORT_FORMATS)
  26. option = models.CharField(max_length=50, default="all")
  27. stations = models.JSONField(validators=[json_not_empty_string_array])
  28. modules = models.JSONField(validators=[json_not_empty_string_array])
  29. notified_emails = models.JSONField(
  30. validators=[json_not_empty_string_array, json_email_array])
  31. # Actualiza la due_date en cada save del modelo:
  32. # TODO! Hay un bug al guardar un reporte via el Admin, donde si lo guardas por ahi la correcion de 3 horas de
  33. # self.start_report_date y due_date es innecesaria y simplemente desconfigura los rangos horarios.
  34. # Por el momento los reportes deben ser guardados via la interfaz,c reo que tiene que ver con la
  35. # timezone que envian cada una de las interfaces en start_report_date
  36. def save(self, *args, **kwargs):
  37. self.start_report_date = get_previous_calendar_date(self.start_report_date, self.frequency) + delta(hours=3, seconds=1) # Convert to UTC
  38. self.due_date = get_next_calendar_date(self.start_report_date, self.frequency) + delta(hours=3) # Convert to UTC
  39. super().save(*args, **kwargs)
  40. # Metodo que envía la petición a Clima para enviar el reporte.
  41. def send_report(self):
  42. # Calculamos el formato en el que Clima requiere recibir los rangos.
  43. start_date = self.start_report_date.strftime("%d/%m/%Y %H:%M")
  44. end_date = self.due_date.strftime("%d/%m/%Y %H:%M")
  45. # Enviamos la request:
  46. response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
  47. "id": self.id,
  48. "name": self.name,
  49. "user_id": self.user_id,
  50. "format": self.format,
  51. "stations": self.stations,
  52. "modules": self.modules,
  53. "option": self.option,
  54. "start_date": start_date,
  55. "end_date": end_date,
  56. "notified_emails": self.notified_emails
  57. }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
  58. if response.status_code != 200:
  59. logger.critical(
  60. "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
  61. # TODO! Seria ideal enviar un email al administrador para ver que paso.
  62. return False
  63. self.start_report_date = self.due_date + delta(seconds=1) # Pass to next cycle
  64. self.save()
  65. return True
  66. def send_report_now(self):
  67. # Calculamos el formato en el que Clima requiere recibir los rangos.
  68. start_date = self.start_report_date.strftime("%d/%m/%Y %H:%M")
  69. end_date = timezone.datetime.now().strftime("%d/%m/%Y %H:%M")
  70. # Enviamos la request:
  71. response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
  72. "id": self.id,
  73. "name": self.name,
  74. "user_id": self.user_id,
  75. "format": self.format,
  76. "stations": self.stations,
  77. "modules": self.modules,
  78. "option": self.option,
  79. "start_date": start_date,
  80. "end_date": end_date,
  81. "notified_emails": self.notified_emails
  82. }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
  83. if response.status_code != 200:
  84. logger.critical(
  85. "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
  86. # TODO! Seria ideal enviar un email al administrador para ver que paso.
  87. return False
  88. return True