# some core functions of the exp tracker module
-from django.http import HttpResponse
-from datetime import datetime
-from string import *
+from datetime import datetime, timedelta
+import os
import re
+
+from django.http import HttpResponse
from htsworkflow.frontend import settings
from htsworkflow.frontend.experiments.models import FlowCell, DataRun
from htsworkflow.frontend.samples.models import Library
fcid = 'none'
runfolder = 'unknown'
ClIP = request.META['REMOTE_ADDR']
- granted = False
- if request.has_key('user'):
- user = request['user']
-
- #Check access permission
- if (user == 'rami' and settings.ALLOWED_IPS.has_key(ClIP)): granted = True
- if not granted: return HttpResponse("access denied.")
+ if hasattr(request, 'user'):
+ user = request.user
+ #Check access permission
+ if not (user.is_superuser and settings.ALLOWED_IPS.has_key(ClIP)):
+ return HttpResponse("%s access denied from %s." % (user, ClIP))
# ~~~~~~Parameters for the job ~~~~
- if request.has_key('fcid'):
- fcid = request['fcid']
+ if request.REQUEST.has_key('fcid'):
+ fcid = request.REQUEST['fcid']
else:
return HttpResponse('missing fcid')
- if request.has_key('runf'):
- runfolder = request['runf']
+ if request.REQUEST.has_key('runf'):
+ runfolder = request.REQUEST['runf']
else:
return HttpResponse('missing runf')
- if request.has_key('updst'):
- UpdatedStatus = request['updst']
+ if request.REQUEST.has_key('updst'):
+ UpdatedStatus = request.REQUEST['updst']
else:
return HttpResponse('missing status')
#if there's a message update that too
mytimestamp = datetime.now().__str__()
mytimestamp = re.sub(pattern=":[^:]*$",repl="",string=mytimestamp)
- if request.has_key('msg'):
- rec.run_note += ", "+request['msg']+" ("+mytimestamp+")"
+ if request.REQUEST.has_key('msg'):
+ rec.run_note += ", "+request.REQUEST['msg']+" ("+mytimestamp+")"
else :
if UpdatedStatus == '1':
rec.run_note = "Started ("+mytimestamp+")"
#if not granted: return HttpResponse("access denied.")
- cnfgfile = 'READ_LENGTH 25\n'
- cnfgfile += 'ANALYSIS eland\n'
- cnfgfile += 'GENOME_FILE all_chr.fa\n'
- cnfgfile += 'ELAND_MULTIPLE_INSTANCES 8\n'
+ config = ['READ_LENGTH 25']
+ config += ['ANALYSIS eland']
+ config += ['GENOME_FILE all_chr.fa']
+ config += ['ELAND_MULTIPLE_INSTANCES 8']
genome_dir = 'GENOME_DIR /Volumes/Genomes/'
eland_genome = 'ELAND_GENOME /Volumes/Genomes/'
try:
- rec = FlowCell.objects.get(flowcell_id=fcid)
+ fc = FlowCell.objects.get(flowcell_id=fcid)
+ for lane in fc.lane_set.all():
+ print dir(lane.library.library_species)
+ config += [ str(lane.lane_number) +":" + \
+ genome_dir + lane.library.library_species.scientific_name ]
+ config += [ str(lane.lane_number) +":" + \
+ eland_genome + lane.library.library_species.scientific_name ]
- cnfgfile += '1:'+genome_dir+rec.lane_1_library.library_species.use_genome_build+'\n'
- cnfgfile += '1:'+eland_genome+rec.lane_1_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '2:'+genome_dir+rec.lane_2_library.library_species.use_genome_build+'\n'
- cnfgfile += '2:'+eland_genome+rec.lane_2_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '3:'+genome_dir+rec.lane_3_library.library_species.use_genome_build+'\n'
- cnfgfile += '3:'+eland_genome+rec.lane_3_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '4:'+genome_dir+rec.lane_4_library.library_species.use_genome_build+'\n'
- cnfgfile += '4:'+eland_genome+rec.lane_4_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '5:'+genome_dir+rec.lane_5_library.library_species.use_genome_build+'\n'
- cnfgfile += '5:'+eland_genome+rec.lane_5_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '6:'+genome_dir+rec.lane_6_library.library_species.use_genome_build+'\n'
- cnfgfile += '6:'+eland_genome+rec.lane_6_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '7:'+genome_dir+rec.lane_7_library.library_species.use_genome_build+'\n'
- cnfgfile += '7:'+eland_genome+rec.lane_7_library.library_species.use_genome_build+'\n'
-
- cnfgfile += '8:'+genome_dir+rec.lane_8_library.library_species.use_genome_build+'\n'
- cnfgfile += '8:'+eland_genome+rec.lane_8_library.library_species.use_genome_build
-
except ObjectDoesNotExist:
- cnfgfile = 'Entry not found for fcid = '+fcid
+ config = 'Entry not found for fcid = '+fcid
- return cnfgfile
+ return os.linesep.join(config)
def getConfile(req):
granted = False
else: outputfile = 'Missing input: flowcell id'
return HttpResponse(outputfile, mimetype='text/plain')
+
+def estimateFlowcellDuration(flowcell):
+ """
+ Attempt to estimate how long it will take to run a flowcell
+
+ """
+ # (3600 seconds * 1.5 hours per cycle )
+ sequencing_seconds_per_cycle= 3600 * 1.5
+ # 800 is a rough guess
+ pipeline_seconds_per_cycle = 800
+
+ cycles = flowcell.read_length
+ if flowcell.paired_end:
+ cycles *= 2
+ sequencing_time = timedelta(0, cycles * sequencing_seconds_per_cycle)
+ analysis_time = timedelta(0, cycles * pipeline_seconds_per_cycle)
+ estimate_mid = sequencing_time + analysis_time
+ # floor estimate_mid
+ estimate_low = timedelta(estimate_mid.days, 0)
+ # floor estimate_mid and add a day
+ estimate_high = timedelta(estimate_mid.days+1, 0)
+
+ return (estimate_low, estimate_high)
+
+
+def makeUserLaneMap(flowcell):
+ """
+ Given a flowcell return a mapping of users interested in
+ the libraries on those lanes.
+ """
+ users = {}
+
+ for lane in flowcell.lane_set.all():
+ for affiliation in lane.library.affiliations.all():
+ for user in affiliation.users.all():
+ users.setdefault(user,[]).append(lane)
+
+ return users
+
+def makeUserLibrarMap(libraries):
+ """
+ Given an interable set of libraries return a mapping or
+ users interested in those libraries.
+ """
+ users = {}
+
+ for library in libraries:
+ for affiliation in library.affiliations.all():
+ for user in affiliation.users.all():
+ users.setdefault(user,[]).append(library)
+
+ return users