genericparser seed code
[modeling/etsicatalog.git] / genericparser / jobs / views.py
1 # Copyright 2017 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14 import logging
15
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
21
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
28
29 logger = logging.getLogger(__name__)
30
31
32 class JobView(APIView):
33
34     input_job_id = openapi.Parameter(
35         'job_id',
36         openapi.IN_QUERY,
37         description="job id",
38         type=openapi.TYPE_STRING)
39     input_response_id = openapi.Parameter(
40         'responseId',
41         openapi.IN_QUERY,
42         description="response id",
43         type=openapi.TYPE_STRING)
44
45     @swagger_auto_schema(
46         operation_description="Get job status",
47         manual_parameters=[input_job_id, input_response_id],
48         responses={
49             status.HTTP_200_OK: GetJobResponseSerializer(),
50             status.HTTP_500_INTERNAL_SERVER_ERROR: PostJobResponseResultSerializer()
51         })
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)
58         if validataion_error:
59             return validataion_error
60
61         return Response(
62             data=response_serializer.data,
63             status=status.HTTP_200_OK)
64
65     @swagger_auto_schema(
66         request_body=PostJobRequestSerializer(),
67         operation_description="Update job status",
68         manual_parameters=[input_job_id],
69         responses={
70             status.HTTP_202_ACCEPTED: PostJobResponseResultSerializer(),
71             status.HTTP_500_INTERNAL_SERVER_ERROR: PostJobResponseResultSerializer()
72         }
73     )
74     def post(self, request, job_id):
75         job_result_ok = {'result': 'ok'}
76
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)
81
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
87
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)
96
97         response_serializer = PostJobResponseResultSerializer(
98             data=job_result_ok)
99         validataion_error = self.handleValidatonError(
100             response_serializer, False)
101         if validataion_error:
102             return validataion_error
103
104         return Response(
105             data=response_serializer.data,
106             status=status.HTTP_202_ACCEPTED)
107
108     def handleValidatonError(self, base_serializer, is_request):
109         response = None
110
111         if not base_serializer.is_valid():
112             errormessage = base_serializer.errors
113             logger.error(errormessage)
114
115             if is_request:
116                 message = 'Invalid request'
117             else:
118                 message = 'Invalid response'
119             logger.error(message)
120
121             Response(
122                 data={'result': message, 'msg': errormessage},
123                 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
124         return response