views.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from urllib import response
  2. from django.db.models import ObjectDoesNotExist
  3. from django.http import HttpResponse
  4. from django.urls.exceptions import Http404
  5. from rest_framework import viewsets, views
  6. from rest_framework.exceptions import PermissionDenied
  7. from rest_framework.response import Response
  8. from rest_framework.parsers import JSONParser
  9. from .models import ProgrammedReport
  10. from .serializers import ProgrammedReportSerializer
  11. from .permissions import IsOmixomUser
  12. from django.conf import settings
  13. from django.utils import timezone
  14. from rest_framework import status
  15. # API de Programmed Reports:
  16. # Requisitos:
  17. # - Especificar el TOKEN del usuario en el HTTP Header "AUTHORIZATION".
  18. # - Las requests deben ser JSON.
  19. # - No es necesario enviar el field user_id, esto es seteado automaticamente al recibir el TOKEN.
  20. # Endpoints: (BASE_URL: /api/preports)
  21. # - (List) GET / -> Obtener la lista de todos los Programmed Report
  22. # - (Create) POST / -> Crear un nuevo Programmed Report
  23. # - (Retrieve) GET /{id}/ -> Obtener la informacion de un Programmed Report
  24. # - (Update) PUT /{id}/ -> Actualizar un Programmed Report (requiere todos los fields)
  25. # - (Partial_Update) PATCH /{id}/ -> Actualizar algunos fields de un Programmed Report
  26. # - (Delete) DELETE /{id}/ -> Elimina un Programmed Report
  27. class SendReportNow(views.APIView):
  28. permission_classes = [IsOmixomUser]
  29. def get(self, request, pk):
  30. """
  31. Send report right now, regardless of if it should be sent.
  32. """
  33. user_id = request.data["user_id"]
  34. try:
  35. preport: ProgrammedReport = ProgrammedReport.objects.get(pk=pk)
  36. except ObjectDoesNotExist:
  37. raise Http404
  38. if(int(preport.user_id) != int(user_id)):
  39. raise PermissionDenied(f"Su usuario no es dueño de este reporte({preport.user_id} != {user_id})")
  40. sent = preport.send_report_now()
  41. print("Se envio" if sent else "No se pudo enviar","el Programmed Report ID:", preport.id)
  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)