[project @ Eland Config Saver + FlowCell Tracker DB update]
authorBrandon King <kingb@caltech.edu>
Thu, 18 Oct 2007 19:22:00 +0000 (19:22 +0000)
committerBrandon King <kingb@caltech.edu>
Thu, 18 Oct 2007 19:22:00 +0000 (19:22 +0000)
 * Now saves a copy of eland config file for later retrieval.
   /elandifier/config/ <-- Index of available config files
   /elandifier/config/FC#####/ <-- Eland config for specific FC#
 * Save record of flow cell to database.
   * Form is also saved to database... which can be viewed
     in /admin/

elandifier/eland_config/urls.py
elandifier/eland_config/views.py
elandifier/fctracker/__init__.py [new file with mode: 0644]
elandifier/fctracker/models.py [new file with mode: 0644]
elandifier/fctracker/views.py [new file with mode: 0644]
elandifier/settings.py

index e6bda817451bf937f7f1693b857fe77e20ee2f6a..7b202375e5e0f3f24cb7a810c40aa53e2c00a00e 100644 (file)
@@ -2,6 +2,9 @@ from django.conf.urls.defaults import *
 
 urlpatterns = patterns('',
     # Example:
-    (r'', 'elandifier.eland_config.views.index'),
+    
+    (r'^config/(?P<flowcell>FC\d+)/$', 'elandifier.eland_config.views.config'),
+    (r'^config/$', 'elandifier.eland_config.views.config'),
+    (r'^$', 'elandifier.eland_config.views.index')
 
 )
index 6af3632fe17554f3317382f4da5a290df7ec372b..dc8e2c977dc7b72e7690c6a050ca8985dc7e40f1 100644 (file)
@@ -1,8 +1,11 @@
 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.
 
 
@@ -17,6 +20,127 @@ import os
 #    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 = []
   
@@ -24,6 +148,9 @@ def generateElandConfig(form):
   
   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:")
@@ -100,15 +227,46 @@ def generateElandConfig(form):
   
   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 })
   
diff --git a/elandifier/fctracker/__init__.py b/elandifier/fctracker/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/elandifier/fctracker/models.py b/elandifier/fctracker/models.py
new file mode 100644 (file)
index 0000000..71b4944
--- /dev/null
@@ -0,0 +1,62 @@
+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)
diff --git a/elandifier/fctracker/views.py b/elandifier/fctracker/views.py
new file mode 100644 (file)
index 0000000..60f00ef
--- /dev/null
@@ -0,0 +1 @@
+# Create your views here.
index 5aebce5edadce8423caf444e207e6d90ad58a60c..860699a835e7d4b1d71fb75ee1fd8954787f3abe 100644 (file)
@@ -1,3 +1,5 @@
+import os
+
 # Django settings for elandifier project.
 
 DEBUG = True
@@ -10,7 +12,7 @@ ADMINS = (
 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.
@@ -79,5 +81,13 @@ INSTALLED_APPS = (
     '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')
+