feat: 表格导入接口完成
This commit is contained in:
parent
45e95ad014
commit
4f58ed67e0
|
|
@ -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())
|
||||
|
|
@ -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)
|
||||
Loading…
Reference in New Issue