Пример #1
0
 def unarchive(self, request, pk=None):
     """
     Unarchive the request : change the state of the request to 'COMPLETE'.
     """
     target_request = get_object_or_404(Request, id=pk)
     if not can_proceed(target_request.unarchive):
         raise PermissionDenied
     target_request.unarchive()
     target_request.save()
     return Response(AdminRequestSerializer(target_request).data,
                     status=status.HTTP_200_OK)
Пример #2
0
 def process(self, request, pk=None):
     """
     Process the Tower/AWX job : change the state of the request to 'PROCESSING' then 'COMPLETE' or 'FAILED' depending on Tower/AWX job status.
     """
     target_request = get_object_or_404(Request, id=pk)
     if not can_proceed(target_request.process):
         raise PermissionDenied
     message = process_request(request.user, target_request)
     if message:
         return Response(message,
                         status=status.HTTP_503_SERVICE_UNAVAILABLE)
     return Response(AdminRequestSerializer(target_request).data,
                     status=status.HTTP_200_OK)
Пример #3
0
 def accept(self, request, pk=None):
     """
     Accept the request and validate/complete the survey : change the state of the request to 'ACCEPTED'.
     """
     target_request = get_object_or_404(Request, id=pk)
     if not can_proceed(target_request.accept):
         raise PermissionDenied
     serializer = AcceptRequestSerializer(data=request.data,
                                          target_request=target_request,
                                          user=request.user,
                                          read_only_form=False)
     if serializer.is_valid():
         target_request = serializer.save()
         send_mail_request_update(target_request,
                                  user_applied_state=request.user)
         return Response(AdminRequestSerializer(target_request).data,
                         status=status.HTTP_200_OK)
     return Response(serializer.error_messages,
                     status=status.HTTP_400_BAD_REQUEST)
Пример #4
0
 def cancel(self, request, pk=None):
     """
     Cancel the request : change the state of the request to 'CANCELED', when instance still in 'PENDING' state it will be deleted.
     """
     user_requests = get_objects_for_user(request.user,
                                          'service_catalog.cancel_request')
     target_request = get_object_or_404(user_requests, id=pk)
     if not can_proceed(target_request.cancel):
         raise PermissionDenied
     if target_request.cancel():
         target_request.save()
     send_email_request_canceled(target_request,
                                 user_applied_state=request.user,
                                 request_owner_user=target_request.user)
     if request.user.is_superuser:
         return Response(AdminRequestSerializer(target_request).data,
                         status=status.HTTP_200_OK)
     return Response(RequestSerializer(target_request).data,
                     status=status.HTTP_200_OK)
Пример #5
0
 def re_submit(self, request, pk=None):
     """
     Re-submit the request : change the state of the request to 'SUBMITTED'.
     """
     target_request = get_object_or_404(Request, id=pk)
     if not can_proceed(target_request.re_submit):
         raise PermissionDenied
     data = QueryDict.copy(request.data)
     data['sender'] = request.user.id
     data['request'] = target_request.id
     message = RequestMessageSerializer(data=data)
     if message.is_valid():
         message.save()
     target_request.re_submit()
     target_request.save()
     send_mail_request_update(target_request,
                              user_applied_state=request.user,
                              message=message)
     return Response(AdminRequestSerializer(target_request).data,
                     status=status.HTTP_200_OK)
Пример #6
0
 def test_contains_expected_fields(self):
     serializer = AdminRequestSerializer(instance=self.local_test_request)
     self.assertEqual(set(serializer.data.keys()),
                      {'id', 'fill_in_survey', 'admin_fill_in_survey', 'date_submitted', 'date_complete',
                       'date_archived', 'instance', 'operation', 'state', 'tower_job_id', 'user'})
