models.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. from django.conf import settings
  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. start_report_date = models.DateTimeField(
  14. default=timezone.now)
  15. last_report_date = models.DateTimeField(
  16. blank=True, null=True, default=None)
  17. # Valores que configuran al reporte:
  18. format = models.CharField(
  19. max_length=5, choices=REPORT_FORMATS)
  20. option = models.CharField(max_length=50, default="all")
  21. stations = models.JSONField(validators=[json_not_empty_string_array])
  22. modules = models.JSONField(validators=[json_not_empty_string_array])
  23. notified_emails = models.JSONField(
  24. validators=[json_not_empty_string_array, json_email_array])
  25. # Metodo que envía la petición a Clima para enviar el reporte.
  26. def send_report(self, start_date, end_date):
  27. import requests
  28. from django.conf import settings
  29. # Calculamos el formato en el que Clima requiere recibir los rangos.
  30. start = start_date.strftime("%d/%m/%Y %H:%M")
  31. end = end_date.strftime("%d/%m/%Y %H:%M")
  32. response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
  33. "id": self.id,
  34. "user_id": self.user_id,
  35. "format": self.format,
  36. "stations": self.stations,
  37. "modules": self.modules,
  38. "option": self.option,
  39. "start_date": start,
  40. "end_date": end,
  41. "notified_emails": self.notified_emails
  42. }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
  43. if response.status_code != 200:
  44. import logging
  45. logging.getLogger('django').error(
  46. "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
  47. # TODO! Seria ideal enviar un email al administrador para ver que paso.
  48. return False