def cloneAR(self, ar): newar = _createObjectByType("AnalysisRequest", ar.aq_parent, tmpID()) newar.title = ar.title newar.description = ar.description newar.setContact(ar.getContact()) newar.setCCContact(ar.getCCContact()) newar.setCCEmails(ar.getCCEmails()) newar.setBatch(ar.getBatch()) newar.setTemplate(ar.getTemplate()) newar.setProfile(ar.getProfile()) newar.setSamplingDate(ar.getSamplingDate()) newar.setSampleType(ar.getSampleType()) newar.setSamplePoint(ar.getSamplePoint()) newar.setStorageLocation(ar.getStorageLocation()) newar.setSamplingDeviation(ar.getSamplingDeviation()) newar.setPriority(ar.getPriority()) newar.setSampleCondition(ar.getSampleCondition()) newar.setSample(ar.getSample()) newar.setClientOrderNumber(ar.getClientOrderNumber()) newar.setClientReference(ar.getClientReference()) newar.setClientSampleID(ar.getClientSampleID()) newar.setDefaultContainerType(ar.getDefaultContainerType()) newar.setAdHoc(ar.getAdHoc()) newar.setComposite(ar.getComposite()) newar.setReportDryMatter(ar.getReportDryMatter()) newar.setInvoiceExclude(ar.getInvoiceExclude()) newar.setAttachment(ar.getAttachment()) newar.setInvoice(ar.getInvoice()) newar.setDateReceived(ar.getDateReceived()) newar.setMemberDiscount(ar.getMemberDiscount()) # Set the results for each AR analysis ans = ar.getAnalyses(full_objects=True) for an in ans: nan = _createObjectByType("Analysis", newar, an.getKeyword()) nan.setService(an.getService()) nan.setCalculation(an.getCalculation()) nan.setInterimFields(an.getInterimFields()) nan.setResult(an.getResult()) nan.setResultDM(an.getResultDM()) nan.setRetested = False, nan.setMaxTimeAllowed(an.getMaxTimeAllowed()) nan.setDueDate(an.getDueDate()) nan.setDuration(an.getDuration()) nan.setReportDryMatter(an.getReportDryMatter()) nan.setAnalyst(an.getAnalyst()) nan.setInstrument(an.getInstrument()) nan.setSamplePartition(an.getSamplePartition()) nan.unmarkCreationFlag() notify(ObjectInitializedEvent(nan)) changeWorkflowState(nan, 'bika_analysis_workflow', 'to_be_verified') nan.reindexObject() newar.reindexObject() newar.aq_parent.reindexObject() renameAfterCreation(newar) newar.setRequestID(newar.getId()) if hasattr(ar, 'setChildAnalysisRequest'): ar.setChildAnalysisRequest(newar) newar.setParentAnalysisRequest(ar) return newar
def _import_file(self, importoption, csvfile, client_id): fullfilename = csvfile.filename fullfilename = fullfilename.split('/')[-1] filename = fullfilename.split('.')[0] log = [] r = self.portal_catalog(portal_type='Client', id=client_id) if len(r) == 0: #This is not a user input issue - client_id is added to template log.append(' Could not find Client %s' % client_id) return None, '\n'.join(log) client = r[0].getObject() updateable_states = ['sample_received', 'assigned'] reader = csv.reader(csvfile.readlines()) samples = [] sample_headers = None batch_headers = None batch_remarks = [] row_count = 0 for row in reader: row_count = row_count + 1 if not row: continue # a new batch starts if row_count == 1: if row[0] == 'Header': continue else: msg = '%s invalid batch header' % row transaction_note(msg) return None, msg elif row_count == 2: msg = None if row[1] != 'Import': msg = 'Invalid batch header - Import required in cell B2' transaction_note(msg) return None, msg entered_name = fullfilename.split('.')[0] if not row[2] or entered_name.lower() != row[2].lower(): msg = 'Filename, %s, does not match entered filename, %s' \ % (filename, row[2]) transaction_note(msg) return None, msg batch_headers = row[0:] arimport_id = tmpID() title = filename idx = 1 while title in [i.Title() for i in client.objectValues()]: title = '%s-%s' % (filename, idx) idx += 1 arimport = _createObjectByType("ARImport", client, arimport_id, title=title) arimport.unmarkCreationFlag() continue elif row_count == 3: sample_headers = row[10:] continue elif row_count in [4,5,6]: continue #otherwise add to list of sample samples.append(row) if not row_count: msg = 'Invalid batch header' transaction_note(msg) return None, msg pad = 8192*' ' request = self.request title = 'Importing file' bar = ProgressBar( self.context, self.request, title, description='') notify(InitialiseProgressBar(bar)) sample_count = len(samples) row_count = 0 for sample in samples: next_num = tmpID() row_count = row_count + 1 item_remarks = [] progress_index = float(row_count)/float(sample_count)*100.0 progress = ProgressState(self.request, progress_index) notify(UpdateProgressEvent(progress)) #TODO REmove for production - just to look pretty #time.sleep(1) analyses = [] for i in range(10, len(sample)): if sample[i] != '1': continue analyses.append(sample_headers[(i-10)]) if len(analyses) > 0: aritem_id = '%s_%s' %('aritem', (str(next_num))) aritem = _createObjectByType("ARImportItem", arimport, aritem_id) aritem.edit( SampleName=sample[0], ClientRef=batch_headers[10], ClientSid=sample[1], SampleDate=sample[2], SampleType = sample[3], PickingSlip = sample[4], ContainerType = sample[5], ReportDryMatter = sample[6], Priority = sample[7], ) aritem.setRemarks(item_remarks) if importoption == 'c': aritem.setAnalyses(analyses) elif importoption == 'p': aritem.setAnalysisProfile(analyses) cc_names_report = ','.join( [i.strip() for i in batch_headers[6].split(';')]) \ if (batch_headers and len(batch_headers) > 7) else "" cc_emails_report = ','.join( [i.strip() for i in batch_headers[7].split(';')]) \ if batch_headers and len(batch_headers) > 8 else "" cc_emails_invoice = ','.join( [i.strip() for i in batch_headers[8].split(';')]) \ if batch_headers and len(batch_headers) > 9 else "" try: numOfSamples = int(batch_headers[12]) except: numOfSamples = 0 arimport.edit( ImportOption=importoption, FileName=batch_headers[2], OriginalFile=csvfile, ClientTitle = batch_headers[3], ClientID = batch_headers[4], ContactID = batch_headers[5], CCNamesReport = cc_names_report, CCEmailsReport = cc_emails_report, CCEmailsInvoice = cc_emails_invoice, OrderID = batch_headers[9], QuoteID = batch_headers[10], SamplePoint = batch_headers[11], NumberSamples = numOfSamples, Remarks = batch_remarks, Analyses = sample_headers, DateImported=DateTime(), ) arimport._renameAfterCreation() valid = arimport.validateIt() return arimport, msg