+from django.http import HttpResponse
+from django.shortcuts import render_to_response
+from django.core.exceptions import ObjectDoesNotExist
+
+from gaworkflow.frontend.eland_config import forms
+from gaworkflow.frontend import settings
+from gaworkflow.frontend.fctracker import models
+
+import os
+import glob
+# Create your views here.
+
+
+def _validate_input(data):
+ #if data.find('..') == -1 or data.find('/') == -1 or data.find('\\') == -1:
+ return data.replace('..', '').replace('/', '_').replace('\\', '_')
+
+#def contact(request):
+# if request.method == 'POST':
+# form = ContactForm(request.POST)
+# if form.is_valid():
+# # Do form processing here...
+# return HttpResponseRedirect('/url/on_success/')
+# else:
+# form = ContactForm()
+# return
+
+
+
+#def _saveConfigFile(form):
+# """
+# Given a valid form, save eland config to file based on flowcell number.
+# """
+# assert form.is_valid()
+#
+# clean_data = form.cleaned_data
+# flowcell = clean_data['flow_cell_number'].replace('/','_').replace('..', '__')
+#
+# file_path = os.path.join(settings.UPLOADTO_CONFIG_FILE, flowcell)
+#
+# f = open(file_path, 'w')
+# cfg = generateElandConfig(form)
+# f.write(cfg)
+# f.close()
+#
+#
+#def _saveToDb(form):
+# """
+# Save info to the database.
+# """
+# clean_data = form.cleaned_data
+#
+# fc_id = clean_data['flow_cell_number']
+#
+# try:
+# fc = models.FlowCell.objects.get(flowcell_id=fc_id)
+# except models.FlowCell.DoesNotExist:
+# fc = models.FlowCell()
+#
+# fc.flowcell_id = fc_id
+# fc.run_date = clean_data['run_date']
+#
+# #LANE 1
+# fc.lane1_sample = clean_data['lane1_description']
+# species_name = clean_data['lane1_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane1_species = specie
+#
+# #LANE 2
+# fc.lane2_sample = clean_data['lane2_description']
+# species_name = clean_data['lane2_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane2_species = specie
+#
+# #LANE 3
+# fc.lane3_sample = clean_data['lane3_description']
+# species_name = clean_data['lane3_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane3_species = specie
+#
+# #LANE 4
+# fc.lane4_sample = clean_data['lane4_description']
+# species_name = clean_data['lane4_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane4_species = specie
+#
+# #LANE 5
+# fc.lane5_sample = clean_data['lane5_description']
+# species_name = clean_data['lane5_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane5_species = specie
+#
+# #LANE 6
+# fc.lane6_sample = clean_data['lane6_description']
+# species_name = clean_data['lane6_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane6_species = specie
+#
+# #LANE 7
+# fc.lane7_sample = clean_data['lane7_description']
+# species_name = clean_data['lane7_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane7_species = specie
+#
+# #LANE 8
+# fc.lane8_sample = clean_data['lane8_description']
+# species_name = clean_data['lane8_species']
+# try:
+# specie = models.Specie.objects.get(scientific_name=species_name)
+# except models.Specie.DoesNotExist:
+# specie = models.Specie(scientific_name=species_name)
+# specie.save()
+# fc.lane8_species = specie
+#
+# fc.notes = clean_data['notes']
+#
+# fc.save()
+#
+# return fc
+#
+#
+#def generateElandConfig(form):
+# data = []
+#
+# form = form.cleaned_data
+#
+# BASE_DIR = '/data-store01/compbio/genomes'
+#
+# data.append("# FLOWCELL: %s" % (form['flow_cell_number']))
+# data.append("#")
+#
+# notes = form['notes'].replace('\r\n', '\n').replace('\r', '\n')
+# notes = notes.replace('\n', '\n# ')
+# data.append("# NOTES:")
+# data.append("# %s\n#" % (notes))
+#
+# #Convert all newline conventions to unix style
+# l1d = form['lane1_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l2d = form['lane2_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l3d = form['lane3_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l4d = form['lane4_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l5d = form['lane5_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l6d = form['lane6_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l7d = form['lane7_description'].replace('\r\n', '\n').replace('\r', '\n')
+# l8d = form['lane8_description'].replace('\r\n', '\n').replace('\r', '\n')
+#
+# # Turn new lines into indented commented newlines
+# l1d = l1d.replace('\n', '\n# ')
+# l2d = l2d.replace('\n', '\n# ')
+# l3d = l3d.replace('\n', '\n# ')
+# l4d = l4d.replace('\n', '\n# ')
+# l5d = l5d.replace('\n', '\n# ')
+# l6d = l6d.replace('\n', '\n# ')
+# l7d = l7d.replace('\n', '\n# ')
+# l8d = l8d.replace('\n', '\n# ')
+#
+# data.append("# Lane1: %s" % (l1d))
+# data.append("# Lane2: %s" % (l2d))
+# data.append("# Lane3: %s" % (l3d))
+# data.append("# Lane4: %s" % (l4d))
+# data.append("# Lane5: %s" % (l5d))
+# data.append("# Lane6: %s" % (l6d))
+# data.append("# Lane7: %s" % (l7d))
+# data.append("# Lane8: %s" % (l8d))
+#
+# #data.append("GENOME_DIR %s" % (BASE_DIR))
+# #data.append("CONTAM_DIR %s" % (BASE_DIR))
+# read_length = form['read_length']
+# data.append("READ_LENGTH %d" % (read_length))
+# #data.append("ELAND_REPEAT")
+# data.append("ELAND_MULTIPLE_INSTANCES 8")
+#
+# #Construct genome dictionary to figure out what lanes to put
+# # in the config file.
+# genome_dict = {}
+# l1s = form['lane1_species']
+# genome_dict.setdefault(l1s, []).append('1')
+# l2s = form['lane2_species']
+# genome_dict.setdefault(l2s, []).append('2')
+# l3s = form['lane3_species']
+# genome_dict.setdefault(l3s, []).append('3')
+# l4s = form['lane4_species']
+# genome_dict.setdefault(l4s, []).append('4')
+# l5s = form['lane5_species']
+# genome_dict.setdefault(l5s, []).append('5')
+# l6s = form['lane6_species']
+# genome_dict.setdefault(l6s, []).append('6')
+# l7s = form['lane7_species']
+# genome_dict.setdefault(l7s, []).append('7')
+# l8s = form['lane8_species']
+# genome_dict.setdefault(l8s, []).append('8')
+#
+# genome_list = genome_dict.keys()
+# genome_list.sort()
+#
+# #Loop through and create entries for each species.
+# for genome in genome_list:
+# lanes = ''.join(genome_dict[genome])
+# data.append('%s:ANALYSIS eland' % (lanes))
+# data.append('%s:READ_LENGTH %s' % (lanes, read_length))
+# data.append('%s:ELAND_GENOME %s' % (lanes, os.path.join(BASE_DIR, genome)))
+# data.append('%s:USE_BASES %s' % (lanes, 'Y'*int(read_length)))
+#
+# data.append('SEQUENCE_FORMAT --scarf')
+#
+# return '\n'.join(data)
+
+
+def getElandConfig(flowcell, regenerate=False):
+
+ file_path = os.path.join(settings.UPLOADTO_CONFIG_FILE, flowcell)
+
+ #If we are regenerating the config file, skip
+ # reading of existing file. If the file doesn't
+ # exist, try to generate it form the DB.
+ if not regenerate and os.path.isfile(file_path):
+ f = open(file_path, 'r')
+ data = f.read()
+ f.close()
+ return data
+
+ try:
+ fcObj = models.FlowCell.objects.get(flowcell_id=flowcell)
+ except ObjectDoesNotExist:
+ return None
+
+ data = []
+
+ #form = form.cleaned_data
+
+ BASE_DIR = '/data-store01/compbio/genomes'
+
+ data.append("# FLOWCELL: %s" % (fcObj.flowcell_id))
+ data.append("#")
+
+ notes = fcObj.notes.replace('\r\n', '\n').replace('\r', '\n')
+ notes = notes.replace('\n', '\n# ')
+ data.append("# NOTES:")
+ data.append("# %s\n#" % (notes))
+
+ #Convert all newline conventions to unix style
+ l1d = str(fcObj.lane_1_library.library_id) + '|' \
+ + fcObj.lane_1_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+ l2d = str(fcObj.lane_2_library.library_id) + '|' \
+ + fcObj.lane_2_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+ l3d = str(fcObj.lane_3_library.library_id) + '|' \
+ + fcObj.lane_3_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+ l4d = str(fcObj.lane_4_library.library_id) + '|' \
+ + fcObj.lane_4_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+
+ l5d = str(fcObj.lane_5_library.library_id) + '|' \
+ + fcObj.lane_5_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+ l6d = str(fcObj.lane_6_library.library_id) + '|' \
+ + fcObj.lane_6_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+ l7d = str(fcObj.lane_7_library.library_id) + '|' \
+ + fcObj.lane_7_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+ l8d = str(fcObj.lane_8_library.library_id) + '|' \
+ + fcObj.lane_8_library.library_name.replace('\r\n', '\n').replace('\r', '\n')
+
+ # Turn new lines into indented commented newlines
+ l1d = l1d.replace('\n', '\n# ')
+ l2d = l2d.replace('\n', '\n# ')
+ l3d = l3d.replace('\n', '\n# ')
+ l4d = l4d.replace('\n', '\n# ')
+ l5d = l5d.replace('\n', '\n# ')
+ l6d = l6d.replace('\n', '\n# ')
+ l7d = l7d.replace('\n', '\n# ')
+ l8d = l8d.replace('\n', '\n# ')
+
+ data.append("# Lane1: %s" % (l1d))
+ data.append("# Lane2: %s" % (l2d))
+ data.append("# Lane3: %s" % (l3d))
+ data.append("# Lane4: %s" % (l4d))
+ data.append("# Lane5: %s" % (l5d))
+ data.append("# Lane6: %s" % (l6d))
+ data.append("# Lane7: %s" % (l7d))
+ data.append("# Lane8: %s" % (l8d))
+
+ #data.append("GENOME_DIR %s" % (BASE_DIR))
+ #data.append("CONTAM_DIR %s" % (BASE_DIR))
+ read_length = fcObj.read_length
+ data.append("READ_LENGTH %d" % (read_length))
+ #data.append("ELAND_REPEAT")
+ data.append("ELAND_MULTIPLE_INSTANCES 8")
+
+ #Construct genome dictionary to figure out what lanes to put
+ # in the config file.
+ genome_dict = {}
+
+ #l1s = form['lane1_species']
+ l1s = fcObj.lane_1_library.library_species.scientific_name + '|' + \
+ fcObj.lane_1_library.library_species.use_genome_build
+ genome_dict.setdefault(l1s, []).append('1')
+ l2s = fcObj.lane_2_library.library_species.scientific_name + '|' + \
+ fcObj.lane_2_library.library_species.use_genome_build
+ genome_dict.setdefault(l2s, []).append('2')
+ l3s = fcObj.lane_3_library.library_species.scientific_name + '|' + \
+ fcObj.lane_3_library.library_species.use_genome_build
+ genome_dict.setdefault(l3s, []).append('3')
+ l4s = fcObj.lane_4_library.library_species.scientific_name + '|' + \
+ fcObj.lane_4_library.library_species.use_genome_build
+ genome_dict.setdefault(l4s, []).append('4')
+ l5s = fcObj.lane_5_library.library_species.scientific_name + '|' + \
+ fcObj.lane_5_library.library_species.use_genome_build
+ genome_dict.setdefault(l5s, []).append('5')
+ l6s = fcObj.lane_6_library.library_species.scientific_name + '|' + \
+ fcObj.lane_6_library.library_species.use_genome_build
+ genome_dict.setdefault(l6s, []).append('6')
+ l7s = fcObj.lane_7_library.library_species.scientific_name + '|' + \
+ fcObj.lane_7_library.library_species.use_genome_build
+ genome_dict.setdefault(l7s, []).append('7')
+ l8s = fcObj.lane_8_library.library_species.scientific_name + '|' + \
+ fcObj.lane_8_library.library_species.use_genome_build
+ genome_dict.setdefault(l8s, []).append('8')
+
+ genome_list = genome_dict.keys()
+ genome_list.sort()
+
+ #Loop through and create entries for each species.
+ for genome in genome_list:
+ lanes = ''.join(genome_dict[genome])
+ data.append('%s:ANALYSIS eland' % (lanes))
+ data.append('%s:READ_LENGTH %s' % (lanes, read_length))
+ data.append('%s:ELAND_GENOME %s' % (lanes, '%%(%s)s' % (genome)))
+ data.append('%s:USE_BASES %s' % (lanes, 'Y'*int(read_length)))
+
+ data.append('SEQUENCE_FORMAT --scarf')
+
+ data = '\n'.join(data)
+
+ f = open(file_path, 'w')
+ f.write(data)
+ f.close()
+
+ return data
+
+
+
+def config(request, flowcell=None):
+ """
+ Returns eland config file for a given flowcell number,
+ or returns a list of available flowcell numbers.
+ """
+
+ # Provide INDEX of available Flowcell config files.
+ if flowcell is None:
+ #Find all FC* config files and report an index html file
+ #fc_list = [ os.path.split(file_path)[1] for file_path in glob.glob(os.path.join(settings.UPLOADTO_CONFIG_FILE, 'FC*')) ]
+ fc_list = [ fc.flowcell_id for fc in models.FlowCell.objects.all() ]
+
+ #Convert FC* list to html links
+ fc_html = [ '<a href="/eland_config/%s/">%s</a>' % (fc_name, fc_name) for fc_name in fc_list ]
+
+ return HttpResponse('<br />'.join(fc_html))
+
+ #FIXME: Should validate flowcell input before using.
+ flowcell = _validate_input(flowcell)
+ cfg = getElandConfig(flowcell, regenerate=True)
+
+ if not cfg:
+ return HttpResponse("Hmm, config file for %s does not seem to exist." % (flowcell))
+
+
+ return HttpResponse(cfg, mimetype="text/plain")
+
+
+
+
+#def index(request):
+# """
+# Return a form for filling out information about the flowcell
+# """
+# if request.method == 'POST':
+# form = forms.ConfigForm(request.POST, error_class=forms.DivErrorList)
+# if form.is_valid():
+# #cfg = generateElandConfig(form)
+# _saveConfigFile(form)
+# _saveToDb(form)
+# return HttpResponse("Eland Config Saved!", mimetype="text/plain")
+# else:
+# return render_to_response('config_form.html', {'form': form })
+#
+# else:
+# fm = forms.ConfigForm(error_class=forms.DivErrorList)
+# return render_to_response('config_form.html', {'form': fm })