소스 검색

Fixes de las fechas de envio de reportes

Tomás Ponce Gessi 3 년 전
부모
커밋
bfb9df83e2
2개의 변경된 파일21개의 추가작업 그리고 21개의 파일을 삭제
  1. 10 10
      app/api/config.py
  2. 11 11
      app/api/models.py

+ 10 - 10
app/api/config.py

@@ -10,27 +10,27 @@ CALENDAR_FREQUENCIES = {
 }
 
 def get_next_calendar_date(date: datetime, frequency: str):
-    base_date: datetime = date.replace(hour=0, minute=0, second=0, microsecond=0)
+    base_date: datetime = date.replace(hour=23, minute=59, second=59, microsecond=0)
     if frequency == "daily":
-        return base_date + delta(days=1)
+        return base_date
     if frequency == "weekly":
-        days_ahead = -date.weekday() + 7 # Lunes
+        days_ahead = -date.weekday() + 6 # Lunes
         return base_date + delta(days=days_ahead)
     if frequency == "monthly":
-        return (base_date.replace(day=1) + reldelta(months=1))
+        return (base_date.replace(day=1) + reldelta(months=1)) - delta(days=1)
     if frequency == "yearly":
-        return (base_date.replace(day=1, month=1) + reldelta(years=1))
+        return (base_date.replace(day=1, month=1) + reldelta(years=1)) - delta(days=1)
     return None
 
 def get_previous_calendar_date(date: datetime, frequency: str):
-    base_date: datetime = date.replace(hour=0, minute=0, second=0, microsecond=0)
+    base_date: datetime = date.replace(hour=23, minute=59, second=59, microsecond=0)
     if frequency == "daily":
-        return base_date
+        return base_date - delta(days=1)
     if frequency == "weekly":
-        days_ahead = date.weekday()
+        days_ahead = date.weekday() + 1
         return base_date - delta(days=days_ahead)
     if frequency == "monthly":
-        return base_date.replace(day=1)
+        return base_date.replace(day=1) - delta(days=1)
     if frequency == "yearly":
-        return base_date.replace(day=1, month=1)
+        return base_date.replace(day=1, month=1) - delta(days=1)
     return None

+ 11 - 11
app/api/models.py

@@ -4,7 +4,6 @@ from django.utils import timezone
 from api.config import get_next_calendar_date, get_previous_calendar_date
 from django.conf import settings
 from django.utils.timezone import timedelta as delta
-from pytz import timezone as tz
 import requests
 import logging
 logger = logging.getLogger('django')
@@ -34,18 +33,20 @@ class ProgrammedReport(models.Model):
     notified_emails = models.JSONField(
         validators=[json_not_empty_string_array, json_email_array])
 
-    # Actualiza la due_date en cada save del modelo.
+    # Actualiza la due_date en cada save del modelo:
+    # TODO! Hay un bug al guardar un reporte via el Admin, donde si lo guardas por ahi la correcion de 3 horas de
+    # self.start_report_date y due_date es innecesaria y simplemente desconfigura los rangos horarios.
+    # Por el momento los reportes deben ser guardados via la interfaz,c reo que tiene que ver con la
+    # timezone que envian cada una de las interfaces en start_report_date
     def save(self, *args, **kwargs):
-        base_date = self.last_report_date if self.last_report_date is not None else self.start_report_date - delta(hours=3) # Convert to UTC-3
-        self.due_date = get_next_calendar_date(base_date, self.frequency) + delta(hours=3)
+        self.start_report_date = get_previous_calendar_date(self.start_report_date, self.frequency) + delta(hours=3, seconds=1) # Convert to UTC
+        self.due_date = get_next_calendar_date(self.start_report_date, self.frequency) + delta(hours=3) # Convert to UTC
         super().save(*args, **kwargs)
 
-
     # Metodo que envía la petición a Clima para enviar el reporte.
     def send_report(self):
         # 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.start_report_date.strftime("%d/%m/%Y %H:%M")
         end_date = self.due_date.strftime("%d/%m/%Y %H:%M")
 
         # Enviamos la request:
@@ -68,15 +69,14 @@ class ProgrammedReport(models.Model):
             # TODO! Seria ideal enviar un email al administrador para ver que paso.
             return False
 
-        self.last_report_date = self.due_date
+        self.start_report_date = self.due_date + delta(seconds=1) # Pass to next cycle
         self.save()
         return True
 
     def send_report_now(self):
         # Calculamos el formato en el que Clima requiere recibir los rangos.
-        now = timezone.datetime.now()
-        start_date = get_previous_calendar_date(now, self.frequency).strftime("%d/%m/%Y %H:%M")
-        end_date = now.strftime("%d/%m/%Y %H:%M")
+        start_date = self.start_report_date.strftime("%d/%m/%Y %H:%M")
+        end_date = timezone.datetime.now().strftime("%d/%m/%Y %H:%M")
 
         # Enviamos la request:
         response = requests.post(settings.CLIMA_URL + "/async_report_handler", {