rendered paste bodyfrom django.http import HttpResponse, HttpResponseRedirect
from django.template import Context, loader
import os
from align.bubu.models import RunningAlignment
from django.contrib.auth import authenticate, login, logout
from align.bubu.uuid import uuid1
from datetime import datetime
def getBasePath():
return '/home/wojtek/Dwork/Dtest/align/bubu/media/data/'
def makeDataFile(type, uid, basepath):
if(type == 1):
return basepath + 'in' + uid + '.fas'
elif(type == 20):
return basepath + 'out' + uid + '.fas'
elif(type == 21):
return basepath + 'in' + uid + '.aln'
elif(type == 3):
return basepath + 'prog' + uid + '.fas'
elif(type == 4):
return basepath + 'sa' + uid + '.showalign'
def index(request):
if not request.user.is_authenticated():
return(startLogin(request))
t = loader.get_template('index.html')
c = Context({'test' : 'test text', 'username' : request.user.username})
return HttpResponse(t.render(c))
def startProcess(algo, infile, outfile, progfile, fast):
if(algo == 'mafft'):
if(fast):
os.system('mafft ' + infile + ' > ' + outfile + ' 2> ' + progfile + ' & disown')
else:
os.system('mafft --retree 1 ' + infile + ' > ' + outfile + ' 2> ' + progfile + ' & disown')
else:
if(fast):
os.system('clustalw -infile=' + infile + ' -quicktree ' + ' > ' + progfile + ' & disown')
else:
os.system('clustalw -infile=' + infile + ' > ' + progfile + ' & disown')
def step1(request):
algo = request.REQUEST['algo']
# Get uuid for the communication files
uid = uuid1().hex
basepath = getBasePath()
infile = makeDataFile(1, uid, basepath)
if(algo=='mafft'):
outfile = makeDataFile(20, uid, basepath)
else:
outfile = makeDataFile(21, uid, basepath)
progfile = makeDataFile(3, uid, basepath)
# Copy the data fr4om submitted file to the alignment input file
data = request.FILES['afile']
infileF = open(infile, 'w')
infileF.write(data['content'])
infileF.close()
sfile = data['filename']
fast = False;
try:
fast = request.REQUEST['fast'] != None
except:
pass
if(sfile.startswith("/")):
sfile = sfile.split("/")[-1]
else:
sfile = sfile.split("\\")[-1]
sfile = sfile.split(".")[0]
# Create a new running alignment in the queue (start_date = NILL && end_date = NULL)
ra = RunningAlignment(user_name = request.user.username,
added_date = datetime.now(), start_date = None, end_date = None,
tmp_file = progfile, result_file = outfile, input_file = infile, uid = uid,
submit_file = sfile, algo = algo)
# check if there are any alignments currenlty running (start_date != NULL && end_date == NULL)
# If no other alignments are running, start the alignment for the uploaded file.
running = RunningAlignment.objects.filter(start_date__isnull=False, end_date__isnull=True)
if(len(running)==0):
ra.start_date = datetime.now()
startProcess(algo, infile, outfile, progfile, fast)
ra.save()
tab = progress(request)
tpl = loader.get_template('step1.html')
cnt = Context({'submit' : True, 'table' : tab, 'username' : request.user.username})
return HttpResponse(tpl.render(cnt))
def showStatus(request):
tab = progress(request)
tpl = loader.get_template('step1.html')
cnt = Context({'submit' : False, 'table' : tab, 'username' : request.user.username})
return HttpResponse(tpl.render(cnt))
def showDoc(request):
tpl = loader.get_template('doc.html')
cnt = Context({'username' : request.user.username})
return HttpResponse(tpl.render(cnt))
def doDelete(request, uid):
alignment = RunningAlignment.objects.filter(uid=uid)[0]
if(alignment.start_date != None):
if(alignment.algo == 'mafft'):
os.system('pkill mafft')
os.system('pkill disttbfast')
else:
os.system('pkill clustalw')
basepath = '/home/wojtek/Dwork/Dtest/align/bubu/media/data/'
delIfExists(makeDataFile(1, uid, basepath))
if(alignment.algo == 'mafft'):
delIfExists(makeDataFile(20, uid, basepath))
else:
delIfExists(makeDataFile(21, uid, basepath))
delIfExists(makeDataFile(3, uid, basepath))
alignment.delete()
return(HttpResponse(""))
def delIfExists(filename):
try:
os.remove(makeDataFile(1, uid, basepath))
except:
pass
def getShowAlign(infile, outfile):
os.system('showalign -sequence ' + infile + ' -outfile ' + outfile)
def progress(request):
allrunning = RunningAlignment.objects.filter(end_date__isnull=True, start_date__isnull=False)
if(len(allrunning) != 0):
running = allrunning[0]
if(running.algo == 'mafft'):
tmpfile = open(running.tmp_file, 'r')
tmpstr = tmpfile.read()
tmpfile.close()
if(tmpstr.rstrip().endswith("mafft page.")):
running.end_date = datetime.now()
getShowAlign(makeDataFile(20, running.uid, getBasePath()), makeDataFile(4, running.uid, getBasePath()))
running.save()
else:
try:
tmpfile = open(running.tmp_file, 'r')
tmpstr = tmpfile.read()
tmpfile.close()
if(tmpstr.rfind("CLUSTAL-Alignment file created") != -1):
running.end_date = datetime.now()
getShowAlign(makeDataFile(21, running.uid, getBasePath()), makeDataFile(4, running.uid, getBasePath()))
running.save()
except:
pass
allrunning = RunningAlignment.objects.filter(end_date__isnull=True, start_date__isnull=False)
if(len(allrunning) == 0):
queuedAndRunning = RunningAlignment.objects.filter(end_date__isnull=True, start_date__isnull=True).order_by('added_date')
if(len(queuedAndRunning) != 0):
torun = queuedAndRunning[0]
torun.start_date = datetime.now()
torun.save()
os.system('mafft ' + torun.input_file + ' > ' + torun.result_file + ' 2> ' + torun.tmp_file + ' & disown')
queuedAndRunning = RunningAlignment.objects.filter(end_date__isnull=True).order_by('-start_date', 'added_date')
finished = RunningAlignment.objects.filter(end_date__isnull=False).order_by('-start_date')
t = loader.get_template('progress.html')
c = Context({'running' : queuedAndRunning, 'finished' : finished, 'username' : request.user.username})
ret = t.render(c)
return ret
def doProgress(request):
return HttpResponse(progress(request))
def doFileProgress(request):
allrunning = RunningAlignment.objects.filter(end_date__isnull=True, start_date__isnull=False)
if(len(allrunning) != 0):
running = allrunning[0]
if(running.algo != 'mafft'):
return(HttpResponse("n/a"))
tmpfile = open(running.tmp_file, 'r')
tmpstr = tmpfile.read()
tmpfile.close()
if(tmpstr.rfind("STEP")==-1):
return(HttpResponse("0"))
progs = tmpstr[tmpstr.rfind("STEP"):].split(" ")
if(progs == ""):
return(HttpResponse("0"))
vals = filter(lambda x: x!='' and x!='STEP' and x!='f', progs)
try:
ret = 100*float(vals[0])/float(vals[2])
except:
return(HttpResponse("0"))
return(HttpResponse(str(round(ret))))
return(HttpResponse("0"))
def startLogin(request):
t = loader.get_template('startLogin.html')
c = Context()
return HttpResponse(t.render(c))
def doLogin(request):
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
login(request, user)
return index(request)
else:
return startLogin(request)
def getResultFile(request, uid):
align = RunningAlignment.objects.filter(uid=uid)[0]
if(align.algo == 'mafft'):
path = makeDataFile(20, uid, '/site_media/data/')
else:
path = makeDataFile(21, uid, '/site_media/data/')
return HttpResponseRedirect(path)
def getShowAlignFile(request, uid):
return HttpResponseRedirect(makeDataFile(4, uid, '/site_media/data/'))
def doLogout(request):
logout(request)
return index(request)