(no commit message)
[htsworkflow.git] / htswfrontend / htswfrontend / exp_track / exptrack.py
1 # some core functions of the exp tracker module
2 from django.http import HttpResponse
3 from datetime import datetime
4 from string import *
5 import re
6 from htswfrontend import settings
7 from htswfrontend.exp_track.models import FlowCell, DataRun
8 from htswfrontend.fctracker.models import Library
9 from django.core.exceptions import ObjectDoesNotExist
10 from django.core.mail import send_mail, mail_admins
11
12 def updStatus(request):
13     output=''
14     user = 'none'
15     pswd = ''
16     UpdatedStatus = 'unknown'
17     fcid = 'none'
18     runfolder = 'unknown'
19     ClIP = request.META['REMOTE_ADDR']
20     granted = False    
21
22     if request.has_key('user'):
23       user = request['user']
24
25     #Check access permission 
26     if (user == 'rami' and settings.ALLOWED_IPS.has_key(ClIP)):  granted = True
27     if not granted: return HttpResponse("access denied.")
28
29
30     # ~~~~~~Parameters for the job ~~~~
31     if request.has_key('fcid'):
32       fcid = request['fcid']
33     else:
34       return HttpResponse('missing fcid')
35     
36     if request.has_key('runf'):
37       runfolder = request['runf']
38     else:
39       return HttpResponse('missing runf')
40
41     
42     if request.has_key('updst'):
43       UpdatedStatus = request['updst']
44     else:
45       return HttpResponse('missing status')
46     
47     # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
48
49     # Update Data Run status in DB
50     # Try get rec. If not found return 'entry not found + <fcid><runfolder>', if found try update and return updated 
51     try:
52       rec = DataRun.objects.get(run_folder=runfolder)
53       rec.run_status = UpdatedStatus
54
55       #if there's a message update that too
56       mytimestamp = datetime.now().__str__()
57       mytimestamp = re.sub(pattern=":[^:]*$",repl="",string=mytimestamp)
58       if request.has_key('msg'):
59         rec.run_note += ", "+request['msg']+" ("+mytimestamp+")"
60       else :
61         if UpdatedStatus == '1':
62           rec.run_note = "Started ("+mytimestamp+")"
63           rec.run_start_time = datetime.now()
64
65       rec.save()
66       output = "Hello "+settings.ALLOWED_IPS[ClIP]+". Updated to:'"+DataRun.RUN_STATUS_CHOICES[int(UpdatedStatus)][1].__str__()+"'"
67     except ObjectDoesNotExist:
68       output = "entry not found: "+fcid+", "+runfolder
69
70
71     #Notify researcher by email
72     # Doesn't work
73     #send_mail('Exp Tracker', 'Data Run Status '+output, 'rrauch@stanford.edu', ['rrrami@gmail.com'], fail_silently=False)
74     #mail_admins("test subject", "testing , testing", fail_silently=False)
75     # gives error: (49, "Can't assign requested address")
76     return HttpResponse(output)
77
78 def generateConfile(request,fcid):
79     try:                                                                                                                                              
80       rec = FlowCell.objects.get(flowcell_id=fcid)
81       cnfgfile = 'READ_LENGTH 36\n'  # 25
82       if rec.is_paired_end:
83         cnfgfile += 'ANALYSIS eland_pair\n'
84       else:
85         cnfgfile += 'ANALYSIS eland_extended\n'
86       cnfgfile += 'GENOME_FILE all_chr.fa\n'
87       cnfgfile += 'ELAND_MULTIPLE_INSTANCES 8\n'
88       genome_dir = 'GENOME_DIR /mnt/encodedisk6/genomes/' # /Volumes/Genomes/
89       eland_genome = 'ELAND_GENOME /mnt/encodedisk6/genomes/'  # /Volumes/Genomes/
90
91       cnfgfile += '1:'+genome_dir+rec.lane_1_library.library_species.use_genome_build+'\n'
92       cnfgfile += '1:'+eland_genome+rec.lane_1_library.library_species.use_genome_build+'\n'
93
94       cnfgfile += '2:'+genome_dir+rec.lane_2_library.library_species.use_genome_build+'\n'
95       cnfgfile += '2:'+eland_genome+rec.lane_2_library.library_species.use_genome_build+'\n'
96  
97       cnfgfile += '3:'+genome_dir+rec.lane_3_library.library_species.use_genome_build+'\n'
98       cnfgfile += '3:'+eland_genome+rec.lane_3_library.library_species.use_genome_build+'\n'
99
100       cnfgfile += '4:'+genome_dir+rec.lane_4_library.library_species.use_genome_build+'\n'
101       cnfgfile += '4:'+eland_genome+rec.lane_4_library.library_species.use_genome_build+'\n'
102       
103       cnfgfile += '5:'+genome_dir+rec.lane_5_library.library_species.use_genome_build+'\n'
104       cnfgfile += '5:'+eland_genome+rec.lane_5_library.library_species.use_genome_build+'\n'
105
106       cnfgfile += '6:'+genome_dir+rec.lane_6_library.library_species.use_genome_build+'\n'
107       cnfgfile += '6:'+eland_genome+rec.lane_6_library.library_species.use_genome_build+'\n'
108
109       cnfgfile += '7:'+genome_dir+rec.lane_7_library.library_species.use_genome_build+'\n'
110       cnfgfile += '7:'+eland_genome+rec.lane_7_library.library_species.use_genome_build+'\n'
111
112       cnfgfile += '8:'+genome_dir+rec.lane_8_library.library_species.use_genome_build+'\n'
113       cnfgfile += '8:'+eland_genome+rec.lane_8_library.library_species.use_genome_build
114
115     except ObjectDoesNotExist:
116       cnfgfile = 'Entry not found for fcid  = '+fcid
117
118     return cnfgfile
119
120 def OLD_getConfile(request):
121     granted = False
122     ClIP = request.META['REMOTE_ADDR']
123     if (settings.ALLOWED_IPS.has_key(ClIP)):  granted = True
124
125     if not granted: return HttpResponse("access denied. IP: "+ClIP)
126
127     fcid = 'none'
128     cnfgfile = ''
129     runfolder = 'unknown'
130     if request.has_key('fcid'):
131       fcid = request['fcid']
132       if request.has_key('runf'):
133         runfolder = request['runf']
134         try:
135           rec = DataRun.objects.get(run_folder=runfolder) #,flowcell_id=fcid)
136           cnfgfile = rec.config_params
137           match_str = re.compile('^READ_LENGTH.+')
138           if not match_str.search(cnfgfile):
139             cnfgfile = generateConfile(request,fcid)
140             if match_str.search(cnfgfile):
141               rec = DataRun.objects.get(run_folder=runfolder) #,flowcell_id=fcid)
142               rec.config_params = cnfgfile
143               rec.save()
144             else:
145               cnfgfile = 'Failed generating config params for RunFolder = '+runfolder +', Flowcell id = '+ fcid+ ' Config Text:\n'+cnfgfile  
146             
147         except ObjectDoesNotExist:
148           cnfgfile = 'Entry not found for RunFolder = '+runfolder
149
150     return HttpResponse(cnfgfile)
151
152
153 def getConfParams(request):
154     granted = False
155     ClIP = request.META['REMOTE_ADDR']
156     if (settings.ALLOWED_IPS.has_key(ClIP)):  granted = True
157     if not granted: return HttpResponse("access denied. IP: "+ClIP)
158     fcid = 'none'
159     paramstext = ''
160     
161     if request.has_key('fcid'):
162       fcid = request['fcid']
163       try:
164         rec = FlowCell.objects.get(flowcell_id=fcid)
165         paramstext =  'Lane:'+  rec.lane_1_library.library_id +':'+rec.lane_1_library.library_species.use_genome_build
166         paramstext += '\nLane:'+rec.lane_2_library.library_id +':'+rec.lane_2_library.library_species.use_genome_build
167         paramstext += '\nLane:'+rec.lane_3_library.library_id +':'+rec.lane_3_library.library_species.use_genome_build
168         paramstext += '\nLane:'+rec.lane_4_library.library_id +':'+rec.lane_4_library.library_species.use_genome_build
169         paramstext += '\nLane:'+rec.lane_5_library.library_id +':'+rec.lane_5_library.library_species.use_genome_build
170         paramstext += '\nLane:'+rec.lane_6_library.library_id +':'+rec.lane_6_library.library_species.use_genome_build
171         paramstext += '\nLane:'+rec.lane_7_library.library_id +':'+rec.lane_7_library.library_species.use_genome_build
172         paramstext += '\nLane:'+rec.lane_8_library.library_id +':'+rec.lane_8_library.library_species.use_genome_build
173         if rec.is_paired_end: paramstext += '\nIsPairedEnd::1'
174         else: paramstext += '\nIsPairedEnd::0'
175
176       except ObjectDoesNotExist:
177         paramstext = 'Flowcell entry not found for:  '+fcid
178     else: 
179       paramstext = 'missing input - flowcell id'
180
181     return HttpResponse(paramstext)
182
183
184 def getLaneLibs(request):
185     granted = False
186     ClIP = request.META['REMOTE_ADDR']
187     if (settings.ALLOWED_IPS.has_key(ClIP)):  granted = True
188
189     if not granted: return HttpResponse("access denied.")
190
191     fcid = 'none'
192     outputfile = ''
193     if request.has_key('fcid'):
194       fcid = request['fcid']                                                                                                      
195       try:                                
196         rec = FlowCell.objects.get(flowcell_id=fcid)
197         #Ex: 071211
198         year = datetime.today().year.__str__()
199         year = replace(year,'20','')
200         month = datetime.today().month
201         if month < 10: month = "0"+month.__str__()
202         else: month = month.__str__() 
203         day = datetime.today().day
204         if day < 10: day = "0"+day.__str__()
205         else: day = day.__str__()
206         mydate = year+month+day
207         outputfile = '<?xml version="1.0" ?>'
208         outputfile += '\n<SolexaResult Date="'+mydate+'" Flowcell="'+fcid+'" Client="'+settings.ALLOWED_IPS[ClIP]+'">'
209         outputfile += '\n<Lane Index="1" Name="'+rec.lane_1_library.library_name+'" Library="'+rec.lane_1_library.library_id+'" Genome="'+rec.lane_1_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
210         outputfile += '\n<Lane Index="2" Name="'+rec.lane_2_library.library_name+'" Library="'+rec.lane_2_library.library_id+'" Genome="'+rec.lane_2_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
211         outputfile += '\n<Lane Index="3" Name="'+rec.lane_3_library.library_name+'" Library="'+rec.lane_3_library.library_id+'" Genome="'+rec.lane_3_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
212         outputfile += '\n<Lane Index="4" Name="'+rec.lane_4_library.library_name+'" Library="'+rec.lane_4_library.library_id+'" Genome="'+rec.lane_4_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
213         outputfile += '\n<Lane Index="5" Name="'+rec.lane_5_library.library_name+'" Library="'+rec.lane_5_library.library_id+'" Genome="'+rec.lane_5_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
214         outputfile += '\n<Lane Index="6" Name="'+rec.lane_6_library.library_name+'" Library="'+rec.lane_6_library.library_id+'" Genome="'+rec.lane_6_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
215         outputfile += '\n<Lane Index="7" Name="'+rec.lane_7_library.library_name+'" Library="'+rec.lane_7_library.library_id+'" Genome="'+rec.lane_7_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
216         outputfile += '\n<Lane Index="8" Name="'+rec.lane_8_library.library_name+'" Library="'+rec.lane_8_library.library_id+'" Genome="'+rec.lane_8_library.library_species.use_genome_build+'" PrimerName="" PrimerSeq=""/>'
217         outputfile += '\n</SolexaResult>'
218       except ObjectDoesNotExist:
219         outputfile = 'Flowcell entry not found for: '+fcid
220     else: outputfile = 'Missing input: flowcell id'
221
222     return HttpResponse(outputfile)