def save_uploaded_plans_for_template(request): """add plans, with CSV validation""" logger.info(request) if request.method != 'POST': logger.exception(format_exc()) transaction.rollback() return HttpResponse(json.dumps({ "error": "Error, unsupported HTTP Request method (%s) for saving plan upload." % request.method }), mimetype="application/json") postedfile = request.FILES['postedfile'] destination = tempfile.NamedTemporaryFile(delete=False) for chunk in postedfile.chunks(): destination.write(chunk) postedfile.close() destination.close() #check to ensure it is not empty headerCheck = open(destination.name, "rU") firstCSV = [] for firstRow in csv.reader(headerCheck): firstCSV.append(firstRow) #logger.info("views.save_uploaded_plans_for_template() firstRow=%s;" %(firstRow)) headerCheck.close() if not firstRow: os.unlink(destination.name) transaction.rollback() return HttpResponse(json.dumps( {"status": "Error: batch planning file is empty"}), mimetype="text/html") index = 0 plans = [] rawPlanDataList = [] failed = {} file = open(destination.name, "rU") reader = csv.DictReader(file) for index, row in enumerate(reader, start=1): errorMsg, aPlanDict, rawPlanDict, isToSkipRow = validate_csv_plan(row) logger.info( "views.save_uploaded_plans_for_template() index=%d; errorMsg=%s; planDict=%s" % (index, errorMsg, rawPlanDict)) if errorMsg: logger.info( "views.save_uploaded_plans_for_template() ERROR MESSAGE index=%d; errorMsg=%s; planDict=%s" % (index, errorMsg, rawPlanDict)) failed[index] = errorMsg continue elif isToSkipRow: logger.info( "views.save_uploaded_plans_for_template() SKIPPED ROW index=%d; row=%s" % (index, row)) continue else: plans.append(aPlanDict) rawPlanDataList.append(rawPlanDict) destination.close() # now close and remove the temp file os.unlink(destination.name) if index == 0: transaction.rollback() return HttpResponse(json.dumps({ "status": "Error: There must be at least one plan! Please reload the page and try again with more plans." }), mimetype="text/html") if failed: r = { "status": "Plan validation failed. The plans have not been saved.", "failed": failed } logger.info("views.save_uploaded_plans_for_template() failed=%s" % (r)) transaction.rollback() return HttpResponse(json.dumps(r), mimetype="text/html") #saving to db needs to be the last thing to happen try: index = 0 for planFamily in plans: plan = planFamily['plan'] plan.save() expObj = planFamily['exp'] expObj.plan = plan expObj.expName = plan.planGUID expObj.unique = plan.planGUID expObj.displayname = plan.planGUID expObj.save() easObj = planFamily['eas'] easObj.experiment = expObj easObj.isEditable = True easObj.save() #saving/associating samples sampleDisplayedNames = planFamily['samples'] sampleNames = [ name.replace(' ', '_') for name in sampleDisplayedNames ] externalId = None for name, displayedName in zip(sampleNames, sampleDisplayedNames): sample_kwargs = { 'name': name, 'displayedName': displayedName, 'date': plan.date, 'status': plan.planStatus, 'externalId': externalId } sample = Sample.objects.get_or_create( name=name, externalId=externalId, defaults=sample_kwargs)[0] sample.experiments.add(expObj) sample.save() planDict = rawPlanDataList[index] # add QCtype thresholds qcTypes = QCType.objects.all() for qcType in qcTypes: qc_threshold = planDict.get(qcType.qcName, '') if qc_threshold: # get existing PlannedExperimentQC if any plannedExpQcs = PlannedExperimentQC.objects.filter( plannedExperiment=plan.id, qcType=qcType.id) if len(plannedExpQcs) > 0: for plannedExpQc in plannedExpQcs: plannedExpQc.threshold = qc_threshold plannedExpQc.save() else: kwargs = { 'plannedExperiment': plan, 'qcType': qcType, 'threshold': qc_threshold } plannedExpQc = PlannedExperimentQC(**kwargs) plannedExpQc.save() # add projects projectObjList = get_projects(request.user, planDict) for project in projectObjList: if project: plan.projects.add(project) index += 1 except: logger.exception(format_exc()) transaction.rollback() return HttpResponse(json.dumps( {"status": "Error saving plans to database!"}), mimetype="text/html") ##return HttpResponse(json.dumps({"error": "Internal error while trying to save the plan."}), mimetype="application/json") else: transaction.commit() r = { "status": "Plans Uploaded! The plans will be listed on the planned run page.", "failed": failed } return HttpResponse(json.dumps(r), mimetype="text/html")
def save_uploaded_plans_for_template(request): """add plans, with CSV validation""" logger.info(request) if request.method != 'POST': logger.exception(format_exc()) transaction.rollback() return HttpResponse(json.dumps({"error": "Error, unsupported HTTP Request method (%s) for saving plan upload." % request.method}), mimetype="application/json") postedfile = request.FILES['postedfile'] destination = tempfile.NamedTemporaryFile(delete=False) for chunk in postedfile.chunks(): destination.write(chunk) postedfile.close() destination.close() #check to ensure it is not empty headerCheck = open(destination.name, "rU") firstCSV = [] for firstRow in csv.reader(headerCheck): firstCSV.append(firstRow) #logger.info("views.save_uploaded_plans_for_template() firstRow=%s;" %(firstRow)) headerCheck.close() if not firstRow: os.unlink(destination.name) transaction.rollback() return HttpResponse(json.dumps({"status": "Error: batch planning file is empty"}), mimetype="text/html") index = 0 plans = [] rawPlanDataList = [] failed = {} file = open(destination.name, "rU") reader = csv.DictReader(file) for index, row in enumerate(reader, start=1): errorMsg, aPlanDict, rawPlanDict, isToSkipRow = validate_csv_plan(row) logger.info("views.save_uploaded_plans_for_template() index=%d; errorMsg=%s; planDict=%s" %(index, errorMsg, rawPlanDict)) if errorMsg: logger.info("views.save_uploaded_plans_for_template() ERROR MESSAGE index=%d; errorMsg=%s; planDict=%s" %(index, errorMsg, rawPlanDict)) failed[index] = errorMsg continue elif isToSkipRow: logger.info("views.save_uploaded_plans_for_template() SKIPPED ROW index=%d; row=%s" %(index, row)) continue else: plans.append(aPlanDict) rawPlanDataList.append(rawPlanDict) destination.close() # now close and remove the temp file os.unlink(destination.name) if index == 0: transaction.rollback() return HttpResponse(json.dumps({"status": "Error: There must be at least one plan! Please reload the page and try again with more plans."}), mimetype="text/html") if failed: r = {"status": "Plan validation failed. The plans have not been saved.", "failed": failed} logger.info("views.save_uploaded_plans_for_template() failed=%s" %(r)) transaction.rollback() return HttpResponse(json.dumps(r), mimetype="text/html") #saving to db needs to be the last thing to happen try: index = 0 for planFamily in plans: plan = planFamily['plan'] plan.save() expObj = planFamily['exp'] expObj.plan = plan expObj.expName = plan.planGUID expObj.unique = plan.planGUID expObj.displayname = plan.planGUID expObj.save() easObj = planFamily['eas'] easObj.experiment = expObj easObj.isEditable = True easObj.save() #saving/associating samples sampleDisplayedNames = planFamily['samples'] sampleNames = [name.replace(' ', '_') for name in sampleDisplayedNames] externalId = None for name, displayedName in zip(sampleNames, sampleDisplayedNames): sample_kwargs = { 'name' : name, 'displayedName' : displayedName, 'date' : plan.date, 'status' : plan.planStatus, 'externalId': externalId } sample = Sample.objects.get_or_create(name=name, externalId=externalId, defaults=sample_kwargs)[0] sample.experiments.add(expObj) sample.save() planDict = rawPlanDataList[index] # add QCtype thresholds qcTypes = QCType.objects.all() for qcType in qcTypes: qc_threshold = planDict.get(qcType.qcName, '') if qc_threshold: # get existing PlannedExperimentQC if any plannedExpQcs = PlannedExperimentQC.objects.filter(plannedExperiment=plan.id, qcType=qcType.id) if len(plannedExpQcs) > 0: for plannedExpQc in plannedExpQcs: plannedExpQc.threshold = qc_threshold plannedExpQc.save() else: kwargs = { 'plannedExperiment': plan, 'qcType': qcType, 'threshold': qc_threshold } plannedExpQc = PlannedExperimentQC(**kwargs) plannedExpQc.save() # add projects projectObjList = get_projects(request.user, planDict) for project in projectObjList: if project: plan.projects.add(project) index += 1 except: logger.exception(format_exc()) transaction.rollback() return HttpResponse(json.dumps({"status": "Error saving plans to database!"}), mimetype="text/html") ##return HttpResponse(json.dumps({"error": "Internal error while trying to save the plan."}), mimetype="application/json") else: transaction.commit() r = {"status": "Plans Uploaded! The plans will be listed on the planned run page.", "failed": failed} return HttpResponse(json.dumps(r), mimetype="text/html")