With 1.6 boolean field changed to default Null, so to be backwards compatible set...
[htsworkflow.git] / htsworkflow / frontend / samples / models.py
index d1ab6607e775562370838069031f8400a5659593..d7c70c239c037db3dd4fc77a8c67cc9cb5cb1678 100644 (file)
@@ -1,3 +1,4 @@
+import types
 import logging
 import urlparse
 from django.db import models
@@ -128,7 +129,7 @@ class Affiliation(models.Model):
 
 class LibraryType(models.Model):
   name = models.CharField(max_length=255, unique=True,
-                          name="Adapter Type")
+                          verbose_name="Adapter Type")
   is_paired_end = models.BooleanField(default=True,
                     help_text="can you do a paired end run with this adapter")
   can_multiplex = models.BooleanField(default=True,
@@ -144,17 +145,18 @@ class LibraryType(models.Model):
 class MultiplexIndex(models.Model):
     """Map adapter types to the multiplex sequence"""
     adapter_type = models.ForeignKey(LibraryType)
-    multiplex_id = models.CharField(max_length=3, null=False)
+    multiplex_id = models.CharField(max_length=6, null=False)
     sequence = models.CharField(max_length=12, blank=True, null=True)
 
     class Meta:
+        verbose_name_plural = "multiplex indicies"
         unique_together = ('adapter_type', 'multiplex_id')
 
 class Library(models.Model):
   id = models.CharField(max_length=10, primary_key=True)
   library_name = models.CharField(max_length=100, unique=True)
   library_species = models.ForeignKey(Species)
-  hidden = models.BooleanField()
+  hidden = models.BooleanField(default=False)
   account_number = models.CharField(max_length=100, null=True, blank=True)
   cell_line = models.ForeignKey(Cellline, blank=True, null=True,
                                 verbose_name="Background")
@@ -164,7 +166,7 @@ class Library(models.Model):
       Affiliation,related_name='library_affiliations',null=True)
   tags = models.ManyToManyField(Tag,related_name='library_tags',
                                 blank=True,null=True)
-  REPLICATE_NUM = ((1,1),(2,2),(3,3),(4,4))
+  REPLICATE_NUM = [(x,x) for x in range(1,7)]
   replicate =  models.PositiveSmallIntegerField(choices=REPLICATE_NUM,
                                                 blank=True,null=True)
   experiment_type = models.ForeignKey(ExperimentType)
@@ -205,7 +207,7 @@ class Library(models.Model):
       # note \u00b5 is the micro symbol in unicode
   successful_pM = models.DecimalField(max_digits=9,
                                       decimal_places=1, blank=True, null=True)
-  ten_nM_dilution = models.BooleanField()
+  ten_nM_dilution = models.BooleanField(default=False)
   gel_cut_size = models.IntegerField(default=225, blank=True, null=True)
   insert_size = models.IntegerField(blank=True, null=True)
   notes = models.TextField(blank=True)
@@ -244,20 +246,43 @@ class Library(models.Model):
       if self.multiplex_id is None or len(self.multiplex_id) == 0:
           return 'Err: id empty'
       sequences = {}
-      multiplex_ids = self.multiplex_id.split(',')
-      for multiplex_id in multiplex_ids:
-          try:
-              multiplex = MultiplexIndex.objects.get(
-                  adapter_type = self.library_type.id,
-                  multiplex_id = multiplex_id)
-              sequences[multiplex_id] = multiplex.sequence
-          except MultiplexIndex.DoesNotExist, e:
-              sequences[multiplex_id] = 'Err: index not found'
+      multiplex_expressions = self.multiplex_id.split(',')
+      for multiplex_term in multiplex_expressions:
+          pairs = multiplex_term.split('-')
+          if len(pairs) == 1:
+              key = pairs[0]
+              seq = self._lookup_index(pairs[0])
+          elif len(pairs) == 2:
+              key = pairs[0] + '-' + pairs[1]
+              seq0 = self._lookup_index(pairs[0])
+              seq1 = self._lookup_index(pairs[1])
+              if seq0 is None or seq1 is None:
+                  seq = None
+              else:
+                  seq = seq0 + '-' + seq1
+          else:
+              raise RuntimeError("Too many - seperated sequences")
+          if seq is None:
+              seq = 'Err: index not found'
+          sequences[key] = seq
       return sequences
 
+  def _lookup_index(self, multiplex_id):
+      try:
+          multiplex = MultiplexIndex.objects.get(
+              adapter_type = self.library_type.id,
+              multiplex_id = multiplex_id)
+          return multiplex.sequence
+      except MultiplexIndex.DoesNotExist, e:
+          return None
+
   def index_sequence_text(self, seperator=' '):
       """Return formatted multiplex index sequences"""
       sequences = self.index_sequences()
+      if sequences is None:
+          return ""
+      if type(sequences) in types.StringTypes:
+          return sequences
       multiplex_ids = sequences.keys()
       multiplex_ids.sort()
       return seperator.join(( "%s:%s" %(i,sequences[i]) for i in multiplex_ids))