Only allow one default cluster station or sequencer to be set
authorDiane Trout <diane@caltech.edu>
Wed, 27 Jun 2012 22:53:19 +0000 (15:53 -0700)
committerDiane Trout <diane@caltech.edu>
Wed, 27 Jun 2012 22:53:19 +0000 (15:53 -0700)
Works by watching for the pre_save signal for those classes
and if it sees that the isdefault flag being set to true it
goes through all the other records and sets isdefault to null.

htsworkflow/frontend/experiments/fixtures/test_flowcells.json
htsworkflow/frontend/experiments/models.py
htsworkflow/frontend/experiments/tests.py

index 59d5afee450538635e336256d2e044df312fb161..149747656f3baf0b900ba3fb890f77fa0f773e00 100644 (file)
          "email": "pk5@example.com"
          }
      },
- {"pk": 1, "model": "experiments.clusterstation", "fields": {"name": "old"}},
- {"pk": 2, "model": "experiments.clusterstation", "fields": {"name": "loaner"}},
- {"pk": 3, "model": "experiments.clusterstation", "fields": {"name": "new"}},
+ {"pk": 1, "model": "experiments.clusterstation",
+  "fields": {"name": "old", "isdefault": false}},
+ {"pk": 2, "model": "experiments.clusterstation",
+  "fields": {"name": "loaner", "isdefault": true}},
+ {"pk": 3, "model": "experiments.clusterstation",
+  "fields": {"name": "new", "isdefault": false}},
  {"pk": 1, "model": "experiments.sequencer",
-  "fields": { "name": "Rotifer (HWI-EAS229)" }},
+  "fields": { "name": "Rotifer (HWI-EAS229)",
+              "model": "Illumina Genome Analyzer I",
+              "active": false,
+              "isdefault": false }},
  {"pk": 2, "model": "experiments.sequencer",
   "fields": {"name": "Tardigrade",
              "instrument_name": "ILLUMINA-EC5D15",
-             "model": "Illumina Genome Analyzer IIx"}
+             "model": "Illumina Genome Analyzer IIx",
+             "active": true,
+             "isdefault": true}
  },
- {"pk": 3, "model": "experiments.sequencer", "fields": {"name": "Sequenced somewhere else."}},
+ {"pk": 3, "model": "experiments.sequencer",
+  "fields": {"name": "Sequenced somewhere else.",
+             "model": "Unknown",
+             "active": true,
+             "isdefault": false}},
  {"pk": 153, "model": "experiments.flowcell",
   "fields": {
       "paired_end": true,
index ce6f53251da0f16191810238844157b0c2da2f97..20131e41bb22170cd720e4b93e934b4a9787e786 100644 (file)
@@ -10,7 +10,7 @@ from django.conf import settings
 from django.core.exceptions import ObjectDoesNotExist
 from django.core import urlresolvers
 from django.db import models
-from django.db.models.signals import post_init
+from django.db.models.signals import post_init, pre_save
 
 from htsworkflow.frontend.samples.models import Library
 from htsworkflow.util.conversion import parse_flowcell_id
@@ -66,6 +66,17 @@ class ClusterStation(models.Model):
             return d[0]
         return None
 
+    @staticmethod
+    def update_isdefault(sender, instance, **kwargs):
+        """Clear default if needed
+        """
+        if instance.isdefault:
+            for c in ClusterStation.objects.all():
+                if c.id != instance.id:
+                    c.isdefault = False
+                    c.save()
+
+pre_save.connect(ClusterStation.update_isdefault, sender=ClusterStation)
 
 class Sequencer(models.Model):
     """Sequencers we've owned
@@ -102,6 +113,18 @@ class Sequencer(models.Model):
             return d[0]
         return None
 
+    @staticmethod
+    def update_isdefault(sender, instance, **kwargs):
+        """Clear default if needed
+        """
+        if instance.isdefault:
+            for s in Sequencer.objects.all():
+                if s.id != instance.id:
+                    s.isdefault = False
+                    s.save()
+
+pre_save.connect(Sequencer.update_isdefault, sender=Sequencer)
+
 
 class FlowCell(models.Model):
     flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
index e54d630497e2f3b9c412b7364f50d06dcf659cd3..e67c920002c036753f7b55f3883d20ccec1de57d 100644 (file)
@@ -23,6 +23,106 @@ LANE_SET = range(1,9)
 
 NSMAP = {'libns':'http://jumpgate.caltech.edu/wiki/LibraryOntology#'}
 
+class ClusterStationTestCases(TestCase):
+    fixtures = ['test_flowcells.json']
+
+    def test_default(self):
+        c = models.ClusterStation.default()
+        self.failUnlessEqual(c.id, 2)
+
+        c.isdefault = False
+        c.save()
+
+        total = models.ClusterStation.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 0)
+
+        other_default = models.ClusterStation.default()
+        self.failUnlessEqual(other_default.id, 3)
+
+
+    def test_update_default(self):
+        old_default = models.ClusterStation.default()
+
+        c = models.ClusterStation.objects.get(pk=3)
+        c.isdefault = True
+        c.save()
+
+        new_default = models.ClusterStation.default()
+
+        self.failUnless(old_default != new_default)
+        self.failUnlessEqual(new_default, c)
+
+        total = models.ClusterStation.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+    def test_update_other(self):
+        old_default = models.ClusterStation.default()
+        total = models.ClusterStation.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+        c = models.ClusterStation.objects.get(pk=1)
+        c.name = "Primary Key 1"
+        c.save()
+
+        total = models.ClusterStation.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+        new_default = models.ClusterStation.default()
+        self.failUnlessEqual(old_default, new_default)
+
+
+class SequencerTestCases(TestCase):
+    fixtures = ['test_flowcells.json']
+
+    def test_default(self):
+        # starting with no default
+        s = models.Sequencer.default()
+        self.failUnlessEqual(s.id, 2)
+
+        total = models.Sequencer.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+        s.isdefault = False
+        s.save()
+
+        total = models.Sequencer.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 0)
+
+        other_default = models.Sequencer.default()
+        self.failUnlessEqual(other_default.id, 7)
+
+    def test_update_default(self):
+        old_default = models.Sequencer.default()
+
+        s = models.Sequencer.objects.get(pk=1)
+        s.isdefault = True
+        s.save()
+
+        new_default = models.Sequencer.default()
+
+        self.failUnless(old_default != new_default)
+        self.failUnlessEqual(new_default, s)
+
+        total = models.Sequencer.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+
+    def test_update_other(self):
+        old_default = models.Sequencer.default()
+        total = models.Sequencer.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+        s = models.Sequencer.objects.get(pk=1)
+        s.name = "Primary Key 1"
+        s.save()
+
+        total = models.Sequencer.objects.filter(isdefault=True).count()
+        self.failUnlessEqual(total, 1)
+
+        new_default = models.Sequencer.default()
+        self.failUnlessEqual(old_default, new_default)
+
+
 class ExperimentsTestCases(TestCase):
     fixtures = ['test_flowcells.json',
                 ]