models.py 4.3 KB

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