Added options to stopping_point dropdown. Also changed how admin is displayed.
[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.IntegerField(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       ('Progress', 'In progress'),
42       ('Gel', 'Unpurified gel'),
43       ('1A', 'Purified gel'),
44       ('PCR', 'Ligation, then PCR'),
45       ('1Ab', 'Ligation, PCR, then gel'),
46       ('1Aa', 'Ligation, gel, then PCR'),
47       ('2A', 'Ligation, PCR, gel, PCR'),
48       ('Done', 'Completed'),
49     )
50   stopping_point = models.CharField(max_length=50, choices=PROTOCOL_END_POINTS)
51   amplified_from_sample = models.ForeignKey('self', blank=True, null=True)
52   
53   undiluted_concentration = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
54   ten_nM_dilution = models.BooleanField()
55   successful_pM = models.IntegerField(blank=True, null=True)
56   
57   notes = models.TextField(blank=True)
58   
59   def __str__(self):
60     return '#%s: %s' % (self.library_id, self.library_name)
61   
62   class Meta:
63     verbose_name_plural = "libraries"
64     ordering = ["-library_id"]
65   
66   class Admin:
67     date_hierarchy = "creation_date"
68     save_as = True
69     save_on_top = True
70     search_fields = ['library_name', 'library_id']
71     list_display = ('library_id', 'library_name', 'made_for', 'library_species', 'creation_date', 'stopping_point')
72     list_display_links = ('library_id', 'library_name')
73     list_filter = ('stopping_point', 'library_species', 'made_for', 'made_by')
74     fields = (
75         (None, {
76             'fields': (('library_id', 'library_name'), ('library_species', 'RNAseq'),)
77         }),
78         ('Creation Information:', {
79             'fields' : (('made_for', 'made_by', 'creation_date'), ('stopping_point', 'amplified_from_sample'), ('undiluted_concentration'), 'notes',)
80         }),
81         ('Run Information:', {
82             'fields' : (('ten_nM_dilution','successful_pM'),)
83         }),
84     )
85
86 class FlowCell(models.Model):
87   
88   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
89   run_date = models.DateTimeField(core=True)
90   advanced_run = models.BooleanField(default=False)
91   read_length = models.IntegerField(default=32)
92   
93   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
94   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
95   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
96   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
97   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
98   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
99   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
100   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
101
102   lane_1_pM = models.IntegerField(default=4)
103   lane_2_pM = models.IntegerField(default=4)
104   lane_3_pM = models.IntegerField(default=4)
105   lane_4_pM = models.IntegerField(default=4)
106   lane_5_pM = models.IntegerField(default=4)
107   lane_6_pM = models.IntegerField(default=4)
108   lane_7_pM = models.IntegerField(default=4)
109   lane_8_pM = models.IntegerField(default=4)
110   
111   lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
112   lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
113   lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
114   lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
115   lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
116   lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
117   lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
118   lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
119   
120   notes = models.TextField(blank=True)
121
122   def __str__(self):
123     return '%s (%s)' % (self.flowcell_id, self.run_date) 
124   
125   class Meta:
126     ordering = ["-run_date"]
127   
128   class Admin:
129     date_hierarchy = "run_date"
130     save_on_top = True
131     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']
132     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')
133     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')
134     fields = (
135         (None, {
136             'fields': ('run_date', 'flowcell_id', ('read_length', 'advanced_run'),)
137         }),
138         ('Lanes:', {
139             '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'),)
140         }),
141         (None, {
142             'fields' : ('notes',)
143         }),
144     )
145
146 class ElandResult(models.Model):
147   
148   class Admin: pass
149   
150   flow_cell = models.ForeignKey(FlowCell)
151   config_file = models.FileField(upload_to=settings.UPLOADTO_CONFIG_FILE)
152   eland_result_pack = models.FileField(upload_to=settings.UPLOADTO_ELAND_RESULT_PACKS)
153   bed_file_pack = models.FileField(upload_to=settings.UPLOADTO_BED_PACKS)
154   
155   notes = models.TextField(blank=True)