fixing incorrect previous check in
[htsworkflow.git] / gaworkflow / frontend / exp_track / models.py
1 from django.db import models
2 from gaworkflow.frontend.fctracker.models import Library
3
4 class FlowCell(models.Model):
5   
6   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
7   run_date = models.DateTimeField(core=True)
8   advanced_run = models.BooleanField(default=False)
9   read_length = models.IntegerField(default=32) #Stanford is currenlty 25
10   
11   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
12   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
13   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
14   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
15   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
16   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
17   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
18   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
19
20   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
21   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
22   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
23   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
24   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
25   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
26   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
27   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
28   
29   lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
30   lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
31   lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
32   lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
33   lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
34   lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
35   lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
36   lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
37  
38   # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
39   # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
40   # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
41   # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
42   # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
43   # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
44   # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
45   # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
46
47   #Machine Names
48   CLUSTER_MAC = (
49       ('M304','M304'),
50       ('R349','R349'),
51       ('Tinkerbell','Tinkerbell'),
52       ('BitBit','BitBit'),
53     )
54   
55   SEQ_MAC = (
56       ('EAS149','EAS149'),
57       ('EAS46','EAS46'),
58       ('EAS45','Paris'),
59       ('Britney','Britney'),
60     )
61   
62   cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
63   seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
64   
65   notes = models.TextField(blank=True)
66
67   def __str__(self):
68     #return '%s (%s)' % (self.flowcell_id, self.run_date) 
69     return '%s' % (self.flowcell_id) 
70
71
72   def Lanes(self):
73     return '<div><span style="margin-right:10px">1)%s</span><span style="margin-right:10px">2)%s</span><span style="margin-right:10px">3)%s</span><span style="margin-right:10px">4)%s</span><span style="margin-right:10px">5)%s</span><span style="margin-right:10px">6)%s</span><span style="margin-right:10px">7)%s</span><span style="margin-right:10px">8)%s</span></div>' % (self.lane_1_library,self.lane_2_library,self.lane_3_library,self.lane_4_library,self.lane_5_library,self.lane_6_library,self.lane_7_library,self.lane_8_library)
74   Lanes.allow_tags = True
75  
76   class Meta:
77     ordering = ["-run_date"]
78   
79   class Admin:
80     save_on_top = True
81     date_hierarchy = "run_date"
82     save_on_top = True
83     search_fields = ['flowcell_id','seq_mac_id','cluster_mac_id','=lane_1_library__library_id','=lane_2_library__library_id','=lane_3_library__library_id','=lane_4_library__library_id','=lane_5_library__library_id','=lane_6_library__library_id','=lane_7_library__library_id','=lane_8_library__library_id']
84     list_display = ('flowcell_id','seq_mac_id','run_date', 'Lanes')
85     list_filter = ('seq_mac_id','cluster_mac_id')
86     fields = (
87         (None, {
88             'fields': ('run_date', ('flowcell_id','cluster_mac_id','seq_mac_id'), ('read_length'),)
89         }),
90         ('Lanes:', {
91             ##'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate', 'lane_1_primer'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate', 'lane_2_primer'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate', 'lane_3_primer'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate', 'lane_4_primer'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate', 'lane_5_primer'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate', 'lane_6_primer'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate', 'lane_7_primer'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate', 'lane_8_primer'),)
92            'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate'),)
93         }),
94         (None, {
95             'fields' : ('notes',)
96         }),
97     )
98
99
100 ### -----------------------
101 class DataRun(models.Model):
102   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
103   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
104   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
105   config_params = models.TextField(default=ConfTemplate)
106   run_start_time = models.DateTimeField(core=True)
107   RUN_STATUS_CHOICES = (
108       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
109       (1, 'Data Pipeline Started'),
110       (2, 'Data Pipeline Interrupted'),
111       (3, 'Data Pipeline Finished'),
112       (4, 'CollectReads Started'),
113       (5, 'CollectReads Finished'),
114       (6, 'QC Finished'),
115       (7, 'DONE'),
116     )
117   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
118   run_note = models.TextField(blank=True)
119
120
121   def main_status(self):
122     return self.run_status
123
124   main_status.allow_tags = True
125   
126   def Flowcell_Info(self):
127     str = '<b>'+self.fcid.__str__()+'</b>'
128     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
129     str += '<div style="margin-top:5px;">'    
130     str +='<a title="View Lane List here ..."  onClick="el = document.getElementById(\'LanesOf'+self.fcid.__str__()+'\');if(el) (el.style.display==\'none\'?el.style.display=\'block\':el.style.display=\'none\')" style="cursor:pointer;color: #5b80b2;">View/hide lanes</a>'
131     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
132     LanesList = '1: '+self.fcid.lane_1_library.__str__()+' ('+self.fcid.lane_1_library.library_species.use_genome_build+')<br/>2: '+self.fcid.lane_2_library.__str__()+' ('+self.fcid.lane_2_library.library_species.use_genome_build+')<br/>3: '+self.fcid.lane_3_library.__str__()+' ('+self.fcid.lane_3_library.library_species.use_genome_build+')<br/>4: '+self.fcid.lane_4_library.__str__()+' ('+self.fcid.lane_4_library.library_species.use_genome_build+')<br/>5: '+self.fcid.lane_5_library.__str__()+' ('+self.fcid.lane_5_library.library_species.use_genome_build+')<br/>6: '+self.fcid.lane_6_library.__str__()+' ('+self.fcid.lane_6_library.library_species.use_genome_build+')<br/>7: '+self.fcid.lane_7_library.__str__()+' ('+self.fcid.lane_7_library.library_species.use_genome_build+')<br/>8: '+self.fcid.lane_8_library.__str__()+' ('+self.fcid.lane_8_library.library_species.use_genome_build+')'
133     str += LanesList ## self.fcid.Lanes()
134     str += '</div>'
135     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a></div>'
136     str += '</div>'    
137     return str
138   Flowcell_Info.allow_tags = True
139
140   class Admin:
141     search_fields = ['run_folder','run_note','config_params','=fcid__lane_1_library__library_id','=fcid__lane_2_library__library_id','=fcid__lane_3_library__library_id','=fcid__lane_4_library__library_id','=fcid__lane_5_library__library_id','=fcid__lane_6_library__library_id','=fcid__lane_7_library__library_id','=fcid__lane_8_library__library_id']
142
143     list_display = ('run_folder','Flowcell_Info','run_start_time','run_status','run_note')
144     list_filter = ('run_status','run_start_time')