changed Tasks&Projects Server to illumin-mac.stanford... and put that in a global...
[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="Subject")
10   subject2 = models.ForeignKey(Library,related_name='sbj2_library',verbose_name="Subject 2 / Control",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     )
20   apply_calc = models.CharField(max_length=50,choices=CALCS,verbose_name='Applied Calculation')
21   ## userid = # logged in user
22   task_params = models.CharField(max_length=200,blank=True,null=True,default="")
23   task_status = models.CharField(max_length=500,blank=True,null=True,default='defined')
24   results_location = models.CharField(max_length=2000,blank=True,null=True) 
25   submitted_on = models.DateTimeField(core=True,default=datetime.now())
26   run_note = models.CharField(max_length=500,blank=True,null=True)
27   
28   def __str__(self):
29       return '"%s" - %s on [%s]/[%s]' % (self.task_name,self.apply_calc,self.subject1,self.subject2)
30
31   def InProjects(self):
32       return '...'
33       ps = self.project_set.all()
34       pstr = 'In '
35       return pstr
36       for p in ps:
37         pstr += '%s, ' % (p.project_name) 
38       return pstr
39
40   class Admin:
41     list_display = ('task_name','apply_calc','subject1','subject2','task_params','InProjects','submitted_on','task_status')
42     list_filter = ('apply_calc',)
43     search_fields = ['task_name','id','=subject1__library_id','=subject2__library_id']
44     fields = (
45         (None, {
46           'fields': (('task_name'),('apply_calc'),('subject1'),('subject2'),('task_params'))
47            }),
48           ('system fields', {
49              'classes': 'collapse',
50            'fields': (('submitted_on'),('task_status','run_note'))
51           }),
52         )
53     
54     
55 class Project(models.Model):
56     project_name = models.CharField(max_length=50,unique=True, db_index=True)
57     tasks = models.ManyToManyField(Task,related_name='project_tasks',null=True,filter_interface=models.HORIZONTAL)
58     project_notes = models.CharField(max_length=500,blank=True,null=True)
59     
60     def __str__(self):
61       return '%s' % (self.project_name)
62
63     def ProjectTasks(self):
64       ptasks = self.tasks.all().order_by('id')
65       surl = settings.TASKS_PROJS_SERVER+'/projects/'
66       tstr = '<script>'
67       tstr += 'function togView(eid){'
68       tstr += 'f=document.getElementById(eid);'
69       tstr += 'if(f.height==0){'
70       tstr += 'f.height=600;'
71       tstr += 'f.style.border=\'solid #cccccc 3px\';'
72       tstr += '}else{'
73       tstr += 'f.height=0;'
74       tstr += 'f.style.border=\'none\';'
75       tstr += '}'
76       tstr += '}'
77       tstr += '</script>'
78       Style = ''
79       if len(ptasks) > 8:  Style = ' style="height:200px;overflow:auto" '
80       tstr += '<div '+Style+'>'
81       tstr += '<table><tr><th>Tasks</th><th>Job Status</th>'
82       isregistered = False
83       for t in ptasks:
84         taskdesc = t.task_name+'<div style="font-size:80%">Details: '+t.apply_calc+' on '+t.subject1.library_id
85         if t.subject2 is not None:
86           taskdesc += ' and '+t.subject2.library_id
87         taskdesc += ' (TaskId:'+t.id.__str__()+')'
88         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>'))
89         if t.task_status != 'defined': isregistered = True
90
91       tstr += '</table>'
92       tstr += '</div>' 
93       tstr += '<div>'
94       tstr += '<div align=center>'
95       if isregistered:
96         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>'
97         tstr += '<a href="'+surl+self.id.__str__()+'/" title="View Results Page" target="_blank" style="margin-left:10px">(view in new window)</a>'
98       else:
99         tstr += 'REGISTERING ...'    
100  
101       tstr += '</div>'    
102       tstr += '<iframe width="100%" height="0" frameborder="0" style="background-color:#ffffff" name="RFrame'+self.id.__str__()+'" id="RFrame'+self.id.__str__()+'"/></iframe>'
103       tstr += '</div>'
104       return tstr
105
106     ProjectTasks.allow_tags = True
107
108     def ProjTitle(self):
109       ptasks = self.tasks.all().order_by('id')
110       tasks_counter = '<span style="color:#666666;font-size:85%">('+len(ptasks).__str__() + ' tasks)</span>'
111       htmlstr = '%s<br/>%s'  % (self.project_name,tasks_counter)
112       return htmlstr
113
114     ProjTitle.allow_tags = True
115
116     class Admin:
117       list_display = ('ProjTitle','ProjectTasks')
118       list_filter = ()
119       search_fields = ['project_name','=tasks__subject1__library_id','=tasks__subject2__library_id','tasks__subject1__library_name','tasks__subject2__library_name','project_notes']
120       fields = (
121         (None, {
122           'fields': (('project_name'),('tasks'),('project_notes'))}),
123         )