print killing wsgi; minor fix.
[htsworkflow.git] / htsworkflow / frontend / inventory / models.py
index 26781ee75e8ec1fc64931226c917c1a56c8a3145..dd0844330b7a0ad7f179b515ee0c6e96da6b0a53 100644 (file)
@@ -1,3 +1,5 @@
+import logging
+
 from django.db import models
 from django.db.models.signals import pre_save
 
@@ -5,13 +7,22 @@ from htsworkflow.frontend.samples.models import Library
 from htsworkflow.frontend.experiments.models import FlowCell
 
 
-import uuid
+try:
+    import uuid
+except ImportError, e:
+    # Some systems are using python 2.4, which doesn't have uuid
+    # this is a stub
+    logging.warning('Real uuid is not available, initializing fake uuid module')
+    class uuid:
+        def uuid1(self):
+            self.hex = None
+            return self
 
 def _assign_uuid(sender, instance, **kwargs):
     """
     Assigns a UUID to model on save
     """
-    print 'Entered _assign_uuid'
+    #print 'Entered _assign_uuid'
     if instance.uuid is None or len(instance.uuid) != 32:
         instance.uuid = uuid.uuid1().hex
 
@@ -42,8 +53,11 @@ class Location(models.Model):
 pre_save.connect(_assign_uuid, sender=Location)
 
 class ItemInfo(models.Model):
-    model_id = models.CharField(max_length=256)
-    model_url = models.URLField(blank=True, null=True)
+    model_id = models.CharField(max_length=256, blank=True, null=True)
+    part_number = models.CharField(max_length=256, blank=True, null=True)
+    lot_number = models.CharField(max_length=256, blank=True, null=True)
+    
+    url = models.URLField(blank=True, null=True)
     
     qty_purchased = models.IntegerField(default=1)
     
@@ -51,8 +65,18 @@ class ItemInfo(models.Model):
     purchase_date = models.DateField(blank=True, null=True)
     warranty_months = models.IntegerField(blank=True, null=True)
     
+    notes = models.TextField(blank=True, null=True)
+    
     def __unicode__(self):
-        return u"%s: %s" % (self.model_id, self.purchase_date)
+        name = u''
+        if self.model_id:
+            name += u"model:%s " % (self.model_id)
+        if self.part_number:
+            name += u"part:%s " % (self.part_number)
+        if self.lot_number:
+            name += u"lot:%s " % (self.lot_number)
+            
+        return u"%s: %s" % (name, self.purchase_date)
 
 
 class ItemType(models.Model):
@@ -62,7 +86,13 @@ class ItemType(models.Model):
     
     def __unicode__(self):
         return u"%s" % (self.name)
+
+class ItemStatus(models.Model):
+    name = models.CharField(max_length=64, unique=True)
+    notes = models.TextField(blank=True, null=True)
     
+    def __unicode__(self):
+        return self.name
 
 class Item(models.Model):
     
@@ -70,7 +100,7 @@ class Item(models.Model):
     
     #Automatically assigned uuid; used for barcode if one is not provided in
     # barcode_id
-    uuid = models.CharField(max_length=32, blank=True, help_text="Leave blank for automatic UUID generation")
+    uuid = models.CharField(max_length=32, blank=True, help_text="Leave blank for automatic UUID generation", unique=True)
     
     # field for existing barcodes; used instead of uuid if provided
     barcode_id = models.CharField(max_length=256, blank=True, null=True)
@@ -80,6 +110,8 @@ class Item(models.Model):
     
     location = models.ForeignKey(Location)
     
+    status = models.ForeignKey(ItemStatus, blank=True, null=True)
+    
     creation_date = models.DateTimeField(auto_now_add=True)
     modified_date = models.DateTimeField(auto_now=True)
     
@@ -91,6 +123,9 @@ class Item(models.Model):
         else:
             return u"invb|%s" % (self.barcode_id)
             
+    def get_absolute_url(self):
+        return '/inventory/%s/' % (self.uuid)
+            
 pre_save.connect(_assign_uuid, sender=Item)
 
 
@@ -101,5 +136,40 @@ class LongTermStorage(models.Model):
 
     storage_devices = models.ManyToManyField(Item)
     
+    creation_date = models.DateTimeField(auto_now_add=True)
+    modified_date = models.DateTimeField(auto_now=True)
+    
+    def __unicode__(self):
+        return u"%s: %s" % (str(self.flowcell), ', '.join([ str(s) for s in self.storage_devices.iterator() ]))
+        
+
+
+class ReagentBase(models.Model):
+    
+    reagent = models.ManyToManyField(Item)
+    
+    creation_date = models.DateTimeField(auto_now_add=True)
+    modified_date = models.DateTimeField(auto_now=True)
+    
+    class Meta:
+        abstract = True
+
+
+class ReagentFlowcell(ReagentBase):
+    """
+    Links reagents and flowcells
+    """
+    flowcell = models.ForeignKey(FlowCell)
+    
+    def __unicode__(self):
+        return u"%s: %s" % (str(self.flowcell), ', '.join([ str(s) for s in self.reagent.iterator() ]))
+   
+
+class ReagentLibrary(ReagentBase):
+    """
+    Links libraries and flowcells
+    """
+    library = models.ForeignKey(Library)
+    
     def __unicode__(self):
-        return u"%s: %s" % (str(self.flowcell), ', '.join([ str(s) for s in self.storage_devices.iterator() ]))
\ No newline at end of file
+        return u"%s: %s" % (str(self.library), ', '.join([ str(s) for s in self.reagent.iterator() ]))