Пример #7
0
class RequestStateMachine(ViewSet):
    def get_permissions(self):
        if self.action == 'cancel':
            permission_classes = [IsAuthenticated]
        else:
            permission_classes = [IsAdminUser]
        return [permission() for permission in permission_classes]

    @swagger_auto_schema(request_body=AcceptRequestSerializer,
                         responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def accept(self, request, pk=None):
        """
        Accept the request and validate/complete the survey : change the state of the request to 'ACCEPTED'.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.accept):
            raise PermissionDenied
        serializer = AcceptRequestSerializer(data=request.data,
                                             target_request=target_request,
                                             user=request.user,
                                             read_only_form=False)
        if serializer.is_valid():
            target_request = serializer.save()
            send_mail_request_update(target_request,
                                     user_applied_state=request.user)
            return Response(AdminRequestSerializer(target_request).data,
                            status=status.HTTP_200_OK)
        return Response(serializer.error_messages,
                        status=status.HTTP_400_BAD_REQUEST)

    @swagger_auto_schema(responses={200: 'Survey in JSON'})
    @action(detail=True)
    def get_survey(self, request, pk=None):
        """
        Get the survey prefilled by user/admin.
        """
        target_request = get_object_or_404(Request, id=pk)
        serializer = AcceptRequestSerializer(target_request.full_survey,
                                             target_request=target_request,
                                             user=request.user,
                                             read_only_form=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    @swagger_auto_schema(request_body=MessageSerializer,
                         responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def reject(self, request, pk=None):
        """
        Reject the request : change the state of the request to 'REJECTED'.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.reject):
            raise PermissionDenied
        data = QueryDict.copy(request.data)
        data['sender'] = request.user.id
        data['request'] = target_request.id
        message = RequestMessageSerializer(data=data)
        if message.is_valid():
            message.save()
        target_request.reject()
        target_request.save()
        send_mail_request_update(target_request,
                                 user_applied_state=request.user,
                                 message=message)
        return Response(AdminRequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)

    @swagger_auto_schema(request_body=MessageSerializer,
                         responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def re_submit(self, request, pk=None):
        """
        Re-submit the request : change the state of the request to 'SUBMITTED'.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.re_submit):
            raise PermissionDenied
        data = QueryDict.copy(request.data)
        data['sender'] = request.user.id
        data['request'] = target_request.id
        message = RequestMessageSerializer(data=data)
        if message.is_valid():
            message.save()
        target_request.re_submit()
        target_request.save()
        send_mail_request_update(target_request,
                                 user_applied_state=request.user,
                                 message=message)
        return Response(AdminRequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)

    @swagger_auto_schema(request_body=MessageSerializer,
                         responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def need_info(self, request, pk=None):
        """
        Ask for more info : change the state of the request to 'NEED_INFO'.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.need_info):
            raise PermissionDenied
        data = QueryDict.copy(request.data)
        data['sender'] = request.user.id
        data['request'] = target_request.id
        message = RequestMessageSerializer(data=data)
        if message.is_valid():
            message.save()
        target_request.need_info()
        target_request.save()
        send_mail_request_update(target_request,
                                 user_applied_state=request.user,
                                 message=message)
        return Response(AdminRequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)

    @swagger_auto_schema(request_body=MessageSerializer,
                         responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def process(self, request, pk=None):
        """
        Process the Tower/AWX job : change the state of the request to 'PROCESSING' then 'COMPLETE' or 'FAILED' depending on Tower/AWX job status.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.process):
            raise PermissionDenied
        message = process_request(request.user, target_request)
        if message:
            return Response(message,
                            status=status.HTTP_503_SERVICE_UNAVAILABLE)
        return Response(AdminRequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)

    @swagger_auto_schema(responses={200: RequestSerializer()})
    @action(detail=True)
    def cancel(self, request, pk=None):
        """
        Cancel the request : change the state of the request to 'CANCELED', when instance still in 'PENDING' state it will be deleted.
        """
        user_requests = get_objects_for_user(request.user,
                                             'service_catalog.cancel_request')
        target_request = get_object_or_404(user_requests, id=pk)
        if not can_proceed(target_request.cancel):
            raise PermissionDenied
        if target_request.cancel():
            target_request.save()
        send_email_request_canceled(target_request,
                                    user_applied_state=request.user,
                                    request_owner_user=target_request.user)
        if request.user.is_superuser:
            return Response(AdminRequestSerializer(target_request).data,
                            status=status.HTTP_200_OK)
        return Response(RequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)

    @swagger_auto_schema(responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def archive(self, request, pk=None):
        """
        Archive the request : change the state of the request to 'ARCHIVED'.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.archive):
            raise PermissionDenied
        target_request.archive()
        target_request.save()
        return Response(AdminRequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)

    @swagger_auto_schema(responses={200: AdminRequestSerializer()})
    @action(detail=True)
    def unarchive(self, request, pk=None):
        """
        Unarchive the request : change the state of the request to 'COMPLETE'.
        """
        target_request = get_object_or_404(Request, id=pk)
        if not can_proceed(target_request.unarchive):
            raise PermissionDenied
        target_request.unarchive()
        target_request.save()
        return Response(AdminRequestSerializer(target_request).data,
                        status=status.HTTP_200_OK)