Selaa lähdekoodia

Send report now

wilitp 3 vuotta sitten
vanhempi
commit
1f093b6696
3 muutettua tiedostoa jossa 71 lisäystä ja 5 poistoa
  1. 42 2
      app/api/models.py
  2. 3 2
      app/api/urls.py
  3. 26 1
      app/api/views.py

+ 42 - 2
app/api/models.py

@@ -1,3 +1,4 @@
+from datetime import date, timedelta
 from django.db import models
 from .validators import json_email_array, json_not_empty_string_array, valid_frequency_format
 from django.utils import timezone
@@ -28,13 +29,18 @@ class ProgrammedReport(models.Model):
     notified_emails = models.JSONField(
         validators=[json_not_empty_string_array, json_email_array])
 
+    @property
+    def timestamp_freq(self) -> timezone.timedelta:
+        return CALENDAR_FREQUENCIES.get(self.frequency) if self.frequency in CALENDAR_FREQUENCIES else timezone.timedelta(seconds=int(self.frequency))
+
+
     # 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
-        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))
+        self.due_date = base_date + self.timestamp_freq
         super().save(*args, **kwargs)
 
+
     # Metodo que envía la petición a Clima para enviar el reporte.
     def send_report(self):
         import requests
@@ -67,3 +73,37 @@ class ProgrammedReport(models.Model):
 
         self.last_report_date = timezone.now()
         self.save()
+        return True
+
+    def send_report_now(self):
+        import requests
+        from django.conf import settings
+
+        # Calculamos el formato en el que Clima requiere recibir los rangos.
+        end_date = timezone.datetime.now()
+        start_date = end_date - self.timestamp_freq
+
+        end_date = end_date.strftime("%d/%m/%Y %H:%M")
+        start_date = start_date.strftime("%d/%m/%Y %H:%M")
+
+        # Enviamos la request:
+        response = requests.post(settings.CLIMA_URL + "/async_report_handler", {
+            "id": self.id,
+            "user_id": self.user_id,
+            "format": self.format,
+            "stations": self.stations,
+            "modules": self.modules,
+            "option": self.option,
+            "start_date": start_date,
+            "end_date": end_date,
+            "notified_emails": self.notified_emails
+        }, headers={"AUTHORIZATION": settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN})
+
+        if response.status_code != 200:
+            import logging
+            logging.getLogger('django').error(
+                "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
+
+        return True

+ 3 - 2
app/api/urls.py

@@ -1,9 +1,10 @@
 from django.urls import path
 from rest_framework.routers import SimpleRouter
-from .views import ProgrammedReportViewSet, ProgrammedReportSentConfirmation
+from .views import ProgrammedReportViewSet, ProgrammedReportSentConfirmation, SendReportNow
 
 router = SimpleRouter()
 router.register(r'preports', ProgrammedReportViewSet, "preport")
 urlpatterns = [
-    path(r'preports-confirmation', ProgrammedReportSentConfirmation.as_view())
+    path(r'preports-confirmation', ProgrammedReportSentConfirmation.as_view()),
+    path('preports-send-now/<int:pk>/', SendReportNow.as_view())
 ] + router.urls

+ 26 - 1
app/api/views.py

@@ -1,5 +1,9 @@
 from urllib import response
+from django.db.models import ObjectDoesNotExist
+from django.http import HttpResponse
+from django.urls.exceptions import Http404
 from rest_framework import viewsets, views
+from rest_framework.exceptions import PermissionDenied
 from rest_framework.response import Response
 from rest_framework.parsers import JSONParser
 from .models import ProgrammedReport
@@ -23,6 +27,27 @@ from rest_framework import status
 #   - (Partial_Update) PATCH /{id}/  -> Actualizar algunos fields de un Programmed Report
 #   - (Delete) DELETE /{id}/         -> Elimina un Programmed Report
 
+class SendReportNow(views.APIView):
+    permission_classes = [IsOmixomUser]
+    def get(self, request, pk):
+        """
+        Send report right now, regardless of if it should be sent.
+        """
+        user_id = request.data["user_id"]
+        try:
+            preport: ProgrammedReport = ProgrammedReport.objects.get(pk=pk)
+        except ObjectDoesNotExist:
+            raise Http404
+
+        if(int(preport.user_id) != int(user_id)):
+            raise PermissionDenied(f"Su usuario no es dueño de este reporte({preport.user_id} != {user_id})")
+        sent = preport.send_report_now()
+        print("Se envio" if sent else "No se pudo enviar","el Programmed Report ID:", preport.id)
+        return Response("Ok", status.HTTP_200_OK)
+
+
+
+
 class ProgrammedReportViewSet(viewsets.ModelViewSet):
     # El ViewSet solo es valido si el Token enviado es de un usuario de Omixom.
     permission_classes = [IsOmixomUser]
@@ -47,4 +72,4 @@ class ProgrammedReportSentConfirmation(views.APIView):
             return Response("Invalid Report.", status.HTTP_400_BAD_REQUEST)
         report.last_report_date = timezone.now()
         report.save()
-        return Response("Ok", status.HTTP_200_OK)
+        return Response("Ok", status.HTTP_200_OK)