60cfd93a7bd55e0a531668b62a8931ba5aea46b4
[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 Library(models.Model):
27   
28   library_id = models.CharField(max_length=25, primary_key=True, db_index=True, core=True)
29   library_name = models.CharField(max_length=100, unique=True, core=True)
30   library_species = models.ForeignKey(Species, core=True)
31   #use_genome_build = models.CharField(max_length=100, blank=False, null=False)
32   RNAseq = models.BooleanField()
33   
34   made_by = models.CharField(max_length=50, blank=True, default="Lorian")
35   creation_date = models.DateField(blank=True, null=True)
36   made_for = models.CharField(max_length=50, blank=True)
37   
38   PROTOCOL_END_POINTS = (
39       ('?', 'Unknown'),
40       ('Sample', 'Raw sample'),
41       ('Gel', 'Ran gel'),
42       ('1A', 'Gel purification'),
43       ('2A', '2nd PCR'),
44       ('Done', 'Completed'),
45       ('Progress', 'In progress'),
46     )
47   stopping_point = models.CharField(max_length=50, choices=PROTOCOL_END_POINTS)
48   amplified_from_sample = models.ForeignKey('self', blank=True, null=True)
49   library_size = models.IntegerField(default=225, blank=True, null=True)
50   
51   undiluted_concentration = models.DecimalField("Undiluted concentration (ng/ul)", max_digits=5, decimal_places=2, blank=True, null=True)
52   successful_pM = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
53   
54   notes = models.TextField(blank=True)
55   
56   def __str__(self):
57     return '#%s: %s' % (self.library_id, self.library_name)
58   
59   class Meta:
60     verbose_name_plural = "libraries"
61     ordering = ["-library_id"]
62   
63   class Admin:
64     date_hierarchy = "creation_date"
65     save_as = True
66     save_on_top = True
67     search_fields = ['library_name', 'library_id']
68     list_display = ('library_id', 'library_name', 'made_for', 'library_species', 'creation_date')
69     list_display_links = ('library_id', 'library_name')
70     list_filter = ('stopping_point', 'library_species', 'made_for', 'made_by')
71     fields = (
72         (None, {
73             'fields': (('library_id', 'library_name'), ('library_species', 'RNAseq'),)
74         }),
75         ('Creation Information:', {
76             'fields' : (('made_for', 'made_by', 'creation_date'), ('stopping_point', 'amplified_from_sample'), ('undiluted_concentration', 'library_size'), 'notes',)
77         }),
78         ('Run Information:', {
79             'fields' : (('successful_pM'),)
80         }),
81     )
82
83 class FlowCell(models.Model):
84   
85   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
86   run_date = models.DateTimeField(core=True)
87   advanced_run = models.BooleanField(default=False)
88   read_length = models.IntegerField(default=32)
89   
90   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
91   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
92   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
93   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
94   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
95   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
96   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
97   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
98
99   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
100   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
101   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
102   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
103   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
104   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
105   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
106   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2, default=4)
107   
108   lane_1_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
109   lane_2_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
110   lane_3_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
111   lane_4_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
112   lane_5_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
113   lane_6_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
114   lane_7_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
115   lane_8_cluster_estimate = models.CharField(max_length=25, blank=True, null=True)
116   
117   kit_1000148 = models.IntegerField(blank=True, null=True)
118   kit_1000147 = models.IntegerField(blank=True, null=True)
119   kit_1000183 = models.IntegerField(blank=True, null=True)
120   kit_1001625 = models.IntegerField(blank=True, null=True)
121   
122   cluster_station_id = models.CharField(max_length=50, blank=True, null=True)
123   sequencer_id = models.CharField(max_length=50, blank=True, null=True)
124   
125   notes = models.TextField(blank=True)
126
127   def __str__(self):
128     return '%s (%s)' % (self.flowcell_id, self.run_date) 
129   
130   class Meta:
131     ordering = ["-run_date"]
132   
133   class Admin:
134     date_hierarchy = "run_date"
135     save_as = True
136     save_on_top = True
137     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']
138     list_display = ('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')
139     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')
140     fields = (
141         (None, {
142             'fields': ('run_date', 'flowcell_id', ('read_length', 'advanced_run'),)
143         }),
144         ('Lanes:', {
145             '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'),)
146         }),
147         (None, {
148             'fields' : ('notes',)
149         }),
150         ('Kits & Machines:', {
151             'classes': 'collapse',
152             'fields' : (('kit_1000148', 'kit_1000147', 'kit_1000183', 'kit_1001625'), ('cluster_station_id', 'sequencer_id'),)
153         }),
154     )
155
156 class ElandResult(models.Model):
157   
158   class Admin: pass
159   
160   flow_cell = models.ForeignKey(FlowCell)
161   config_file = models.FileField(upload_to=settings.UPLOADTO_CONFIG_FILE)
162   eland_result_pack = models.FileField(upload_to=settings.UPLOADTO_ELAND_RESULT_PACKS)
163   bed_file_pack = models.FileField(upload_to=settings.UPLOADTO_BED_PACKS)
164   
165   notes = models.TextField(blank=True)