from django.db.models import ObjectDoesNotExist 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 .models import ProgrammedReport from .serializers import ProgrammedReportSerializer from .permissions import IsOmixomUser from rest_framework import status # API de Programmed Reports: # Requisitos: # - Especificar el TOKEN del usuario en el HTTP Header "AUTHORIZATION". # - Las requests deben ser JSON. # - No es necesario enviar el field user_id, esto es seteado automaticamente al recibir el TOKEN. # Endpoints: (BASE_URL: /api/preports) # - (List) GET / -> Obtener la lista de todos los Programmed Report # - (Create) POST / -> Crear un nuevo Programmed Report # - (Retrieve) GET /{id}/ -> Obtener la informacion de un Programmed Report # - (Update) PUT /{id}/ -> Actualizar un Programmed Report (requiere todos los fields) # - (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) if not sent: return Response("Error al comunicarse con clima", status.HTTP_500_INTERNAL_SERVER_ERROR) 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] serializer_class = ProgrammedReportSerializer # Solo se devuelven los modelos para el user_id asociado al token. (Ver IsOmixomUser) def get_queryset(self): user_id = self.request.data["user_id"] qs = ProgrammedReport.objects.filter(user_id=user_id) return qs # Endpoint para la confirmacion de envio de un reporte programado por parte de Clima: # Por el momento no es usado: # class ProgrammedReportSentConfirmation(views.APIView): # parser_classes = [JSONParser] # def post(self, request, format=None): # if(settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN != request.META.get("HTTP_AUTHORIZATION")): # return Response("Invalid Access Credentials.", status.HTTP_403_FORBIDDEN) # report = ProgrammedReport.objects.filter(id=request.data.get("id")).first() # if report is None: # return Response("Invalid Report.", status.HTTP_400_BAD_REQUEST) # report.last_report_date = timezone.now() # report.save() # return Response("Ok", status.HTTP_200_OK)