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