from django.http import HttpResponse
from django.shortcuts import render_to_response
from elandifier.eland_config import forms
+from elandifier import settings
+from elandifier.fctracker import models
import os
+import glob
# Create your views here.
# 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 = []
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:")
return '\n'.join(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*')) ]
+ #Convert FC* list to html links
+ fc_html = [ '<a href="/elandifier/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.
+ file_path = os.path.join(settings.UPLOADTO_CONFIG_FILE, flowcell)
+
+ if not os.path.isfile(file_path):
+ return HttpResponse("Hmm, config file for %s does not seem to exist. Maybe I don't exist either?" % (flowcell))
+
+ f = open(file_path, 'r')
+ cfg = f.read()
+ f.close()
+
+ 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)
- return HttpResponse(cfg, mimetype="text/plain")
+ #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 })
--- /dev/null
+from django.db import models
+from elandifier import settings
+
+# Create your models here.
+
+
+class Specie(models.Model):
+
+ class Admin: pass
+
+ scientific_name = models.CharField(maxlength=256, unique=True, db_index=True)
+
+
+ def __str__(self):
+ return self.scientific_name
+
+#class BedFilePack(models.Model):
+
+
+
+class FlowCell(models.Model):
+
+ class Admin: pass
+
+ flowcell_id = models.CharField(maxlength=20, unique=True, db_index=True)
+
+ run_date = models.DateTimeField()
+
+ lane1_sample = models.CharField(maxlength=500)
+ lane1_species = models.ForeignKey(Specie, related_name="lane1_species")
+ lane2_sample = models.CharField(maxlength=500)
+ lane2_species = models.ForeignKey(Specie, related_name="lane2_species")
+ lane3_sample = models.CharField(maxlength=500)
+ lane3_species = models.ForeignKey(Specie, related_name="lane3_species")
+ lane4_sample = models.CharField(maxlength=500)
+ lane4_species = models.ForeignKey(Specie, related_name="lane4_species")
+
+ lane5_sample = models.CharField(maxlength=500)
+ lane5_species = models.ForeignKey(Specie, related_name="lane5_species")
+ lane6_sample = models.CharField(maxlength=500)
+ lane6_species = models.ForeignKey(Specie, related_name="lane6_species")
+ lane7_sample = models.CharField(maxlength=500)
+ lane7_species = models.ForeignKey(Specie, related_name="lane7_species")
+ lane8_sample = models.CharField(maxlength=500)
+ lane8_species = models.ForeignKey(Specie, related_name="lane8_species")
+
+ notes = models.TextField(blank=True)
+
+ def __str__(self):
+ return self.flowcell_id
+
+
+class ElandResult(models.Model):
+
+ class Admin: pass
+
+ flow_cell = models.ForeignKey(FlowCell)
+ config_file = models.FileField(upload_to=settings.UPLOADTO_CONFIG_FILE)
+ eland_result_pack = models.FileField(upload_to=settings.UPLOADTO_ELAND_RESULT_PACKS)
+ bed_file_pack = models.FileField(upload_to=settings.UPLOADTO_BED_PACKS)
+
+ notes = models.TextField(blank=True)
+import os
+
# Django settings for elandifier project.
DEBUG = True
MANAGERS = ADMINS
DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
-DATABASE_NAME = '/home/king/proj/solexa/elandifier/ifier.db' # Or path to database file if using sqlite3.
+DATABASE_NAME = '/home/king/proj/solexa/elandifier/elandifier.db' # Or path to database file if using sqlite3.
DATABASE_USER = '' # Not used with sqlite3.
DATABASE_PASSWORD = '' # Not used with sqlite3.
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
- 'elandifier.eland_config'
+ 'elandifier.eland_config',
+ 'elandifier.fctracker'
)
+
+# Project specific settings
+UPLOADTO_HOME = '/home/king/proj/solexa/elandifier/uploads'
+UPLOADTO_CONFIG_FILE = os.path.join(UPLOADTO_HOME, 'eland_config')
+UPLOADTO_ELAND_RESULT_PACKS = os.path.join(UPLOADTO_HOME, 'eland_results')
+UPLOADTO_BED_PACKS = os.path.join(UPLOADTO_HOME, 'bed_packs')
+