models.py 2.6 KB

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