1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
16 from drf_yasg import openapi
17 from drf_yasg.utils import swagger_auto_schema
18 from rest_framework import status
19 from rest_framework.response import Response
20 from rest_framework.views import APIView
22 from genericparser.jobs.job_get import GetJobInfoService
23 from genericparser.packages.serializers.genericparser_serializers import GetJobResponseSerializer
24 from genericparser.packages.serializers.genericparser_serializers import PostJobRequestSerializer
25 from genericparser.packages.serializers.genericparser_serializers import PostJobResponseResultSerializer
26 from genericparser.pub.utils.jobutil import JobUtil
27 from genericparser.pub.utils.values import ignore_case_get
29 logger = logging.getLogger(__name__)
32 class JobView(APIView):
34 input_job_id = openapi.Parameter(
38 type=openapi.TYPE_STRING)
39 input_response_id = openapi.Parameter(
42 description="response id",
43 type=openapi.TYPE_STRING)
46 operation_description="Get job status",
47 manual_parameters=[input_job_id, input_response_id],
49 status.HTTP_200_OK: GetJobResponseSerializer(),
50 status.HTTP_500_INTERNAL_SERVER_ERROR: PostJobResponseResultSerializer()
52 def get(self, request, job_id):
53 response_id = ignore_case_get(request.META, 'responseId')
54 ret = GetJobInfoService(job_id, response_id).do_biz()
55 response_serializer = GetJobResponseSerializer(data=ret)
56 validataion_error = self.handleValidatonError(
57 response_serializer, False)
59 return validataion_error
62 data=response_serializer.data,
63 status=status.HTTP_200_OK)
66 request_body=PostJobRequestSerializer(),
67 operation_description="Update job status",
68 manual_parameters=[input_job_id],
70 status.HTTP_202_ACCEPTED: PostJobResponseResultSerializer(),
71 status.HTTP_500_INTERNAL_SERVER_ERROR: PostJobResponseResultSerializer()
74 def post(self, request, job_id):
75 job_result_ok = {'result': 'ok'}
77 logger.debug("Enter JobView:post, %s, %s ", job_id, request.data)
78 jobs = JobUtil.query_job_status(job_id)
79 if len(jobs) > 0 and jobs[-1].errcode == '255':
80 return Response(data=job_result_ok)
82 request_serializer = PostJobRequestSerializer(data=request.data)
83 validataion_error = self.handleValidatonError(
84 request_serializer, True)
85 if not validataion_error:
86 return validataion_error
88 requestData = request_serializer.data
89 progress = ignore_case_get(requestData, "progress")
90 desc = ignore_case_get(requestData, "desc", '%s' % progress)
91 errcode = '0' if ignore_case_get(
92 requestData, 'errcode') in (
93 'true', 'active') else '255'
94 logger.debug("errcode=%s", errcode)
95 JobUtil.add_job_status(job_id, progress, desc, error_code=errcode)
97 response_serializer = PostJobResponseResultSerializer(
99 validataion_error = self.handleValidatonError(
100 response_serializer, False)
101 if validataion_error:
102 return validataion_error
105 data=response_serializer.data,
106 status=status.HTTP_202_ACCEPTED)
108 def handleValidatonError(self, base_serializer, is_request):
111 if not base_serializer.is_valid():
112 errormessage = base_serializer.errors
113 logger.error(errormessage)
116 message = 'Invalid request'
118 message = 'Invalid response'
119 logger.error(message)
122 data={'result': message, 'msg': errormessage},
123 status=status.HTTP_500_INTERNAL_SERVER_ERROR)