dae892a41b5e85d5d37a233a87f0015309317a83
[htsworkflow.git] / gaworkflow / frontend / fctracker / models.py
1 from django.db import models
2 from gaworkflow.frontend import settings
3
4 # Create your models here.
5
6 class Species(models.Model):
7   
8   scientific_name = models.CharField(max_length=256, unique=False, db_index=True, core=True)
9   common_name = models.CharField(max_length=256, blank=True)
10   use_genome_build = models.CharField(max_length=100, blank=False, null=False)
11
12   def __str__(self):
13     return '%s (%s)|%s' % (self.scientific_name, self.common_name, self.use_genome_build)
14   
15   class Meta:
16     verbose_name_plural = "species"
17     ordering = ["scientific_name"]
18   
19   class Admin:
20       fields = (
21         (None, {
22             'fields': (('scientific_name', 'common_name'), ('use_genome_build'))
23         }),
24       )
25
26 class Person(models.Model):
27
28   name = models.CharField(max_length=100, primary_key=True, db_index=True)
29   lab = models.CharField(max_length=100)
30   email = models.CharField(max_length=50, blank=True, null=True)
31   
32   def __str__(self):
33     return '%s (%s lab)' % (self.name, self.lab)
34   
35   class Meta:
36     verbose_name_plural = "people"
37     ordering = ["lab"]
38     
39   class Admin:
40     fields = (
41       (None, {
42           'fields': (('name', 'lab'), ('email'))
43       }),
44     )
45
46
47 class Library(models.Model):
48   
49   library_id = models.CharField(max_length=25, primary_key=True, db_index=True, core=True)
50   library_name = models.CharField(max_length=100, unique=True, core=True)
51   library_species = models.ForeignKey(Species, core=True)
52   #use_genome_build = models.CharField(max_length=100, blank=False, null=False)
53   RNAseq = models.BooleanField()
54   
55   made_by = models.CharField(max_length=50, blank=True, default="Lorian")
56   creation_date = models.DateField(blank=True, null=True)
57   made_for = models.ForeignKey(Person)
58   
59   PROTOCOL_END_POINTS = (
60       ('?', 'Unknown'),
61       ('Sample', 'Raw sample'),
62       ('Progress', 'In progress'),
63       ('1A', 'Ligation, then gel'),
64       ('PCR', 'Ligation, then PCR'),
65       ('1Ab', 'Ligation, PCR, then gel'),
66       ('1Aa', 'Ligation, gel, then PCR'),
67       ('2A', 'Ligation, PCR, gel, PCR'),
68       ('Done', 'Completed'),
69     )
70   stopping_point = models.CharField(max_length=25, choices=PROTOCOL_END_POINTS)
71   amplified_from_sample = models.ForeignKey('self', blank=True, null=True)
72   library_size = models.IntegerField(default=225, blank=True, null=True)
73   
74   undiluted_concentration = models.DecimalField("Undiluted concentration (ng/ul)", max_digits=5, decimal_places=2, default=0)
75   successful_pM = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
76   ten_nM_dilution = models.BooleanField(default=False)
77   
78   notes = models.TextField(blank=True)
79   
80   def __str__(self):
81     return '#%s: %s' % (self.library_id, self.library_name)
82   
83   class Meta:
84     verbose_name_plural = "libraries"
85     ordering = ["-library_id"]
86   
87   class Admin:
88     date_hierarchy = "creation_date"
89     save_as = True
90     save_on_top = True
91     search_fields = ['library_name', 'library_id']
92     list_display = ('library_id', 'library_name', 'made_for', 'creation_date', 'stopping_point')
93     list_display_links = ('library_id', 'library_name')
94     list_filter = ('stopping_point', 'library_species', 'made_for', 'made_by', 'RNAseq')
95     fields = (
96         (None, {
97             'fields': (('library_id', 'library_name'), ('library_species', 'RNAseq'),)
98         }),
99         ('Creation Information:', {
100             'fields' : (('made_for', 'made_by', 'creation_date'), ('stopping_point', 'amplified_from_sample'), ('undiluted_concentration', 'library_size'), 'notes',)
101         }),
102         ('Run Information:', {
103             'fields' : (('ten_nM_dilution','successful_pM'),)
104         }),
105     )
106
107 class FlowCell(models.Model):
108   
109   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
110   run_date = models.DateTimeField(core=True)
111   advanced_run = models.BooleanField(default=False)
112   read_length = models.IntegerField(default=32)
113   
114   
115   FLOWCELL_STATUSES = (
116       ('No', 'Not run'),
117       ('F', 'Failed'),
118       ('Del', 'Data deleted'),
119       ('A', 'Data available'),
120       ('In', 'In progress'),
121     )
122   flowcell_status = models.CharField(max_length=10, choices=FLOWCELL_STATUSES)
123   
124   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
125   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
126   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
127   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
128   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
129   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
130   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
131   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
132
133   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
134   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
135   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
136   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
137   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
138   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
139   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
140   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
141   
142   lane_1_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
143   lane_2_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
144   lane_3_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
145   lane_4_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
146   lane_5_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
147   lane_6_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
148   lane_7_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
149   lane_8_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
150   
151   kit_1000148 = models.IntegerField(blank=True, null=True)
152   kit_1000147 = models.IntegerField(blank=True, null=True)
153   kit_1000183 = models.IntegerField(blank=True, null=True)
154   kit_1001625 = models.IntegerField(blank=True, null=True)
155   
156   cluster_station_id = models.CharField(max_length=50, blank=True, null=True)
157   sequencer_id = models.CharField(max_length=50, blank=True, null=True)
158   
159   notes = models.TextField(blank=True)
160
161   def __str__(self):
162     return '%s (%s)' % (self.flowcell_id, self.run_date) 
163   
164   class Meta:
165     ordering = ["-run_date"]
166   
167   class Admin:
168     date_hierarchy = "run_date"
169     save_as = True
170     save_on_top = True
171     search_fields = ['flowcell_id', 'lane_1_library__library_id', 'lane_1_library__library_name', 'lane_2_library__library_id', 'lane_2_library__library_name', 'lane_3_library__library_id', 'lane_3_library__library_name', 'lane_4_library__library_id', 'lane_4_library__library_name', 'lane_5_library__library_id', 'lane_5_library__library_name', 'lane_6_library__library_id', 'lane_6_library__library_name', 'lane_7_library__library_id', 'lane_7_library__library_name', 'lane_8_library__library_id', 'lane_8_library__library_name']
172     list_display = ('run_date', 'flowcell_status', 'flowcell_id', 'lane_1_library', 'lane_2_library', 'lane_3_library', 'lane_4_library', 'lane_5_library', 'lane_6_library', 'lane_7_library', 'lane_8_library')
173     list_display_links = ('run_date', 'flowcell_id', 'lane_1_library', 'lane_2_library', 'lane_3_library', 'lane_4_library', 'lane_5_library', 'lane_6_library', 'lane_7_library', 'lane_8_library')
174     fields = (
175         (None, {
176             'fields': ('run_date', ('flowcell_id', 'flowcell_status'), ('read_length', 'advanced_run'),)
177         }),
178         ('Lanes:', {
179             'fields' : (('lane_1_library', 'lane_1_pM'), ('lane_2_library', 'lane_2_pM'), ('lane_3_library', 'lane_3_pM'), ('lane_4_library', 'lane_4_pM'), ('lane_5_library', 'lane_5_pM'), ('lane_6_library', 'lane_6_pM'), ('lane_7_library', 'lane_7_pM'), ('lane_8_library', 'lane_8_pM'),)
180         }),
181         (None, {
182             'fields' : ('notes',)
183         }),
184         ('Kits & Machines:', {
185             'classes': 'collapse',
186             'fields' : (('kit_1000148', 'kit_1000147', 'kit_1000183', 'kit_1001625'), ('cluster_station_id', 'sequencer_id'),)
187         }),
188         ('Cluster Estimates:', {
189             'classes': 'collapse',
190             'fields' : (('lane_1_cluster_estimate', 'lane_2_cluster_estimate'), ('lane_3_cluster_estimate', 'lane_4_cluster_estimate'), ('lane_5_cluster_estimate', 'lane_6_cluster_estimate'), ('lane_7_cluster_estimate', 'lane_8_cluster_estimate',),)
191         }),
192     )
193
194 class ElandResult(models.Model):
195   
196   class Admin: pass
197   
198   flow_cell = models.ForeignKey(FlowCell)
199   config_file = models.FileField(upload_to=settings.UPLOADTO_CONFIG_FILE)
200   eland_result_pack = models.FileField(upload_to=settings.UPLOADTO_ELAND_RESULT_PACKS)
201   bed_file_pack = models.FileField(upload_to=settings.UPLOADTO_BED_PACKS)
202   
203   notes = models.TextField(blank=True)