added some help text near the text boxes and added a new value in CALCS. NOTE: We...
[htsworkflow.git] / htswfrontend / htswfrontend / analys_track / models.py
1 from django.db import models
2 from datetime import datetime
3 from htswfrontend import settings
4 from htswfrontend.fctracker.models import Library 
5 from string import *
6
7 class Task(models.Model):
8   task_name = models.CharField(max_length=50,unique=True, db_index=True)
9   subject1 = models.ForeignKey(Library,related_name='sbj1_library',verbose_name="Subject1 (Signal/Hpa2)")
10   subject2 = models.ForeignKey(Library,related_name='sbj2_library',verbose_name="Subject2 (Control/Msp1)",blank=True,null=True)
11   CALCS = (
12       ('QuEST', 'QuEST Peak Calling'),
13       ('WingPeaks', 'Wing Peak Calling'),
14       ('MACS', 'MACS Peak Calling'),
15       ('qPCR', 'In Silico qPCR'),
16       ('CompareLibs', 'Compare Libaraies'),
17       ('ComparePeakCalls','Compare Peak Calls'),
18       ('ProfileReads','Profile Reads'),
19       ('Methylseq','Methylseq'),
20     )
21   apply_calc = models.CharField(max_length=50,choices=CALCS,verbose_name='Applied Calculation')
22   ## userid = # logged in user
23   task_params = models.CharField(max_length=200,blank=True,null=True,default="")
24   task_status = models.CharField(max_length=500,blank=True,null=True,default='defined')
25   results_location = models.CharField(max_length=2000,blank=True,null=True) 
26   submitted_on = models.DateTimeField(core=True,default=datetime.now())
27   run_note = models.CharField(max_length=500,blank=True,null=True)
28   
29   def __str__(self):
30       return '"%s" - %s on [%s]/[%s]' % (self.task_name,self.apply_calc,self.subject1,self.subject2)
31
32   def InProjects(self):
33       return '...'
34       ps = self.project_set.all()
35       pstr = 'In '
36       return pstr
37       for p in ps:
38         pstr += '%s, ' % (p.project_name) 
39       return pstr
40
41   class Admin:
42     list_display = ('task_name','apply_calc','subject1','subject2','task_params','InProjects','submitted_on','task_status')
43     list_filter = ('apply_calc',)
44     search_fields = ['task_name','id','=subject1__library_id','=subject2__library_id']
45     fields = (
46         (None, {
47           'fields': (('task_name'),('apply_calc'),('subject1'),('subject2'),('task_params'))
48            }),
49           ('system fields', {
50              'classes': 'collapse',
51            'fields': (('submitted_on'),('task_status','run_note'))
52           }),
53         )
54     
55     
56 class Project(models.Model):
57     project_name = models.CharField(max_length=50,unique=True, db_index=True)
58     tasks = models.ManyToManyField(Task,related_name='project_tasks',null=True,filter_interface=models.HORIZONTAL)
59     project_notes = models.CharField(max_length=500,blank=True,null=True)
60     
61     def __str__(self):
62       return '%s' % (self.project_name)
63
64     def ProjectTasks(self):
65       ptasks = self.tasks.all().order_by('id')
66       surl = settings.TASKS_PROJS_SERVER+'/projects/'
67       tstr = '<script>'
68       tstr += 'function togView(eid){'
69       tstr += 'f=document.getElementById(eid);'
70       tstr += 'if(f.height==0){'
71       tstr += 'f.height=600;'
72       tstr += 'f.style.border=\'solid #cccccc 3px\';'
73       tstr += '}else{'
74       tstr += 'f.height=0;'
75       tstr += 'f.style.border=\'none\';'
76       tstr += '}'
77       tstr += '}'
78       tstr += '</script>'
79       Style = ''
80       if len(ptasks) > 8:  Style = ' style="height:200px;overflow:auto" '
81       tstr += '<div '+Style+'>'
82       tstr += '<table><tr><th>Tasks</th><th>Job Status</th>'
83       isregistered = False
84       for t in ptasks:
85         taskdesc = t.task_name+'<div style="font-size:80%">Details: '+t.apply_calc+' on '+t.subject1.library_id
86         if t.subject2 is not None:
87           taskdesc += ' and '+t.subject2.library_id
88         taskdesc += ' (TaskId:'+t.id.__str__()+')'
89         tstr += '<tr><td width=250>%s</td><td>%s</td></tr>'  % (taskdesc,replace(t.task_status,'Complete','<span style="color:green;font-weight:bolder">Complete</span>'))
90         if t.task_status != 'defined': isregistered = True
91
92       tstr += '</table>'
93       tstr += '</div>' 
94       tstr += '<div>'
95       tstr += '<div align=center>'
96       if isregistered:
97         tstr += '<a onClick="togView(\'RFrame'+self.id.__str__()+'\');" href="'+surl+self.id.__str__()+'/" title="View Results Page" target="RFrame'+self.id.__str__()+'">VIEW PROJECT RESULTS</a>'
98         tstr += '<a href="'+surl+self.id.__str__()+'/" title="View Results Page" target="_blank" style="margin-left:10px">(view in new window)</a>'
99       else:
100         tstr += 'REGISTERING ...'    
101  
102       tstr += '</div>'    
103       tstr += '<iframe width="100%" height="0" frameborder="0" style="background-color:#ffffff" name="RFrame'+self.id.__str__()+'" id="RFrame'+self.id.__str__()+'"/></iframe>'
104       tstr += '</div>'
105       return tstr
106
107     ProjectTasks.allow_tags = True
108
109     def ProjTitle(self):
110       ptasks = self.tasks.all().order_by('id')
111       tasks_counter = '<span style="color:#666666;font-size:85%">('+len(ptasks).__str__() + ' tasks)</span>'
112       htmlstr = '%s<br/>%s'  % (self.project_name,tasks_counter)
113       return htmlstr
114
115     ProjTitle.allow_tags = True
116
117     class Admin:
118       list_display = ('ProjTitle','ProjectTasks')
119       list_filter = ()
120       search_fields = ['project_name','=tasks__subject1__library_id','=tasks__subject2__library_id','tasks__subject1__library_name','tasks__subject2__library_name','project_notes']
121       fields = (
122         (None, {
123           'fields': (('project_name'),('tasks'),('project_notes'))}),
124         )