123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import traceback
- from Ansjer.settings import *
- from django.views.generic.base import View
- from django.views.decorators.csrf import csrf_exempt
- from openpyxl import load_workbook
- from openpyxl.compat import range
- import xlrd
- from Service.ResponseService import *
- from Service.CommonService import CommonService
- from Model.models import Device_Info, Device_User
- class batchAddEquipmentView(View):
- @csrf_exempt
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- fileType = request.POST.get('fileType', None)
- fileName = request.FILES.get('fileName', None)
- if fileName != None and fileType != None:
- return self.batchAddEquipment(fileType, fileName)
- else:
- return ResponseJSON(800)
- @csrf_exempt
- def get(self, request, *args, **kwargs):
- request.encoding = 'gb2312'
- fileType = request.GET.get('fileType', None)
- fileName = request.FILES.get('fileName', None)
- if fileName != None and fileType != None:
- return self.batchAddEquipment(fileType, fileName)
- else:
- return ResponseJSON(800)
- #return HttpResponse(self.batchAddEquipmentfromTXTDict('D://1.txt'))
- #return HttpResponse(self.batchAddEquipmentfromExecl2('D:/2.xlsx'))
- def batchAddEquipment(self, fileType, fileName):
- filename = fileName.name
- filename = filename.replace(' ', '+')
- try:
- filePath = '/'.join((BASE_DIR, "static/SysFile", fileType)).replace('\\', '/') + '/'
- if not os.path.exists(filePath):
- os.makedirs(filePath)
- fullPath = filePath + filename
- if os.path.exists(fullPath):
- os.remove(fullPath)
- destination = open(fullPath, 'wb+')
- for chunk in fileName.chunks():
- destination.write(chunk)
- destination.close()
- else:
- fullPath = filePath + filename
- if os.path.exists(fullPath):
- os.remove(fullPath)
- destination = open(fullPath, 'wb+')
- for chunk in fileName.chunks():
- destination.write(chunk)
- destination.close()
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('上传文件错误: %s' % errorInfo)
- return ResponseJSON(700, {
- 'details': repr(e)
- })
- if fileType == 'TXT':
- response = HttpResponse(self.batchAddEquipmentfromTXT(fullPath))
- return response
- elif fileType == 'Excel':
- response = HttpResponse(self.batchAddEquipmentfromExecl(fullPath))
- return response
- def batchAddEquipmentfromExecl(self, filePath):
- if not os.path.isfile(filePath):
- return ResponseJSON(701)
- else:
- try:
- xlsData = xlrd.open_workbook(filename = filePath)
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('Open the Excel file error: %s' % errorInfo)
- return ResponseJSON(702, {
- 'details': repr(e)
- })
- else:
- sheetsCount = len(xlsData.sheets())
- table = xlsData.sheets()[0] # 打开第一张表
- nrows = table.nrows # 获取表的行数
- eInfo = []
- error_list = []
- error_msg = {}
- errorCount = addCount = 0
- for index in range(nrows): # 循环逐行添加
- eInfo = table.row_values(index)
- try:
- User = Device_User.objects.filter(userID = eInfo[0])
- except Exception as e:
- errorCount += 1
- errorInfo = traceback.format_exc()
- print('error message: %s' % errorInfo)
- errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
- error_list.append(errorDict)
- continue
- if not User:
- errorCount += 1
- errorDict = {'UID': eInfo[2], 'error_msg': u'error message: The UserID {0} does not exist!'.format(eInfo[0])}
- error_list.append(errorDict)
- continue
- try:
- tupleInfo = Device_Info.objects.get_or_create(userID_id=eInfo[0],
- NickName=eInfo[1],
- UID=eInfo[2], SID=eInfo[3],
- View_Account=eInfo[4],
- View_Password=eInfo[5],
- AudioFormat=eInfo[6],
- EventNotification=eInfo[7],
- ChannelIndex=eInfo[8],
- Online=eInfo[9],
- mMonitorIndex=eInfo[10],
- Type=eInfo[11],
- DebugMode=eInfo[12],
- NotificationMode=eInfo[13],
- qvgaLevel=eInfo[14],
- defaults={'id': CommonService.getUserID(getUser=False)})
- except Exception as e:
- errorCount += 1
- errorInfo = traceback.format_exc()
- print('error message: %s' % errorInfo)
- errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
- error_list.append(errorDict)
- continue
- else:
- if tupleInfo[1] == True:
- addCount += 1
- else:
- errorCount += 1
- if len(error_list) > 0:
- error_msg['error'] = error_list
- xlsData.release_resources()
- if xlsData:
- del xlsData
- resultDict = { "result_code": 0, "reason": u'Success'}
- if errorCount > 0:
- if len(error_msg) > 0:
- if sheetsCount > 1:
- resultDict.update({
- "result": {'appending': addCount, 'errorCount': errorCount, 'error_msg': error_msg,
- 'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
- "error_code": 704
- })
- else:
- resultDict.update({
- "result": {'appending': addCount, 'errorCount': errorCount, 'error_msg': error_msg},
- "error_code": 705
- })
- errorJSON = json.dumps(resultDict, ensure_ascii=False)
- return errorJSON
- else:
- if sheetsCount > 1:
- resultDict.update({
- "result": {'appending': addCount, 'appended': errorCount,
- 'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
- "error_code": 704,
- })
- else:
- resultDict.update({
- "result": {'appending': addCount, 'appended': errorCount},
- "error_code": 705,
- })
- errorJSON = json.dumps(resultDict, ensure_ascii=False)
- return errorJSON
- else:
- if sheetsCount > 1:
- resultDict.update({
- "result": {'appending': addCount,
- 'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
- "error_code": 704,
- })
- else:
- resultDict.update({
- "result": {'appending': addCount},
- "error_code": 0,
- })
- JSON = json.dumps(resultDict, ensure_ascii=False)
- return JSON
- def batchAddEquipmentfromExecl2(self, filePath):
- '''
- :param filePath:
- :return:
- :remarks: 不支持旧版xls
- '''
- #filePath = 'D:/2.xlsx'
- try:
- wb = load_workbook(filename = filePath)
- ws = wb.get_sheet_names()
- ws = wb.get_sheet_by_name(ws[0])
- rows = ws.iter_rows()
- #cols = ws.iter_cols()
- #rows = ws.rows # 行数
- #columns = ws.columns # 列数
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('error message: %s' % errorInfo)
- return ResponseFormal(702,repr(e))
- error_list = []
- error_msg = {}
- equipmentlists = []
- errorCount = addCount = 0
- for row in rows:
- eInfo = []
- for cell in row:
- #print(cell.coordinate, cell.value)
- if cell.value == None:
- cell.value = ''
- eInfo.append(cell.value)
- try:
- User = Device_User.objects.filter(userID = eInfo[0])
- except Exception as e:
- errorCount += 1
- errorInfo = traceback.format_exc()
- print('error message: %s' % errorInfo)
- errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
- error_list.append(errorDict)
- continue
- if not User:
- errorCount += 1
- errorDict = {'UID': eInfo[2],
- 'error_msg': u'error message: The UserID {0} does not exist!'.format(eInfo[0])}
- error_list.append(errorDict)
- continue
- eqValid = Device_Info.objects.filter(userID_id = eInfo[0], UID=eInfo[2])
- if eqValid:
- errorCount += 1
- errorDict = {'UID': eInfo[2], 'error_msg': u'The UID has already existed!'}
- error_list.append(errorDict)
- continue
- equipment = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=eInfo[0],
- NickName=eInfo[1], UID=eInfo[2], SID=eInfo[3],
- View_Account=eInfo[4], View_Password=eInfo[5],
- AudioFormat=eInfo[6], EventNotification=eInfo[7],
- ChannelIndex=eInfo[8], Online=eInfo[9], mMonitorIndex=eInfo[10],
- Type=eInfo[11], DebugMode=eInfo[12], NotificationMode=eInfo[13],
- qvgaLevel=eInfo[14], )
- equipmentlists.append(equipment)
- try:
- elists = Device_Info.objects.bulk_create(equipmentlists)
- except Exception as e:
- errorCount += 1
- errorInfo = traceback.format_exc()
- print('error message: %s' % errorInfo)
- errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
- error_list.append(errorDict)
- else:
- if len(equipmentlists) != len(elists):
- addCount += len(elists)
- errorCount += (len(equipmentlists) - len(elists))
- else:
- addCount += len(elists)
- if len(error_list) > 0:
- error_msg['error'] = error_list
- if errorCount == 0:
- return ResponseFormal(0, {
- 'appending': addCount
- })
- else:
- return ResponseFormal(0, {
- 'appending': addCount,
- 'errorCount': errorCount,
- 'error_msg': error_msg,
- })
- def batchAddEquipmentfromTXT(self, filePath):
- '''
- txt文件批量导入数据库,通过list方式
- :param filePath:
- :return:
- '''
- if os.path.isfile(filePath):
- file = open(filePath, encoding='utf-8')
- eInfo = []
- error_list = []
- error_msg = errorDict = {}
- errorCount = addCount = 0
- for line in file:
- eInfo = line.split(';')
- for index in range(len(eInfo)):
- if index > 5:
- eInfo[index] = int(eInfo[index])
- else:
- continue
- dUser = Device_User.objects.filter(userID = eInfo[0])
- if not dUser:
- errorCount += 1
- errorDict = {"userID": eInfo[0], "error_msg'": u"The userID_id is no exist!"}
- error_list.append(errorDict)
- continue
- try:
- tupleInfo = Device_Info.objects.get_or_create(userID_id=eInfo[0], NickName=eInfo[1],
- UID=eInfo[2], SID=eInfo[3], View_Account=eInfo[4],
- View_Password=eInfo[5], AudioFormat=eInfo[6],
- EventNotification=eInfo[7], ChannelIndex=eInfo[8],
- Online=eInfo[9], mMonitorIndex=eInfo[10],
- Type=eInfo[11], DebugMode=eInfo[12],
- NotificationMode=eInfo[13], qvgaLevel=eInfo[14],
- defaults={'id': CommonService.getUserID(getUser=False)})
- except Exception as e:
- errorCount += 1
- errorInfo = traceback.format_exc()
- print('error message: %s' % errorInfo)
- errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
- error_list.append(errorDict)
- continue
- else:
- if tupleInfo[1] == True:
- addCount += 1
- else:
- errorDict = {'UID': eInfo[2], 'error_msg': u'The UID is existed!'}
- error_list.append(errorDict)
- errorCount += 1
- file.close()
- if len(error_list) > 0:
- error_msg['error'] = error_list
- if errorCount > 0:
- if len(error_msg) > 0:
- return ResponseFormal(0, {
- 'appending': addCount,
- 'errorCount': errorCount,
- 'error_msg': error_msg,
- })
- else:
- return ResponseFormal(0, {'appending': addCount,'appended': errorCount,})
- else:
- return ResponseFormal(0,{'appending': addCount})
- else:
- return ResponseFormal(701)
- def batchAddEquipmentfromTXTDict(self, filePath):
- if os.path.isfile(filePath):
- file = open(filePath, encoding='utf-8')
- error_list = []
- error_msg = {}
- errorCount = addCount = 0
- equipmentList = []
- equipmentDict = {}
- try:
- for line in file:
- equipmentStr = eval(line)
- if isinstance(eval(equipmentStr), dict):
- equipmentDict.update(eval(equipmentStr))
- else:
- return ResponseFormal(706)
- UID = equipmentDict.get('UID', None)
- userID_id = equipmentDict.get('userID_id', None)
- dUser = Device_User.objects.filter(userID = userID_id)
- if dUser:
- if UID != None and userID_id != None:
- dInfo = Device_Info.objects.filter(userID_id = userID_id, UID = UID)
- if dInfo:
- errorCount += 1
- continue
- else:
- equipment = Device_Info(id = CommonService.getUserID(getUser=False), **equipmentDict)
- equipmentList.append(equipment)
- else:
- errorCount += 1
- errorDict = {'userID_id': userID_id, 'error_msg': u'The userID_id is None or UID is None!'}
- error_list.append(errorDict)
- continue
- else:
- errorCount += 1
- errorDict = {'userID_id': userID_id, 'error_msg': u'The userID_id is no exist!'}
- error_list.append(errorDict)
- continue
- file.close()
- sss = Device_Info.objects.bulk_create(equipmentList)
- print(type(sss), sss)
- except Exception as e:
- errorInfo = traceback.format_exc()
- print('The error Info: %s' % errorInfo)
- return ResponseFormal(707,{'details':repr(e)})
- else:
- if len(error_list) > 0:
- error_msg['error'] = error_list
- if errorCount > 0:
- if error_msg != None:
- return ResponseFormal(0, {'errorCount': errorCount,
- 'error': error_msg,
- 'appending': len(equipmentList)})
- else:
- return ResponseFormal(0, { 'errorCount': errorCount,
- 'appending': len(equipmentList)})
- else:
- return ResponseFormal(0,{'appending':len(equipmentList)})
- else:
- return ResponseFormal(701)
|