Browse Source

Generalizado de Frequency a String, acepta una frequencia calendario o un entero arbitrario

Tomás Ponce Gessi 3 years ago
parent
commit
548aadf970

+ 9 - 0
app/api/config.py

@@ -0,0 +1,9 @@
+from dateutil.relativedelta import relativedelta as reldelta
+from django.utils.timezone import timedelta as delta
+
+CALENDAR_FREQUENCIES = {
+    "Diario": delta(days=1),
+    "Quincenal": reldelta(days=15),
+    "Mensual": reldelta(months=1),
+    "Anual": reldelta(years=1)
+}

+ 19 - 0
app/api/migrations/0004_alter_programmedreport_frequency.py

@@ -0,0 +1,19 @@
+# Generated by Django 4.0.4 on 2022-10-19 23:41
+
+import api.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('api', '0003_programmedreport_due_date'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='programmedreport',
+            name='frequency',
+            field=models.CharField(default='Mensual', max_length=20, validators=[api.validators.valid_frequency_format]),
+        ),
+    ]

+ 9 - 12
app/api/models.py

@@ -1,8 +1,8 @@
 from django.db import models
-from .validators import json_email_array, json_not_empty_string_array
+from .validators import json_email_array, json_not_empty_string_array, valid_frequency_format
 from django.utils import timezone
 from django.conf import settings
-from dateutil.relativedelta import relativedelta as reldelta
+from api.config import CALENDAR_FREQUENCIES
 
 class ProgrammedReport(models.Model):
     REPORT_FORMATS = [
@@ -12,7 +12,7 @@ class ProgrammedReport(models.Model):
 
     name = models.CharField(max_length=100)
     user_id = models.CharField(max_length=2048)
-    frequency = models.DurationField(default=timezone.timedelta(days=1))
+    frequency = models.CharField(max_length=20, default="Mensual", validators=[valid_frequency_format])
     start_report_date = models.DateTimeField(
         default=timezone.now)
     last_report_date = models.DateTimeField(
@@ -31,12 +31,8 @@ class ProgrammedReport(models.Model):
     # Actualiza la due_date en cada save del modelo.
     def save(self, *args, **kwargs):
         base_date = self.last_report_date if self.last_report_date is not None else self.start_report_date
-        due_date = None
-        if self.frequency.total_seconds() == 0: # Cada mes calendario
-            due_date = base_date + reldelta(months=1)
-        else:
-            due_date= base_date + self.frequency
-        self.due_date = due_date
+        self.due_date = base_date + CALENDAR_FREQUENCIES.get(
+            self.frequency) if self.frequency in CALENDAR_FREQUENCIES else base_date + timezone.timedelta(seconds=int(self.frequency))
         super().save(*args, **kwargs)
 
     # Metodo que envía la petición a Clima para enviar el reporte.
@@ -45,7 +41,8 @@ class ProgrammedReport(models.Model):
         from django.conf import settings
 
         # Calculamos el formato en el que Clima requiere recibir los rangos.
-        start_date = (self.last_report_date if self.last_report_date is not None else self.start_report_date).strftime("%d/%m/%Y %H:%M")
+        start_date = (self.last_report_date if self.last_report_date is not None else self.start_report_date).strftime(
+            "%d/%m/%Y %H:%M")
         end_date = self.due_date.strftime("%d/%m/%Y %H:%M")
 
         # Enviamos la request:
@@ -67,6 +64,6 @@ class ProgrammedReport(models.Model):
                 "No se pudo enviar el reporte asincrono: %s\n Reason: %s", self, response.reason)
             # TODO! Seria ideal enviar un email al administrador para ver que paso.
             return False
-        
+
         self.last_report_date = timezone.now()
-        self.save()
+        self.save()

+ 14 - 0
app/api/validators.py

@@ -1,8 +1,22 @@
+from tokenize import String
 from typing import List
 from django.core.exceptions import ValidationError
 from django.core.validators import validate_email
+from api.config import CALENDAR_FREQUENCIES
 
 
+def valid_frequency_format(freq: String):
+    '''
+    Ve que el valor sea alguna de las frequencias calendario definidad en CALENDAR_FREQUENCIES o que sea
+    un valor entero.
+    '''
+
+    if freq not in CALENDAR_FREQUENCIES:
+        if not freq.isdigit():
+            raise ValidationError("Debe ser una frequencia calendario o un entero positivo.")
+        if int(freq) <= 0:
+            raise ValidationError("Debe ser un entero positivo")
+
 def json_email_array(val: List):
     '''
     Ve que el valor sea una lista de emails serializada en JSON.