feat: 表格导入接口完成

This commit is contained in:
caoqianming 2023-05-29 13:47:01 +08:00
parent 45e95ad014
commit 4f58ed67e0
2 changed files with 154 additions and 6 deletions

View File

@ -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}}
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())

View File

@ -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)