feat: 表格导入接口完成
This commit is contained in:
parent
45e95ad014
commit
4f58ed67e0
|
|
@ -192,4 +192,10 @@ class UpdateFieldSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Task2Do
|
model = Task2Do
|
||||||
fields = ['num_issue', 'num_expect']
|
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.response import Response
|
||||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||||
from utils.pagination import PageOrNot
|
from utils.pagination import PageOrNot
|
||||||
|
from openpyxl import load_workbook
|
||||||
|
|
||||||
from apps.system.mixins import CreateUpdateCustomMixin
|
from apps.system.mixins import CreateUpdateCustomMixin
|
||||||
from apps.system.models import Organization
|
from apps.system.models import Organization
|
||||||
|
|
@ -584,43 +585,184 @@ class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
if goal_file:
|
if goal_file:
|
||||||
instance.goal_files.add(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()
|
queryset = Rc.objects.all()
|
||||||
serializer_class = RcSerializer
|
serializer_class = RcSerializer
|
||||||
count_dict = {
|
count_dict = {
|
||||||
"num_error": {'etype': 10},
|
"num_error": {'etype': 10},
|
||||||
"num_overdue": {'etype': 20}
|
"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()
|
queryset = Complaint.objects.all()
|
||||||
serializer_class = ComplaintSerializer
|
serializer_class = ComplaintSerializer
|
||||||
count_dict = {
|
count_dict = {
|
||||||
"num_complaint": {}
|
"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()
|
queryset = Pt.objects.all()
|
||||||
serializer_class = PtSerializer
|
serializer_class = PtSerializer
|
||||||
count_dict = {
|
count_dict = {
|
||||||
"num_pt": {}
|
"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()
|
queryset = Risk.objects.all()
|
||||||
serializer_class = RiskSerializer
|
serializer_class = RiskSerializer
|
||||||
count_dict = {
|
count_dict = {
|
||||||
"num_risk": {}
|
"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()
|
queryset = Oinspect.objects.all()
|
||||||
serializer_class = OinspectSerializer
|
serializer_class = OinspectSerializer
|
||||||
count_dict = {
|
count_dict = {
|
||||||
"num_oinspect": {}
|
"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