From: Brandon King Date: Thu, 18 Oct 2007 19:22:00 +0000 (+0000) Subject: [project @ Eland Config Saver + FlowCell Tracker DB update] X-Git-Tag: 0.1.0~84 X-Git-Url: http://woldlab.caltech.edu/gitweb/?a=commitdiff_plain;h=4a105c205cfd5f08327466a9a2cc9381d1e5e410;p=htsworkflow.git [project @ Eland Config Saver + FlowCell Tracker DB update] * 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/ --- diff --git a/elandifier/eland_config/urls.py b/elandifier/eland_config/urls.py index e6bda81..7b20237 100644 --- a/elandifier/eland_config/urls.py +++ b/elandifier/eland_config/urls.py @@ -2,6 +2,9 @@ from django.conf.urls.defaults import * urlpatterns = patterns('', # Example: - (r'', 'elandifier.eland_config.views.index'), + + (r'^config/(?PFC\d+)/$', 'elandifier.eland_config.views.config'), + (r'^config/$', 'elandifier.eland_config.views.config'), + (r'^$', 'elandifier.eland_config.views.index') ) diff --git a/elandifier/eland_config/views.py b/elandifier/eland_config/views.py index 6af3632..dc8e2c9 100644 --- a/elandifier/eland_config/views.py +++ b/elandifier/eland_config/views.py @@ -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 = [ '%s' % (fc_name, fc_name) for fc_name in fc_list ] + return HttpResponse('
'.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 index 0000000..e69de29 diff --git a/elandifier/fctracker/models.py b/elandifier/fctracker/models.py new file mode 100644 index 0000000..71b4944 --- /dev/null +++ b/elandifier/fctracker/models.py @@ -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 index 0000000..60f00ef --- /dev/null +++ b/elandifier/fctracker/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/elandifier/settings.py b/elandifier/settings.py index 5aebce5..860699a 100644 --- a/elandifier/settings.py +++ b/elandifier/settings.py @@ -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') +