d7d798782a672716cfc1284dd36a7ddb7d26d826
[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       ('Gel', 'Ran gel'),
63       ('1A', 'Gel purification'),
64       ('2A', '2nd PCR'),
65       ('Done', 'Completed'),
66       ('Progress', 'In progress'),
67     )
68   stopping_point = models.CharField(max_length=50, choices=PROTOCOL_END_POINTS)
69   amplified_from_sample = models.ForeignKey('self', blank=True, null=True)
70   library_size = models.IntegerField(default=225, blank=True, null=True)
71   
72   undiluted_concentration = models.DecimalField("Undiluted concentration (ng/ul)", max_digits=5, decimal_places=2, default=0)
73   successful_pM = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
74   ten_nM_dilution = models.BooleanField(default=False)
75   
76   notes = models.TextField(blank=True)
77   
78   def __str__(self):
79     return '#%s: %s' % (self.library_id, self.library_name)
80   
81   class Meta:
82     verbose_name_plural = "libraries"
83     ordering = ["-library_id"]
84   
85   class Admin:
86     date_hierarchy = "creation_date"
87     save_as = True
88     save_on_top = True
89     search_fields = ['library_name', 'library_id']
90     list_display = ('library_id', 'library_name', 'made_for', 'library_species', 'creation_date')
91     list_display_links = ('library_id', 'library_name')
92     list_filter = ('stopping_point', 'library_species', 'made_for', 'made_by')
93     fields = (
94         (None, {
95             'fields': (('library_id', 'library_name'), ('library_species', 'RNAseq'),)
96         }),
97         ('Creation Information:', {
98             'fields' : (('made_for', 'made_by', 'creation_date'), ('stopping_point', 'amplified_from_sample'), ('undiluted_concentration', 'library_size'), 'notes',)
99         }),
100         ('Run Information:', {
101             'fields' : (('ten_nM_dilution','successful_pM'),)
102         }),
103     )
104
105 class FlowCell(models.Model):
106   
107   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
108   run_date = models.DateTimeField(core=True)
109   advanced_run = models.BooleanField(default=False)
110   read_length = models.IntegerField(default=32)
111   
112   
113   FLOWCELL_STATUSES = (
114       ('No', 'Not run'),
115       ('F', 'Failed'),
116       ('Del', 'Data deleted'),
117       ('A', 'Data available'),
118       ('In', 'In progress'),
119     )
120   flowcell_status = models.CharField(max_length=10, choices=FLOWCELL_STATUSES)
121   
122   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
123   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
124   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
125   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
126   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
127   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
128   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
129   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
130
131   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
132   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
133   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
134   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
135   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
136   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
137   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
138   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
139   
140   lane_1_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
141   lane_2_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
142   lane_3_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
143   lane_4_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
144   lane_5_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
145   lane_6_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
146   lane_7_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
147   lane_8_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
148   
149   kit_1000148 = models.IntegerField(blank=True, null=True)
150   kit_1000147 = models.IntegerField(blank=True, null=True)
151   kit_1000183 = models.IntegerField(blank=True, null=True)
152   kit_1001625 = models.IntegerField(blank=True, null=True)
153   
154   cluster_station_id = models.CharField(max_length=50, blank=True, null=True)
155   sequencer_id = models.CharField(max_length=50, blank=True, null=True)
156   
157   notes = models.TextField(blank=True)
158
159   def __str__(self):
160     return '%s (%s)' % (self.flowcell_id, self.run_date) 
161   
162   class Meta:
163     ordering = ["-run_date"]
164   
165   class Admin:
166     date_hierarchy = "run_date"
167     save_as = True
168     save_on_top = True
169     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']
170     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')
171     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')
172     fields = (
173         (None, {
174             'fields': ('run_date', ('flowcell_id', 'flowcell_status'), ('read_length', 'advanced_run'),)
175         }),
176         ('Lanes:', {
177             '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'),)
178         }),
179         (None, {
180             'fields' : ('notes',)
181         }),
182         ('Kits & Machines:', {
183             'classes': 'collapse',
184             'fields' : (('kit_1000148', 'kit_1000147', 'kit_1000183', 'kit_1001625'), ('cluster_station_id', 'sequencer_id'),)
185         }),
186         ('Cluster Estimates:', {
187             'classes': 'collapse',
188             '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',),)
189         }),
190     )
191
192 class ElandResult(models.Model):
193   
194   class Admin: pass
195   
196   flow_cell = models.ForeignKey(FlowCell)
197   config_file = models.FileField(upload_to=settings.UPLOADTO_CONFIG_FILE)
198   eland_result_pack = models.FileField(upload_to=settings.UPLOADTO_ELAND_RESULT_PACKS)
199   bed_file_pack = models.FileField(upload_to=settings.UPLOADTO_BED_PACKS)
200   
201   notes = models.TextField(blank=True)