Change experiments.FileType.regex to a text field so it can be arbitrarily long.
[htsworkflow.git] / htsworkflow / frontend / experiments / models.py
index e3771cbde31be4f654fd44dc5b043ed847144257..2da1fcf120228a2e46312a355066ddf1488aaba7 100644 (file)
@@ -3,12 +3,14 @@ import glob
 import logging
 import os
 import re
+import sre_constants
 import types
 import uuid
 
 from django.conf import settings
 from django.core.exceptions import ObjectDoesNotExist
 from django.core import urlresolvers
+from django.utils import timezone
 from django.db import models
 from django.db.models.signals import post_init, pre_save
 
@@ -16,6 +18,8 @@ from htsworkflow.frontend.samples.models import Library
 from htsworkflow.util.conversion import parse_flowcell_id
 from htsworkflow.pipelines import runfolder
 
+import pytz
+
 LOGGER = logging.getLogger(__name__)
 default_pM = 5
 try:
@@ -125,6 +129,33 @@ class Sequencer(models.Model):
 
 pre_save.connect(Sequencer.update_isdefault, sender=Sequencer)
 
+class FlowCellModel(models.Model):
+    name = models.TextField()
+    fixed_time = models.IntegerField(default=0, help_text='(seconds)')
+    per_cycle_time = models.IntegerField(default=0, help_text='(seconds)')
+    isdefault = models.BooleanField(default=False)
+
+    def __unicode__(self):
+        return unicode(self.name)
+
+    @classmethod
+    def default(cls):
+        d = cls.objects.filter(isdefault=True).all()
+        if len(d) > 0:
+            return d[-1]
+        return None
+
+    @staticmethod
+    def update_isdefault(sender, instance, **kwargs):
+        """Clear default if needed
+        """
+        if instance.isdefault:
+            for s in FlowCellType.objects.filter(isdefault=True).all():
+                if s.id != instance.id:
+                    s.isdefault = False
+                    s.save()
+
+pre_save.connect(FlowCellModel.update_isdefault, sender=FlowCellModel)
 
 class FlowCell(models.Model):
     flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
@@ -146,6 +177,7 @@ class FlowCell(models.Model):
 
     cluster_station = models.ForeignKey(ClusterStation, default=ClusterStation.default)
     sequencer = models.ForeignKey(Sequencer, default=Sequencer.default)
+    flowcell_model = models.ForeignKey(FlowCellModel, default=FlowCellModel.default)
 
     notes = models.TextField(blank=True)
 
@@ -219,7 +251,7 @@ class FlowCell(models.Model):
 
     def import_data_run(self, relative_pathname, run_xml_name, force=False):
         """Given a result directory import files"""
-        now = datetime.datetime.now()
+        now = timezone.now()
         run_dir = get_absolute_pathname(relative_pathname)
         run_xml_path = os.path.join(run_dir, run_xml_name)
 
@@ -243,7 +275,8 @@ class FlowCell(models.Model):
             run.runfolder_name = run_xml_data.runfolder_name
             run.cycle_start = run_xml_data.image_analysis.start
             run.cycle_stop = run_xml_data.image_analysis.stop
-            run.run_start_time = run_xml_data.image_analysis.date
+            naive_run_start_time = datetime.datetime.fromordinal(run_xml_data.image_analysis.date.toordinal())
+            run.run_start_time = pytz.timezone(settings.TIME_ZONE).localize(naive_run_start_time)
             run.image_software = run_xml_data.image_analysis.software
             run.image_version = run_xml_data.image_analysis.version
             run.basecall_software = run_xml_data.bustard.software
@@ -253,7 +286,7 @@ class FlowCell(models.Model):
                 run.alignment_software = run_xml_data.gerald.software
                 run.alignment_version = run_xml_data.gerald.version
 
-            run.last_update_time = datetime.datetime.now()
+            run.last_update_time = timezone.now()
             run.save()
 
             run.update_result_files()
@@ -356,7 +389,7 @@ class DataRun(models.Model):
 
                     self.datafile_set.add(newfile)
 
-        self.last_update_time = datetime.datetime.now()
+        self.last_update_time = timezone.now()
 
     def lane_files(self):
         lanes = {}
@@ -391,7 +424,7 @@ class FileType(models.Model):
     name = models.CharField(max_length=50)
     mimetype = models.CharField(max_length=50, null=True, blank=True)
     # regular expression from glob.fnmatch.translate
-    regex = models.CharField(max_length=50, null=True, blank=True)
+    regex = models.TextField(null=True, blank=True)
 
     def parse_filename(self, pathname):
         """Does filename match our pattern?
@@ -423,6 +456,12 @@ class FileType(models.Model):
         #return u"<FileType: %s>" % (self.name,)
         return self.name
 
+    def regex_is_valid(self):
+        try:
+            regex = re.compile(self.regex)
+        except sre_constants.error as e:
+            return False
+        return re.compile(self.regex) is not None
 
 def str_uuid():
     """Helper function to set default UUID in DataFile"""