def convertFiles(uploadedFiles, fileType , toFormat, convertFileSaveLoc): ''' Helper method to call convertTo module for invariant and graph format conversion @param uploadedFiles: array with all file names of uploaded files @param fileType @param toFormat - @param convertFileSaveLoc - @return isCorrectFileFormat - check if at least one file has the correct format @return isCorrectFileType - check if file type is legal ''' isCorrectFileFormat = False # Guilty until proven innocent isCorrectFileType = False # Guilty until proven innocent for file_fn in uploadedFiles: # determine type of the file if (os.path.splitext(file_fn)[1] in ['.mat','.csv','.npy']): isCorrectFileFormat = True if (fileType == 'fg' or fileType == 'fibergraph'): isCorrectFileType = True pass # TODO : DM elif( fileType == 'lcc' or fileType == 'lrgstConnComp'): isCorrectFileType = True pass # TODO : DM elif (fileType in settings.VALID_FILE_TYPES.keys() or fileType in settings.VALID_FILE_TYPES.values()): isCorrectFileType = True # Check if file format is the same as the toFormat if (os.path.splitext(file_fn)[1] in toFormat): toFormat.remove(os.path.splitext(file_fn)[1]) if (len(toFormat) == 0): pass # No work to be done here else: convertTo.convertAndSave(file_fn, toFormat, convertFileSaveLoc, fileType) # toFormat is a list return isCorrectFileFormat, isCorrectFileType
def asyncInvCompute(request): for graph_fn in request.session['uploaded_graphs']: lcc_fn = os.path.join(os.path.dirname(graph_fn), (os.path.basename(graph_fn).split('_')[0]+ '_concomp.npy')) try: invariant_fns = runInvariants(request.session['invariants'], graph_fn, request.session['graphInvariants'], lcc_fn, request.session['graphsize']) except: msg = "Hello,\n\nYour most recent job failed possibly because:%s\n" % (" "*randint(0,10)) if not os.path.exists(lcc_fn): msg += "- the lcc file %s does not exists\n" % os.path.basename(lcc_fn) msg += "- the graph you uploaded does not match any accepted type %s\n\n" % (" "*randint(0,10)) msg += "Please check these and try again. %s\n\n" % (" "*randint(0,10)) sendJobFailureEmail(request.session['email'], msg) print 'Invariants for annoymous project %s complete...' % graph_fn # TODO: Make function for this. Duplicate of buildgraph code for fileFormat in request.session['invConvertToFormats'] : # Conversion of all files for inv in invariant_fns.keys(): if isinstance(invariant_fns[inv], list): # Case of eigs for fn in invariant_fns[inv]: convertTo.convertAndSave(fn, fileFormat, os.path.dirname(fn), inv) else: # case of all other invariants convertTo.convertAndSave(invariant_fns[inv], fileFormat, \ os.path.dirname(invariant_fns[inv]), inv) # Email user of job finished sendJobCompleteEmail(request.session['email'], "http://mrbrain.cs.jhu.edu"+ request.session['dataDir'].replace(' ','%20'))
def confirmDownload(request): if request.method == 'POST': form = DownloadForm(request.POST) # instantiating form if form.is_valid(): invConvertToFormats = form.cleaned_data[ 'Select_Invariant_conversion_format'] # Which form to convert to grConvertToFormats = form.cleaned_data[ 'Select_Graph_conversion_format'] dataReturn = form.cleaned_data['Select_output_type'] for fileFormat in invConvertToFormats: if fileFormat == '.mat': convertTo.convertLCCNpyToMat(request.session['lccfn']) convertTo.convertSVDNpyToMat(request.session['SVDfn']) # Conversion of all files for inv in request.session['invariant_fns'].keys(): if isinstance(request.session['invariant_fns'][inv], list): # Case of eigs for fn in request.session['invariant_fns'][inv]: convertTo.convertAndSave(fn, fileFormat, getDirFromFilename(fn), inv) # TODO replace getDirFromFilename with os.path.dirname else: # case of all other invariants convertTo.convertAndSave(request.session['invariant_fns'][inv], fileFormat, \ getDirFromFilename(request.session['invariant_fns'][inv]) , inv) # TODO replace getDirFromFilename with os.path.dirname for fileFormat in grConvertToFormats: if request.session['graphsize'] == 'big': convertTo.convertGraph(request.session['bgGrfn'], fileFormat) elif request.session['graphsize'] == 'small': convertTo.convertGraph(request.session['smGrfn'], fileFormat) if dataReturn == 'vd': # View data directory dataUrlTail = request.session['usrDefProjDir'] # baseurl = request.META['HTTP_HOST'] # host = request.META['wsgi.url_scheme'] # rooturl = host + '://' + baseurl # Originally was: 'http://mrbrain.cs.jhu.edu' # Done for http & https return HttpResponseRedirect('http://mrbrain.cs.jhu.edu' + dataUrlTail.replace(' ', '%20')) elif dataReturn == 'dz': #Download all as zip return HttpResponseRedirect(get_script_prefix() + 'zipoutput') else: form = DownloadForm() return render_to_response('confirmDownload.html',{'downloadForm': form},\ context_instance=RequestContext(request))
def confirmDownload(request): if request.method == 'POST': form = DownloadForm(request.POST) # instantiating form if form.is_valid(): invConvertToFormats = form.cleaned_data['Select_Invariant_conversion_format'] # Which form to convert to grConvertToFormats = form.cleaned_data['Select_Graph_conversion_format'] dataReturn = form.cleaned_data['Select_output_type'] for fileFormat in invConvertToFormats: if fileFormat == '.mat': convertTo.convertLCCNpyToMat(request.session['lccfn']) convertTo.convertSVDNpyToMat(request.session['SVDfn']) # Conversion of all files for inv in request.session['invariant_fns'].keys(): if isinstance(request.session['invariant_fns'][inv], list): # Case of eigs for fn in request.session['invariant_fns'][inv]: convertTo.convertAndSave(fn, fileFormat, getDirFromFilename(fn), inv) # TODO replace getDirFromFilename with os.path.dirname else: # case of all other invariants convertTo.convertAndSave(request.session['invariant_fns'][inv], fileFormat, \ getDirFromFilename(request.session['invariant_fns'][inv]) , inv) # TODO replace getDirFromFilename with os.path.dirname for fileFormat in grConvertToFormats: if request.session['graphsize'] == 'big': convertTo.convertGraph(request.session['bgGrfn'], fileFormat) elif request.session['graphsize'] == 'small': convertTo.convertGraph(request.session['smGrfn'], fileFormat) if dataReturn == 'vd': # View data directory dataUrlTail = request.session['usrDefProjDir'] # baseurl = request.META['HTTP_HOST'] # host = request.META['wsgi.url_scheme'] # rooturl = host + '://' + baseurl # Originally was: 'http://mrbrain.cs.jhu.edu' # Done for http & https return HttpResponseRedirect('http://mrbrain.cs.jhu.edu' + dataUrlTail.replace(' ','%20')) elif dataReturn == 'dz': #Download all as zip return HttpResponseRedirect(get_script_prefix()+'zipoutput') else: form = DownloadForm() return render_to_response('confirmDownload.html',{'downloadForm': form},\ context_instance=RequestContext(request))
def graphLoadInv(request, webargs=None): ''' Form ''' from glob import glob # Move if request.method == 'POST' and not webargs: form = GraphUploadForm(request.POST, request.FILES) # instantiating form if form.is_valid(): request.session['graphsize'] = form.cleaned_data['Select_graph_size'] request.session['graphsize'] = 'small' if not request.session['graphsize'] else request.session['graphsize'] data = form.files['fileObj'] # get data request.session['invariants'] = form.cleaned_data['Select_Invariants_you_want_computed'] dataDir = os.path.join(settings.MEDIA_ROOT, 'tmp', strftime("projectStamp%a%d%b%Y_%H.%M.%S/", localtime())) request.session['graphInvariants'] = os.path.join(dataDir, 'graphInvariants') makeDirIfNone([dataDir]) # We got a zip if os.path.splitext(data.name)[1] == '.zip': writeBodyToDisk(data.read(), dataDir) # Get all graphs in the directory graphs = glob(os.path.join(dataDir,'*_fiber.mat')) graphs.extend(glob(os.path.join(dataDir,'*_bggr.mat'))) graphs.extend(glob(os.path.join(dataDir,'*_smgr.mat'))) else: # View only accepts .mat & zip as regulated by template graphs = [os.path.join(dataDir, data.name)] saveFileToDisk(data, graphs[0]) request.session['uploaded_graphs'] = graphs request.session['invConvertToFormats'] = form.cleaned_data['Convert_result'] request.session['dataDir'] = dataDir if request.session['graphsize'] == 'big': # Launch thread for big graphs & email user request.session['email'] = form.cleaned_data['Email'] sendJobBeginEmail(request.session['email'], request.session['invariants'], genGraph=False) thr = threading.Thread(target=asyncInvCompute, args=(request,)) thr.start() #asyncInvCompute(request) request.session['success_msg'] = "Your job was successfully launched. You should receive an email when your " request.session['success_msg'] += "job begins and another one when it completes. The process may take ~3hrs if you selected to compute all invariants" return HttpResponseRedirect(get_script_prefix()+'success') else: for graph_fn in graphs: graph_fn = request.session['smGrfn'] = graph_fn lcc_fn = None invariant_fns = runInvariants(request.session['invariants'], graph_fn, request.session['graphInvariants'], lcc_fn, request.session['graphsize']) print 'Invariants for annoymous project %s complete...' % graph_fn invConvertToFormats = form.cleaned_data['Convert_result'] # TODO: Make function for this. Duplicate of buildgraph code for fileFormat in invConvertToFormats: # Conversion of all files for inv in invariant_fns.keys(): if isinstance(invariant_fns[inv], list): # Case of eigs for fn in invariant_fns[inv]: convertTo.convertAndSave(fn, fileFormat, os.path.dirname(fn), inv) else: # case of all other invariants convertTo.convertAndSave(invariant_fns[inv], fileFormat, \ os.path.dirname(invariant_fns[inv]), inv) return HttpResponseRedirect("http://mrbrain.cs.jhu.edu"+ dataDir.replace(' ','%20')) # All spaces are replaced with %20 for urls elif request.method == 'POST' and webargs: if (re.match(re.compile('(b|big)', re.IGNORECASE), webargs.split('/')[0])): request.session['graphsize'] = 'big' elif (re.match(re.compile('(s|small)', re.IGNORECASE), webargs.split('/')[0])): request.session['graphsize'] = 'small' else: return django.http.HttpResponseBadRequest("The graph size is required as a web argument") dataDir = os.path.join(settings.MEDIA_ROOT, 'tmp', strftime("projectStamp%a%d%b%Y_%H.%M.%S/", localtime())) makeDirIfNone([dataDir]) uploadedZip = writeBodyToDisk(request.body, dataDir)[0] zipper.unzip(uploadedZip, dataDir) # Unzip the zip os.remove(uploadedZip) # Delete the zip) request.session['invariants'] = webargs.split('/')[1].split(',') graphs = glob(os.path.join(dataDir,'*_fiber.mat')) graphs.extend(glob(os.path.join(dataDir,'*_bggr.mat'))) graphs.extend(glob(os.path.join(dataDir,'*_smgr.mat'))) request.session['graphInvariants'] = os.path.join(dataDir, 'graphInvariants') for graph_fn in graphs: if request.session['graphsize'] == 'big': request.session['bgGrfn'] = graph_fn lcc_fn = graph_fn.split('_')[0] + '_concomp.mat' elif request.session['graphsize'] == 'small': request.session['smGrfn'] = graph_fn lcc_fn = None runInvariants(request.session['invariants'], graph_fn, request.session['graphInvariants'], lcc_fn, request.session['graphsize']) print 'Invariants for annoymous project %s complete...' % graph_fn # request.session.clear() dwnldLoc = "http://mrbrain.cs.jhu.edu"+ dataDir.replace(' ','%20') return HttpResponse("View Data at: " + dwnldLoc) else: form = GraphUploadForm() # An empty, unbound form # Render the form return render_to_response( 'graphupload.html', {'graphUploadForm': form}, context_instance=RequestContext(request) # Some failure to input data & returns a key signaling what is requested )