Initial port to python3
[htsworkflow.git] / htsworkflow / frontend / samples / models.py
index b81b122111332c1b695541cfba3cef058f822a61..b01b39312c13d543adbe431124a12b729306ec31 100644 (file)
@@ -1,5 +1,6 @@
+import types
 import logging
-import urlparse
+import urllib.parse
 from django.db import models
 from django.contrib.auth.models import User, UserManager
 from django.core import urlresolvers
@@ -26,7 +27,7 @@ class Antibody(models.Model):
     biology = models.TextField(blank=True, null=True)
     notes = models.TextField(blank=True, null=True)
     def __unicode__(self):
-        return u'%s - %s' % (self.antigene, self.antibodies)
+        return '%s - %s' % (self.antigene, self.antibodies)
     class Meta:
         verbose_name_plural = "antibodies"
         ordering = ["antigene"]
@@ -40,7 +41,7 @@ class Cellline(models.Model):
 
     notes = models.TextField(blank=True)
     def __unicode__(self):
-        return unicode(self.cellline_name)
+        return str(self.cellline_name)
 
     class Meta:
         ordering = ["cellline_name"]
@@ -56,7 +57,7 @@ class Condition(models.Model):
     notes = models.TextField(blank=True)
 
     def __unicode__(self):
-        return unicode(self.condition_name)
+        return str(self.condition_name)
 
     class Meta:
         ordering = ["condition_name"]
@@ -66,7 +67,7 @@ class ExperimentType(models.Model):
   name = models.CharField(max_length=50, unique=True)
 
   def __unicode__(self):
-    return unicode(self.name)
+    return str(self.name)
 
 class Tag(models.Model):
   tag_name = models.CharField(max_length=100, db_index=True,blank=False,null=False)
@@ -81,7 +82,7 @@ class Tag(models.Model):
       choices=TAG_CONTEXT, default='Library')
 
   def __unicode__(self):
-    return u'%s' % (self.tag_name)
+    return '%s' % (self.tag_name)
 
   class Meta:
     ordering = ["context","tag_name"]
@@ -95,7 +96,7 @@ class Species(models.Model):
   #use_genome_build = models.CharField(max_length=100, blank=False, null=False)
 
   def __unicode__(self):
-    return u'%s (%s)' % (self.scientific_name, self.common_name)
+    return '%s (%s)' % (self.scientific_name, self.common_name)
 
   class Meta:
     verbose_name_plural = "species"
@@ -113,14 +114,14 @@ class Affiliation(models.Model):
   users.admin_order_field = "username"
 
   def __unicode__(self):
-    str = unicode(self.name)
+    str = str(self.name)
     if self.contact is not None and len(self.contact) > 0:
-      str += u' ('+self.contact+u')'
+      str += ' ('+self.contact+')'
     return str
 
   def Users(self):
       users = self.users.all().order_by('username')
-      return ", ".join([unicode(a) for a in users ])
+      return ", ".join([str(a) for a in users ])
 
   class Meta:
     ordering = ["name","contact"]
@@ -128,14 +129,14 @@ 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,
                     help_text="Does this adapter provide multiplexing?")
 
   def __unicode__(self):
-      return unicode(self.name)
+      return str(self.name)
 
   class Meta:
       ordering = ["-id"]
@@ -144,10 +145,11 @@ 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):
@@ -201,7 +203,7 @@ class Library(models.Model):
 
   undiluted_concentration = models.DecimalField("Concentration",
       max_digits=5, decimal_places=2, blank=True, null=True,
-      help_text=u"Undiluted concentration (ng/\u00b5l)")
+      help_text="Undiluted concentration (ng/\u00b5l)")
       # note \u00b5 is the micro symbol in unicode
   successful_pM = models.DecimalField(max_digits=9,
                                       decimal_places=1, blank=True, null=True)
@@ -213,11 +215,11 @@ class Library(models.Model):
   bioanalyzer_summary = models.TextField(blank=True,default="")
   bioanalyzer_concentration = models.DecimalField(max_digits=5,
                                 decimal_places=2, blank=True, null=True,
-                                help_text=u"(ng/\u00b5l)")
+                                help_text="(ng/\u00b5l)")
   bioanalyzer_image_url = models.URLField(blank=True,default="")
 
   def __unicode__(self):
-    return u'#%s: %s' % (self.id, self.library_name)
+    return '#%s: %s' % (self.id, self.library_name)
 
   class Meta:
       verbose_name_plural = "libraries"
@@ -244,21 +246,44 @@ 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 as e:
+          return None
+
   def index_sequence_text(self, seperator=' '):
       """Return formatted multiplex index sequences"""
       sequences = self.index_sequences()
-      multiplex_ids = sequences.keys()
+      if sequences is None:
+          return ""
+      if type(sequences) in str:
+          return sequences
+      multiplex_ids = list(sequences.keys())
       multiplex_ids.sort()
       return seperator.join(( "%s:%s" %(i,sequences[i]) for i in multiplex_ids))
   index_sequence_text.short_description = "Index"
@@ -295,7 +320,7 @@ class Library(models.Model):
     ar = []
     for t in affs:
       ar.append(t.__unicode__())
-    return u'%s' % ( ", ".join(ar))
+    return '%s' % ( ", ".join(ar))
 
   def DataRun(self):
     str ='<a target=_self href="/admin/experiments/datarun/?q='+self.id+'" title="Check All Data Runs for This Specific Library ..." ">Data Run</a>'
@@ -310,7 +335,7 @@ class Library(models.Model):
 
     # Check data sanity
     if res[2] != "OK":
-      return u'<div style="border:solid red 2px">'+res[2]+'</div>'
+      return '<div style="border:solid red 2px">'+res[2]+'</div>'
 
     rc = "%1.2f" % (res[1]/1000000.0)
     # Color Scheme: green is more than 10M, blue is more than 5M, orange is more than 3M and red is less. For RNAseq, all those thresholds should be doubled
@@ -363,7 +388,7 @@ class HTSUser(User):
 
     def __unicode__(self):
         #return unicode(self.username) + u" (" + unicode(self.get_full_name()) + u")"
-        return unicode(self.get_full_name()) + u' (' + unicode(self.username) + ')'
+        return str(self.get_full_name()) + ' (' + str(self.username) + ')'
 
 def HTSUserInsertID(sender, instance, **kwargs):
     """