From dd01608a26621a01805f30a9a21872f91e38d4ad Mon Sep 17 00:00:00 2001 From: Diane Trout Date: Wed, 27 Jun 2012 15:53:19 -0700 Subject: [PATCH] Only allow one default cluster station or sequencer to be set 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. --- .../experiments/fixtures/test_flowcells.json | 24 +++-- htsworkflow/frontend/experiments/models.py | 25 ++++- htsworkflow/frontend/experiments/tests.py | 100 ++++++++++++++++++ 3 files changed, 142 insertions(+), 7 deletions(-) diff --git a/htsworkflow/frontend/experiments/fixtures/test_flowcells.json b/htsworkflow/frontend/experiments/fixtures/test_flowcells.json index 59d5afe..1497476 100644 --- a/htsworkflow/frontend/experiments/fixtures/test_flowcells.json +++ b/htsworkflow/frontend/experiments/fixtures/test_flowcells.json @@ -96,17 +96,29 @@ "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, diff --git a/htsworkflow/frontend/experiments/models.py b/htsworkflow/frontend/experiments/models.py index ce6f532..20131e4 100644 --- a/htsworkflow/frontend/experiments/models.py +++ b/htsworkflow/frontend/experiments/models.py @@ -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) diff --git a/htsworkflow/frontend/experiments/tests.py b/htsworkflow/frontend/experiments/tests.py index e54d630..e67c920 100644 --- a/htsworkflow/frontend/experiments/tests.py +++ b/htsworkflow/frontend/experiments/tests.py @@ -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', ] -- 2.30.2