Kaynağa Gözat

Añadido método send_report y modificación del modelo

Tomas Ponce Gessi 3 yıl önce
ebeveyn
işleme
0946e56b5d
2 değiştirilmiş dosya ile 67 ekleme ve 8 silme
  1. 11 4
      app/api/migrations/0001_initial.py
  2. 56 4
      app/api/models.py

+ 11 - 4
app/api/migrations/0001_initial.py

@@ -1,7 +1,9 @@
-# Generated by Django 4.0.4 on 2022-09-20 19:13
+# Generated by Django 4.0.4 on 2022-09-24 23:16
 
 import api.validators
+import datetime
 from django.db import migrations, models
+import django.utils.timezone
 
 
 class Migration(migrations.Migration):
@@ -16,11 +18,16 @@ class Migration(migrations.Migration):
             name='ProgrammedReport',
             fields=[
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=100)),
                 ('user_id', models.CharField(max_length=2048)),
-                ('report_type', models.CharField(max_length=50)),
-                ('modules', models.JSONField(validators=[api.validators.json_not_empty_string_array])),
+                ('frequency', models.DurationField(default=datetime.timedelta(days=1))),
                 ('notified_emails', models.JSONField(validators=[api.validators.json_not_empty_string_array, api.validators.json_email_array])),
-                ('last_report_date', models.DateField(blank=True, default=None, null=True)),
+                ('last_report_date', models.DateTimeField(blank=True, default=None, null=True)),
+                ('start_report_date', models.DateTimeField(default=django.utils.timezone.now)),
+                ('format', models.CharField(choices=[('excel', 'Excel'), ('csv', 'CSV')], max_length=5)),
+                ('option', models.CharField(max_length=50)),
+                ('stations', models.JSONField(validators=[api.validators.json_not_empty_string_array])),
+                ('modules', models.JSONField(validators=[api.validators.json_not_empty_string_array])),
             ],
         ),
     ]

+ 56 - 4
app/api/models.py

@@ -1,12 +1,64 @@
+from email.policy import default
 from django.db import models
 from .validators import json_email_array, json_not_empty_string_array
+from django.utils import timezone
 
 
 class ProgrammedReport(models.Model):
+    REPORT_FORMATS = [
+        ("excel", "Excel"),
+        ("csv", "CSV")
+    ]
+
+    name = models.CharField(max_length=100)
     user_id = models.CharField(max_length=2048)
-    report_type = models.CharField(max_length=50)
-    modules = models.JSONField(
-        validators=[json_not_empty_string_array])
+    frequency = models.DurationField(default=timezone.timedelta(days=1))
     notified_emails = models.JSONField(
         validators=[json_not_empty_string_array, json_email_array])
-    last_report_date = models.DateField(blank=True, null=True, default=None)
+    last_report_date = models.DateTimeField(
+        blank=True, null=True, default=None)
+    start_report_date = models.DateTimeField(
+        default=timezone.now)
+
+    # Valores que configuran al reporte:
+    format = models.CharField(
+        max_length=5, choices=REPORT_FORMATS)
+    option = models.CharField(max_length=50)
+    stations = models.JSONField(validators=[json_not_empty_string_array])
+    modules = models.JSONField(validators=[json_not_empty_string_array])
+
+    # Metodo que envía la petición a Clima para enviar el reporte.
+    # TODO! Tecnicamente start_date y end_date podrían ser calculados por el modelo,
+    # hay que ver si hay un caso borde que requiere de que el llamador especifique el rango.
+    # Basicamente: TODO! Testear
+    def send_report(self, start_date, end_date):
+        import requests
+        import logging
+        from django.conf import settings
+        logger = logging.getLogger('django')
+
+        # Calculamos el formato en el que Clima requiere recibir los rangos.
+        start = start_date.strftime("%d/%m/%Y %H:%M")
+        end = end_date.strftime("%d/%m/%Y %H:%M")
+        response = requests.post(settings.CLIMA_URL + "/async_reports", {
+            "format": self.format,
+            "code[]": self.stations,
+            "start": start,
+            "end": end,
+            "option": self.option,
+            "selections": self.modules
+        })
+
+        # TODO! Testear y luego remover:
+        logger.info("Response: %s", response)
+        logger.info(response)
+
+        if response.status_code != 200:
+            logger.error(
+                "No se pudo enviar el reporte asincrono: %s\n Response: %s", self, response)
+            # TODO! Seria ideal enviar un email al administrador para ver que paso.
+            return
+        # TODO! Si se utiliza una Message Queue para la confirmación del envío entonces
+        # hay que mover esto al listener de la Queue.
+        self.last_report_date = timezone.now()
+        self.save()