def insertTestsAccToProtocol(idres): """ Вставляет в результат пустые результаты испытаний, согласно протоколу @idres - айди результата """ resultt = bmr.getResultFromDatabase(idres) if resultt[0] == None: return 1, "Ошибка получения результата из БД idres=" + str(idres) result = resultt[0] protocolt = bck.getProtocolFromDatabaseParams(result.model, result.typeOfTest) if protocolt[0] == None: return 2, "Ошибка получения протокола из БД idres=" + protocolt[1] protocol = protocolt[0] for procedurekey in protocol.procedures: # для каждой процедуры из списка оных в протоколе if ( not procedurekey in result.proceduresResults.keys() ): # если процедура прописана в протоколе, но не имеется в результате protocolitem = protocol.procedures[procedurekey] # получаем описание процедуры в протоколе newrp = resultsOfProcedure() # создаём объект результата процедуры newrp.number = procedurekey # копируем номер newrp.hasPassedProcedure = False # устанавливаем флаг, успешна ли процедура newrp.values1 = dict() # объявляем значения словарём newrp.values_common = dict() # словарь название параметра-значение для общих величин # заполнение значений у общих величин for possibleres in protocolitem.listOfPossibleResultsCommon: newrp.values_common[possibleres] = 0 # заполнение значений у поканальных величин for channel in protocolitem.normal_values: # для каждого канала newrp.values1[channel] = dict() # объявляем словарём for possibleres in protocolitem.listOfPossibleResults: # и для каждого возможного результата newrp.values1[channel][possibleres] = 0 # впихиваем нулевое значение result.proceduresResults[procedurekey] = newrp # теперь вгоняем новый результат в процидурку return bmr.writeResultToDatabase(result, idres) # и пишем в базу!
reslist=list() for resid in residlist: res = bmr.getResultFromDatabase(resid) # Получить результат из базы данных if res[0]==None: errlog+="Ошибка: такого результата нет в базе данных" else: reslist.append(res[0]) if len(reslist)==0: #если список результатов пуст, это из-за всяких ошибок может быть closeAsError ("Список результатов пуст") for result in reslist: #проверяем список результатов на однородность, то есть все результаты должны быть от одного протокола if not result.model==reslist[0].model or not result.typeOfTest==reslist[0].typeOfTest: closeAsError ("Ошибка: в выборке присутствуют результаты от разных протоколов") prot = bck.getProtocolFromDatabaseParams (reslist[0].model, reslist[0].typeOfTest) if prot[0]==None: closeAsError("Ошибка: в базе данных нет протокола под такой результат") protocol=prot[0] if not protocol.dictOfReportFormParameters: closeAsError("Список возможных параметров отчётов у данного протокола совершенно пуст") htmg.out(list(protocol.dictOfReportFormParameters.keys()).__str__())
def process(): global watchfolder, putfolder #получить список файлов files = os.listdir(watchfolder) textfilter = lambda x: x.endswith('.TXT') or x.endswith('.txt') xmlfilter=lambda x: x.endswith('.XML') or x.endswith('.xml') #textfiles = list(filter(lambda x: x.endswith('.TXT') or x.endswith('.txt'), files)) report="[INFO] Process {0} {1}\n".format(watchfolder, putfolder) for name in files: #print (prs.parseToResult (watchfolder+name)) #отсылка к бакенду - добавление результата в базу данных report+=name + "\n" st = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S') rs=None,'Invalid file extension' if textfilter(name): rs=prs.basicParserTextFormFilename (watchfolder+name) elif xmlfilter (name): rs = xprs.parceXml(watchfolder+name) if rs[0]==None: report+="[ERROR] "+st+" Не удалось распарсить результат имя файла="+name+"\n"+"Потому что "+rs[1] continue #сперва попробуем перенести файл #Из теперь неизвестных соображений, сначала пытаемся перенести в другую папку, а потом записать в базу данных mvs=1 try: shutil.move(watchfolder+name, putfolder) except BaseException: log ("[ERROR]"+st+"Проблема при перемещении файла, возможно дублирование отчёта") print ("[ERROR]"+st+"Проблема при перемещении файла, возможно дублирование отчёта") mvs=0 if mvs: wr=bmr.writeResultToDatabase(rs[0]); if wr: report+="[ERROR] "+st+" При записи в БД произошла ошибка код="+str(wr)+"\n" else: report+="\t"+st+"Запись в БД произошла успешно "+name+"\n" #код поиска подходящего протокола, если не найдёт - то запишет и в протокол if bck.getProtocolFromDatabaseParams (rs[0].model, rs[0].typeOfTest)[0]==None: #если нет протокола такого в базе данных if textfilter (name): ap = prs.basicParserTextFormFilename (putfolder+name, type='protocol') elif xmlfilter (name): with open(putfolder+name, 'rt') as file: ap = xprs.parceXml(file,'prc') #распарсили протокол if ap[0] is not None: err=bck.writeProtocolToDatabase(ap[0], idprotocol=None) if err: log ("[ERROR]"+st+"Проблема при добавлении протокола в базу данных на этапе включения в БД {0}".format(err)) else: log ("[ERROR]"+st+"Проблема при добавлении протокола в базу данных на этапе парсинга {0}".format(ap[1])) log (report) print (report)
def outreportsgroup (residlist, form, name): """ residlist - список айди результатов form - дескриптор принятых параметрво формы name - имя набора парметров отчёта """ residlist.sort() res=str() err=str() errlog=str() reslist=list() for resid in residlist: res = bmr.getResultFromDatabase(resid) # Получить результат из базы данных if res[0]==None: errlog+="Ошибка: такого результата нет в базе данных" else: reslist.append(res[0]) if len(reslist)==0: #если список результатов пуст, это из-за всяких ошибок может быть return errlog for result in reslist: #проверяем список результатов на однородность, то есть все результаты должны быть от одного протокола if not result.model==reslist[0].model or not result.typeOfTest==reslist[0].typeOfTest: errlog+="Ошибка: в выборке присутствуют результаты от разных протоколов" return errlog prot = bck.getProtocolFromDatabaseParams (reslist[0].model, reslist[0].typeOfTest) if prot[0]==None: errlog+="Ошибка: в базе данных нет протокола под такой результат" return errlog protocol=prot[0] step=int(form.getfirst("field_step", "")) now = datetime.datetime.now() typeofthetest=form.getfirst("field_testtype", "") field_repformnumber = form.getfirst("field_repformnumber", "") res="<div align='center'> <p>ПРОТОКОЛ №{0} от {1}</p>".format (field_repformnumber, now.strftime("%Y-%m-%d")) #res="<div align='center'> <p>ПРОТОКОЛ № от "+now.strftime("%Y-%m-%d")+"</p> " res+="<p>"+typeofthetest+"</p>" res+="<p>"+result.model+"</p>" for i in range (0, len(reslist), step): outr=outreport(reslist[i:i+step], form, protocol, name) res+=outr[0]#+"<br style='page-break-after: always'> " res+=generateOneReportFooter (form, reslist) return res + err
def outEditFormForResult(result: AResult, id): """ Выводит форму отображения и редакции результата. в этой версии выводит вместе с данными из протокола, такими, как название и такое прочее """ protocolt = bck.getProtocolFromDatabaseParams(result.model, result.typeOfTest) if protocolt[0] == None: htmg.out( htmg.throwError( "FR_resultedit.py", "Ошибка при поиске протокола, соответствующего данному результату " + protocolt[1] ) ) return outEditFormForResultOld(result, id) protocol = protocolt[0] res = str() res += "<h1>Правка результата</h1>" # вывод справочной части st = "<b>{0}<b>: {1}<br/>\n" res += st.format("Модель", result.model) res += st.format("Вид теста", result.typeOfTest) res += st.format("Оператор", result.operator) res += st.format("Дата и время теста", result.testDateTime) res += st.format("Номер изделия", str(result.numOfProduct)) res += st.format("Номер партии", str(result.numOfBatch)) res += st.format("Прошёл ли тест", str(result.hasPassedTest)) # вывод таблицы результатов res += "<br/><br/>" res += "<form action='FR_resultedit.py?id={0}&saveid={1}' method='post'> <table border=1>\n".format( str(id), str(id) ) res += """ <tr> <th>Название испытания</th> <th>Режим испытания</th> <th>Нормы на испытание</th> <th>Пройдено ли испытание</th> <th>Результаты испытания</th> <th>Удаление</th> </tr>""" klist = list(result.proceduresResults.keys()) klist.sort() for key in klist: # for key, val in result.proceduresResults.items(): val = result.proceduresResults[key] res += "<tr>\n" interactive_form = outResultsOfProcedureForm(val, key) delbtn = ( " <input type='button' onclick=\"destroy('Вы уверенно хотите удалить данный результат?', 'FR_resultedit.py?id=" + str(id) + "&delid=" + str(key) + "' ) \" value='Удаление' >" ) res += """{0} <td> {1} </td> <td> {2} </td> <td> {3} </td> """.format( protocol.procedures[key].toHTML(0), outfilledformforpassed(key, val.hasPassedProcedure), interactive_form, delbtn, ) # {True: "Пройдено", False: "Не пройдено"}[val.hasPassedProcedure] res += "</tr>\n" res += "</table> <br/> <input type='submit' value='Сохранить'> </form>" res += "<a href='FR_resultedit.py?id={0}&magic={1}'> Добавить надостающие испытания в результат из протокола </a>".format( id, id ) return res