views.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from django.db.models import ObjectDoesNotExist
  2. from django.urls.exceptions import Http404
  3. from rest_framework import viewsets, views
  4. from rest_framework.exceptions import PermissionDenied
  5. from rest_framework.response import Response
  6. from .models import ProgrammedReport
  7. from .serializers import ProgrammedReportSerializer
  8. from .permissions import IsOmixomUser
  9. from rest_framework import status
  10. # API de Programmed Reports:
  11. # Requisitos:
  12. # - Especificar el TOKEN del usuario en el HTTP Header "AUTHORIZATION".
  13. # - Las requests deben ser JSON.
  14. # - No es necesario enviar el field user_id, esto es seteado automaticamente al recibir el TOKEN.
  15. # Endpoints: (BASE_URL: /api/preports)
  16. # - (List) GET / -> Obtener la lista de todos los Programmed Report
  17. # - (Create) POST / -> Crear un nuevo Programmed Report
  18. # - (Retrieve) GET /{id}/ -> Obtener la informacion de un Programmed Report
  19. # - (Update) PUT /{id}/ -> Actualizar un Programmed Report (requiere todos los fields)
  20. # - (Partial_Update) PATCH /{id}/ -> Actualizar algunos fields de un Programmed Report
  21. # - (Delete) DELETE /{id}/ -> Elimina un Programmed Report
  22. class SendReportNow(views.APIView):
  23. permission_classes = [IsOmixomUser]
  24. def get(self, request, pk):
  25. """
  26. Send report right now, regardless of if it should be sent.
  27. """
  28. user_id = request.data["user_id"]
  29. try:
  30. preport: ProgrammedReport = ProgrammedReport.objects.get(pk=pk)
  31. except ObjectDoesNotExist:
  32. raise Http404
  33. if(int(preport.user_id) != int(user_id)):
  34. raise PermissionDenied(f"Su usuario no es dueño de este reporte({preport.user_id} != {user_id})")
  35. sent = preport.send_report_now()
  36. if sent:
  37. print("Se envio el Programmed Report ID:", preport.id)
  38. else:
  39. print("No se pudo enviar el Programmed Report ID:", preport.id)
  40. if not sent:
  41. return Response("Error al comunicarse con clima", status.HTTP_500_INTERNAL_SERVER_ERROR)
  42. return Response("Ok", status.HTTP_200_OK)
  43. class ProgrammedReportViewSet(viewsets.ModelViewSet):
  44. # El ViewSet solo es valido si el Token enviado es de un usuario de Omixom.
  45. permission_classes = [IsOmixomUser]
  46. serializer_class = ProgrammedReportSerializer
  47. # Solo se devuelven los modelos para el user_id asociado al token. (Ver IsOmixomUser)
  48. def get_queryset(self):
  49. user_id = self.request.data["user_id"]
  50. qs = ProgrammedReport.objects.filter(user_id=user_id)
  51. return qs
  52. # Endpoint para la confirmacion de envio de un reporte programado por parte de Clima:
  53. # Por el momento no es usado:
  54. # class ProgrammedReportSentConfirmation(views.APIView):
  55. # parser_classes = [JSONParser]
  56. # def post(self, request, format=None):
  57. # if(settings.PROGRAMMED_REPORTS_SERVICE_AUTH_TOKEN != request.META.get("HTTP_AUTHORIZATION")):
  58. # return Response("Invalid Access Credentials.", status.HTTP_403_FORBIDDEN)
  59. # report = ProgrammedReport.objects.filter(id=request.data.get("id")).first()
  60. # if report is None:
  61. # return Response("Invalid Report.", status.HTTP_400_BAD_REQUEST)
  62. # report.last_report_date = timezone.now()
  63. # report.save()
  64. # return Response("Ok", status.HTTP_200_OK)