diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 95c3dd9..c9e87c0 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -192,4 +192,10 @@ class UpdateFieldSerializer(serializers.ModelSerializer): class Meta: model = Task2Do fields = ['num_issue', 'num_expect'] - extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}} \ No newline at end of file + extra_kwargs = {'num_issue': {'required': True}, 'num_expect': {'required': True}} + + + +class ImpSerializer(serializers.Serializer): + path = serializers.CharField(label='文件地址') + task2do = serializers.PrimaryKeyRelatedField(label='关联task2do的ID值', queryset = Task2Do.objects.all()) \ No newline at end of file diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 942cc26..5f3d51e 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -11,6 +11,7 @@ from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelM from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet, ModelViewSet from utils.pagination import PageOrNot +from openpyxl import load_workbook from apps.system.mixins import CreateUpdateCustomMixin from apps.system.models import Organization @@ -584,43 +585,184 @@ class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): if goal_file: instance.goal_files.add(goal_file) +class ImpMixin: + def get_enum(self, val, atuple, ind): + for i in atuple: + if i[1] == val: + return i[0] + raise ParseError('第{}: 请选择固定选项值'.format(ind)) + + def make_data(self, data, sheet, i, etype): + raise NotImplementedError() -class RcViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): + def gen_imp_view(self, request, start: int, mySerializer, etype=0): + sr = ImpSerializer(data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + path = vdata['path'] + task2do = vdata['task2do'] + fullpath = settings.BASE_DIR + path + wb = load_workbook(fullpath,data_only=True) + sheet = wb.worksheets[0] + datalist = [] + i = start + while sheet['b'+str(i)].value: + data = {} + data['task2do'] = task2do.id + data = self.make_data(data, sheet, i, etype) + datalist.append(data) + i = i + 1 + sr = mySerializer(data=datalist, many=True) + sr.is_valid() + err_msg = '' + for ind, val in enumerate(sr.errors): + if val: + for i in val: + err_msg = '第{}行: {}'.format(5+ind, i + str(val[i][0])) + if err_msg != '': + raise ParseError(err_msg) + else: + sr.save(create_by=request.user) + return Response() + +class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Rc.objects.all() serializer_class = RcSerializer count_dict = { "num_error": {'etype': 10}, "num_overdue": {'etype': 20} } + + + def make_data(self, data, sheet, i, etype): + data['etype'] = etype + if etype == 10: + data['number'] = sheet['b'+str(i)].value + data['number_correct'] = sheet['c'+str(i)].value + data['reason_error'] = sheet['d'+str(i)].value + data['date_issue'] = sheet['e'+str(i)].value + else: + data['number'] = sheet['b'+str(i)].value + data['date_accept'] = sheet['c'+str(i)].value + data['date_expect'] = sheet['d'+str(i)].value + data['date_issue'] = sheet['e'+str(i)].value + data['remark'] = sheet['f'+str(i)].value + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp_error(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, RcSerializer, 10) + + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp_overdue(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, RcSerializer, 20) + -class ComplaintViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): +class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Complaint.objects.all() serializer_class = ComplaintSerializer count_dict = { "num_complaint": {} } + def make_data(self, data, sheet, i, etype): + data['complainant'] = sheet['b'+str(i)].value + data['date_occurrence'] = sheet['c'+str(i)].value + data['content'] = sheet['d'+str(i)].value + data['date_feedback'] = sheet['e'+str(i)].value + data['is_satisfied'] = True if sheet['f'+str(i)].value == '是' else False + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, ComplaintSerializer) -class PtViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): +class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Pt.objects.all() serializer_class = PtSerializer count_dict = { "num_pt": {} } + def make_data(self, data, sheet, i, etype): + data['name'] = sheet['b'+str(i)].value + data['number'] = sheet['c'+str(i)].value + data['organizer'] = sheet['d'+str(i)].value + data['params'] = sheet['e'+str(i)].value + data['result'] = self.get_enum(sheet['f'+str(i)].value, Pt.pt_result_choices, i) + data['handle_result'] = self.get_enum(sheet['g'+str(i)].value, Pt.pt_hresult_choices, i) + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 -class RiskViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): + 导入表格 + """ + return self.gen_imp_view(request, 5, PtSerializer) + + +class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Risk.objects.all() serializer_class = RiskSerializer count_dict = { "num_risk": {} } + def make_data(self, data, sheet, i, etype): + data['content'] = sheet['b'+str(i)].value + data['level'] = self.get_enum(sheet['c'+str(i)].value, Risk.risk_level_choices, i) + data['code'] = sheet['d'+str(i)].value + data['state'] = self.get_enum(sheet['e'+str(i)].value, Risk.risk_state_choices, i) + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 -class OinspectViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet): + 导入表格 + """ + return self.gen_imp_view(request, 5, RiskSerializer) + + +class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): queryset = Oinspect.objects.all() serializer_class = OinspectSerializer count_dict = { "num_oinspect": {} } + + def make_data(self, data, sheet, i, etype): + data['cate'] = self.get_enum(sheet['b'+str(i)].value, Oinspect.oinspect_cate_choices, i) + data['checker'] = sheet['c'+str(i)].value + data['date_inspect'] = sheet['d'+str(i)].value + data['result'] = sheet['e'+str(i)].value + return data + + @action(methods=['post'], detail=False, perms_map = {'post':'task2do'}, serializer_class=ImpSerializer) + @transaction.atomic + def imp(self, request, *args, **kwargs): + """导入表格 + + 导入表格 + """ + return self.gen_imp_view(request, 5, OinspectSerializer) \ No newline at end of file