Commit bcd6101b authored by Marc Duez's avatar Marc Duez
parents 19baeeab 22d116a7
......@@ -38,8 +38,8 @@ RELEASE_TAG="notag"
RELEASE_H = $(VIDJIL_ALGO_SRC)/release.h
RELEASE_SOURCE = $(wildcard $(VIDJIL_ALGO_SRC)/*.cpp) $(wildcard $(VIDJIL_ALGO_SRC)/*.h) $(wildcard $(VIDJIL_ALGO_SRC)/core/*.cpp) $(wildcard $(VIDJIL_ALGO_SRC)/tests/*.cpp) $(wildcard $(VIDJIL_ALGO_SRC)/core/*.h) $(wildcard $(VIDJIL_ALGO_SRC)/tests/*.h)
RELEASE_MAKE = ./Makefile $(VIDJIL_ALGO_SRC)/Makefile $(VIDJIL_ALGO_SRC)/core/Makefile $(VIDJIL_ALGO_SRC)/tests/Makefile germline/Makefile data/Makefile
RELEASE_TESTS = data/get-sequences $(wildcard data/*.fa) $(wildcard data/*.fq) $(VIDJIL_ALGO_SRC)/tests/should-to-tap.sh $(wildcard $(VIDJIL_ALGO_SRC)/tests/*.should_get) $(wildcard $(VIDJIL_ALGO_SRC)/tests/bugs/*.fa) $(wildcard $(VIDJIL_ALGO_SRC)/tests/bugs/*.should_get)
RELEASE_FILES = $(RELEASE_SOURCE) $(RELEASE_TESTS) $(RELEASE_MAKE) germline/get-germline germline/split-from-imgt.py doc/README doc/LICENSE data/segmentation.fasta
RELEASE_TESTS = data/get-sequences $(wildcard data/*.fa) $(wildcard data/*.fq) $(VIDJIL_ALGO_SRC)/tests/should-to-tap.sh $(wildcard $(VIDJIL_ALGO_SRC)/tests/*.should_get) $(wildcard $(VIDJIL_ALGO_SRC)/tests/bugs/*.fa) $(wildcard $(VIDJIL_ALGO_SRC)/tests/bugs/*.should_get) $(VIDJIL_ALGO_SRC)/tests/format-json.sh
RELEASE_FILES = $(RELEASE_SOURCE) $(RELEASE_TESTS) $(RELEASE_MAKE) germline/get-germline germline/split-from-imgt.py doc/algo.org doc/LICENSE data/segmentation.fasta
RELEASE_ARCHIVE = vidjil-$(RELEASE_TAG).tgz
CURRENT_DIR = vidjil
......
!LAUNCH: ../../vidjil -G ../../germline/IGH -d ../../data/Stanford_S22.fasta ; python ../../server/fuse.py out/vidjil.data out/vidjil.data -o out/fused.data ; cat out/fused.data | sh format-json.sh
$ Points list
1:"point": [ "", "" ]
f1:"point": [ "", "" ]
$ Most abundant window, twice, fused
1:"window": "CCACCTATTACTGTACCCGGGAGGAACAATATAGCAGCTGGTACTTTGACTTCTGGGGCC", "id": .*, "size": [ 8, 8 ]
f1:"window": "CCACCTATTACTGTACCCGGGAGGAACAATATAGCAGCTGGTACTTTGACTTCTGGGGCC", "id": .*, "size": [ 8, 8 ]
# Fails since 49046ca6b97, no more 'others'
$ Windows that are not in the top 50
......
......@@ -935,10 +935,10 @@ span.logo {
border-collapse: collapse;
}
.db_table .column1 {
width: 25%;
width: 100px;
}
.db_table .column2 {
width: 100px;
width: 150px;
}
.db_table .column4 {
width: 50px;
......
......@@ -935,10 +935,10 @@ span.logo {
border-collapse: collapse;
}
.db_table .column1 {
width: 25%;
width: 100px;
}
.db_table .column2 {
width: 100px;
width: 150px;
}
.db_table .column4 {
width: 50px;
......
......@@ -1078,11 +1078,11 @@ span.logo
}
.db_table .column1{
width: 25%;
width: 100px;
}
.db_table .column2{
width: 100px;
width: 150px;
}
.db_table .column4{
......
This changelog concerns the algorithmic part (C++) of Vidjil.
2014-09-xx The Vidjil Team
* Export cause of non-segmentation in the .data
* New option to output segmented reads (-U), now by default segmented reads are not output one by one
* Updated .data .json output (the format will change again in a next release)
* Updated tests
2014-07-28 The Vidjil Team
* Better heuristic, segment more reads (core/affectanalyser.h, core/segment.cpp)
This improved heuristic was designed to implement a multi-germline analysis in a next release.
......
......@@ -233,6 +233,7 @@ applicable being removed:
A summary of extracted windows is also available in a JSON format,
including, for each windows, the number of reads sharing this window.
The format of this file may change in future releases.
This file is used by the dynamic browser for visualization
and analysis of clones and their tracking along different samples,
......
......@@ -27,7 +27,8 @@ obtained:
http://www.vidjil.org/submit.html or using any other method
(e.g. your own FTP)
- from the command-line version of Vidjil (starting from
.fasta/.fastq files, see doc/README in the command-line version)
.fasta/.fastq files, see doc/alog.org in the command-line version).
To gather several .data files, you have to use the [[../server/fuse.py][fuse.py]] script
- in a next release (start of 2015), you will be able to upload,
manage and process your runs (.fasta/.fastq files) directly on the browser (with
authentication to ensure that you keep the control on your data).
......@@ -37,7 +38,7 @@ obtained:
* First aid
- Go to the “file” menu to access your data.
- Go to the “file”/“import/export” menu to access your data.
Your files are protected with your login and password.
There is always a “sample/L2-LIL.data” dataset for demonstration purposes.
......
......@@ -20,13 +20,13 @@ if [ $# -ge 1 ]; then
DIR="$1/"
fi
now=$(date +"%Y_%m_%d")
now=$(date +"%Y-%m-%d_%H:%M:%S")
if [ $COMPLETE -eq 1 ]; then
filename="${DIR}backup_"$now
zip -r $filename web2py/applications/vidjil/uploads/ web2py/applications/vidjil/databases/
else
filename="${DIR}backup_essentials_"$now
zip -r $filename web2py/applications/vidjil/databases/ web2py/applications/vidjil/uploads/data_file* web2py/applications/vidjil/uploads/fused_file*
zip -r $filename web2py/applications/vidjil/databases/ web2py/applications/vidjil/uploads/results_file* web2py/applications/vidjil/uploads/fused_file*
fi
echo $filename
......@@ -741,14 +741,14 @@ def main():
parser = argparse.ArgumentParser(description= DESCRIPTION,
epilog='''Example:
python2 %(prog)s --germline IGH ../out/vidjil.data''',
python2 %(prog)s --germline IGH out/Diag/vidjil.data out/MRD-1/vidjil.data out/MRD-2/vidjil.data''',
formatter_class=argparse.RawTextHelpFormatter)
group_options = parser.add_argument_group() # title='Options and parameters')
group_options.add_argument('--test', action='store_true', help='run self-tests')
group_options.add_argument('--multi', action='store_true', help='merge multiple system')
group_options.add_argument('--multi', action='store_true', help='merge multiple systems (experimental)')
group_options.add_argument('--compress', '-c', action='store_true', help='compress point names, removing common substrings')
group_options.add_argument('--pipeline', '-p', action='store_true', help='compress point names (internal Bonsai pipeline)')
......
......@@ -10,22 +10,3 @@ if request.env.http_origin:
def index():
if auth.has_membership("admin"):
return dict(message=T(''))
def result():
if auth.has_membership("admin"):
return dict(message=T(''))
def run_all():
if auth.has_membership("admin"):
query = db(
(db.data_file.sequence_file_id==db.sequence_file.id)
& (db.data_file.config_id==db.config.id)
).select()
for row in query:
schedule_run(row.sequence_file.id, row.config.id)
res = {"success" : "true",
"message" : "rerun all"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
......@@ -87,8 +87,8 @@ def confirm():
def delete():
import shutil, os.path
#delete data_file using this config
db(db.data_file.config_id==request.vars["id"]).delete()
#delete results_file using this config
db(db.results_file.config_id==request.vars["id"]).delete()
#delete config
db(db.config.id==request.vars["id"]).delete()
......
......@@ -9,7 +9,7 @@
## - call exposes all registered services (none by default)
#########################################################################
import gluon.contrib.simplejson
import gluon.contrib.simplejson, time, datetime
if request.env.http_origin:
response.headers['Access-Control-Allow-Origin'] = request.env.http_origin
response.headers['Access-Control-Allow-Credentials'] = 'true'
......@@ -45,7 +45,7 @@ def run_request():
error += "id sequence file needed, "
if not "config_id" in request.vars:
error += "id config needed, "
if not auth.has_permission("run", "data_file") :
if not auth.has_permission("run", "results_file") :
error += "permission needed"
id_patient = db.sequence_file[request.vars["sequence_file_id"]].patient_id
......@@ -96,9 +96,9 @@ def get_data():
## récupération des infos stockées sur la base de données
query = db( ( db.patient.id == db.sequence_file.patient_id )
& ( db.data_file.sequence_file_id == db.sequence_file.id )
& ( db.results_file.sequence_file_id == db.sequence_file.id )
& ( db.patient.id == request.vars["patient_id"] )
& ( db.data_file.config_id == request.vars["config_id"] )
& ( db.results_file.config_id == request.vars["config_id"] )
).select( orderby=db.sequence_file.sampling_date )
data["samples"]["original_names"] = []
......@@ -145,20 +145,6 @@ def get_analysis():
if error == "" :
"""
## récupération des infos stockées sur la base de données
query = db( ( db.patient.id == db.sequence_file.patient_id )
& ( db.data_file.sequence_file_id == db.sequence_file.id )
& ( db.patient.id == request.vars["patient_id"] )
& ( db.data_file.config_id == request.vars["config_id"] )
).select( orderby=db.sequence_file.sampling_date )
order = 0
for row in query :
(filename, str) = db.sequence_file.data_file.retrieve(row.sequence_file.data_file)
res["samples"]["original_names"].append(filename)
res["samples"]["info_sequence_file"].append(row.sequence_file.info)
"""
res["info_patient"] = db.patient[request.vars["patient_id"]].info
res["patient"] = db.patient[request.vars["patient_id"]].first_name + " " + db.patient[request.vars["patient_id"]].last_name + " (" + db.config[request.vars["config_id"]].name + ")"
......@@ -205,14 +191,19 @@ def save_analysis():
f = request.vars['fileToUpload']
ts = time.time()
if not analysis_query.isempty() :
analysis_id = analysis_query.select().first().id
db.analysis_file[analysis_id] = dict(analysis_file = db.analysis_file.analysis_file.store(f.file, f.filename))
else:
db.analysis_file[analysis_id] = dict(analysis_file = db.analysis_file.analysis_file.store(f.file, f.filename),
analyze_date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
)
else:
analysis_id = db.analysis_file.insert(analysis_file = db.analysis_file.analysis_file.store(f.file, f.filename),
config_id = request.vars['config_id'],
patient_id = request.vars['patient_id'],
)
config_id = request.vars['config_id'],
patient_id = request.vars['patient_id'],
analyze_date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
)
patient_name = db.patient[request.vars['patient_id']].first_name + " " + db.patient[request.vars['patient_id']].last_name
......
......@@ -135,7 +135,7 @@ def delete():
if auth.has_permission('admin', 'patient', patient_id):
db(db.sequence_file.id == request.vars["id"]).delete()
db(db.data_file.sequence_file_id == request.vars["id"]).delete()
db(db.results_file.sequence_file_id == request.vars["id"]).delete()
res = {"redirect": "patient/info",
"args" : { "id" : patient_id},
......
......@@ -21,7 +21,6 @@ def index():
if not auth.user :
res = {"redirect" : "default/user/login"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
return dict(message=T(''))
......@@ -57,7 +56,8 @@ def add_form():
id = db.patient.insert(first_name=request.vars["first_name"],
last_name=request.vars["last_name"],
birth=request.vars["birth"],
info=request.vars["info"])
info=request.vars["info"],
id_label=request.vars["id_label"])
user_group = auth.user_group(auth.user.id)
......@@ -123,10 +123,11 @@ def edit_form():
db.patient[request.vars["id"]] = dict(first_name=request.vars["first_name"],
last_name=request.vars["last_name"],
birth=request.vars["birth"],
info=request.vars["info"]
info=request.vars["info"],
id_label=request.vars["id_label"]
)
res = {"redirect": "patient/index",
res = {"redirect": "back",
"message": "change saved"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
......@@ -158,7 +159,7 @@ def delete():
#delete data file
query = db( (db.sequence_file.patient_id==request.vars["id"])).select()
for row in query :
db(db.data_file.sequence_file_id == row.id).delete()
db(db.results_file.sequence_file_id == row.id).delete()
#delete sequence file
db(db.sequence_file.patient_id == request.vars["id"]).delete()
......@@ -174,42 +175,6 @@ def delete():
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
## display run page result
## need ["data_file_id"]
def result_info():
if (auth.has_permission('admin', 'patient', db.sequence_file[db.data_file[request.vars["data_file_id"]].sequence_file_id].patient_id ) ):
return dict(message=T('result info'))
else :
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
def result_confirm():
if (auth.has_permission('admin', 'patient', db.sequence_file[db.data_file[request.vars["data_file_id"]].sequence_file_id].patient_id )
& auth.has_permission("run", "data_file") ):
return dict(message=T('result confirm'))
else :
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
#
def result_delete():
if (auth.has_permission('admin', 'patient', db.sequence_file[db.data_file[request.vars["data_file_id"]].sequence_file_id].patient_id )
& auth.has_permission("run", "data_file") ):
config_id = db.data_file[request.vars["data_file_id"]].config_id
patient_id = db.sequence_file[db.data_file[request.vars["data_file_id"]].sequence_file_id].patient_id
db(db.data_file.id == request.vars["data_file_id"]).delete()
res = {"redirect": "patient/info",
"args" : { "id" : patient_id,
"config_id" : config_id},
"success": "true",
"message": "run ("+str(request.vars["id"])+") deleted"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
else :
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
#
def permission():
......
# coding: utf8
import gluon.contrib.simplejson
if request.env.http_origin:
response.headers['Access-Control-Allow-Origin'] = request.env.http_origin
response.headers['Access-Control-Allow-Credentials'] = 'true'
response.headers['Access-Control-Max-Age'] = 86400
## return admin_panel
def index():
if auth.has_membership("admin"):
return dict(message=T(''))
def run_all():
if auth.has_membership("admin"):
query = db(
(db.results_file_file.sequence_file_id==db.sequence_file.id)
& (db.results_file.config_id==db.config.id)
).select()
for row in query:
schedule_run(row.sequence_file.id, row.config.id)
res = {"success" : "true",
"message" : "rerun all"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
## display run page result
## need ["results_file_id"]
def info():
if (auth.has_permission('admin', 'patient', db.sequence_file[db.results_file[request.vars["results_file_id"]].sequence_file_id].patient_id ) ):
return dict(message=T('result info'))
else :
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
def confirm():
if (auth.has_permission('admin', 'patient', db.sequence_file[db.results_file[request.vars["results_file_id"]].sequence_file_id].patient_id )
& auth.has_permission("run", "results_file") ):
return dict(message=T('result confirm'))
else :
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
#
def delete():
if (auth.has_permission('admin', 'patient', db.sequence_file[db.results_file[request.vars["results_file_id"]].sequence_file_id].patient_id )
& auth.has_permission("run", "results_file") ):
config_id = db.results_file[request.vars["results_file_id"]].config_id
patient_id = db.sequence_file[db.results_file[request.vars["results_file_id"]].sequence_file_id].patient_id
#delete results_file
db(db.results_file.id == request.vars["results_file_id"]).delete()
#delete fused_file
count = db((db.patient.id == patient_id) &
(db.sequence_file.patient_id == db.patient.id) &
(db.sequence_file.id == db.results_file.sequence_file_id) &
(db.results_file.config_id == config_id)
).count()
if count == 0 :
db((db.fused_file.patient_id == patient_id ) &
(db.fused_file.config_id == config_id)
).delete()
res = {"redirect": "patient/info",
"args" : { "id" : patient_id,
"config_id" : config_id},
"success": "true",
"message": "run ("+str(request.vars["results_file_id"])+") deleted"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
else :
res = {"message": "acces denied"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
# coding: utf8
import gluon.contrib.simplejson
if request.env.http_origin:
response.headers['Access-Control-Allow-Origin'] = request.env.http_origin
response.headers['Access-Control-Allow-Credentials'] = 'true'
response.headers['Access-Control-Max-Age'] = 86400
def index():
if not auth.user :
res = {"redirect" : "default/user/login"}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
return dict(message=T('standard_list'))
def add():
return dict(message=T('add standard file'))
#TODO check data
def add_form():
import shutil, os.path
id = db.standard_file.insert(data_file = request.vars.file )
db.standard_file[id] = dict(name=request.vars['standard_name'],
info=request.vars['standard_info'])
res = {"success": "true" }
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
def edit():
return dict(message=T('edit standard file'))
def edit_form():
import shutil, os.path
error = ""
if request.vars["standard_name"] == "" :
error += "standard name needed, "
if error=="" :
db.standard_file[request.vars["id"]] = dict(name=request.vars['standard_name'],
info=request.vars['standard_info'])
res = {"success": "true" }
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
else :
res = {"success" : "false", "error" : error}
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
def confirm():
return dict(message=T('confirm standard deletion'))
def delete():
import shutil, os.path
query = db( (db.config.standard_id==request.vars["id"])).select()
for row in query :
#delete data file using old config
db(db.data_file.config_id == row.id).delete()
#delete config
db(db.config.id == row.id).delete()
#delete standard
db(db.standard_file.id == request.vars["id"]).delete()
res = {"success": "true" }
return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
......@@ -84,7 +84,9 @@ db.define_table('patient',
Field('first_name','string'),
Field('last_name','string'),
Field('birth','date'),
Field('info','text'))
Field('info','text'),
Field('id_label','string'),
)
'''
db.patient.first_name.requires = IS_NOT_EMPTY( error_message='input needed' )
......@@ -123,24 +125,24 @@ db.define_table('config',
Field('germline', 'string'))
db.define_table('data_file',
db.define_table('results_file',
Field('sequence_file_id', 'reference sequence_file'),
Field('config_id', 'reference config'),
Field('run_date','date'),
Field('run_date','datetime'),
Field('scheduler_task_id', 'integer'),
Field('data_file', 'upload', length=1000000000000, autodelete=True))
db.define_table('fused_file',
Field('patient_id', 'reference patient'),
Field('config_id', 'reference config'),
Field('fuse_date','date'),
Field('fuse_date','datetime'),
Field('status', 'string'),
Field('fused_file', 'upload', length=1000000000000, autodelete=True))
db.define_table('analysis_file',
Field('patient_id', 'reference patient'),
Field('config_id', 'reference config'),
Field('analyze_date','date'),
Field('analyze_date','datetime'),
Field('status', 'string'),
Field('analysis_file', 'upload', length=1000000000000, autodelete=True))
......@@ -167,13 +169,13 @@ if db(db.auth_user.id > 0).count() == 0:
##création des configs de base
id_config_TRG = db.config.insert(
name = 'TRG',
command = '-c clones -z 20 -R 1 -r 100 ',
command = '-c clones -z 100 -R 1 -r 1 ',
info = 'default trg config',
germline = 'TRG'
)
id_config_IGH = db.config.insert(
name = 'IGH',
command = '-c clones -z 20 -R 1 -r 100 ',
command = '-c clones -d -z 100 -R 1 -r 1 ',
info = 'default igh config',
germline = 'IGH'
)
......
......@@ -5,15 +5,15 @@ def schedule_run(id_sequence, id_config):
id_patient = db.sequence_file[id_sequence].patient_id
#check data_file
row = db( ( db.data_file.config_id == id_config ) &
( db.data_file.sequence_file_id == id_sequence )
#check results_file
row = db( ( db.results_file.config_id == id_config ) &
( db.results_file.sequence_file_id == id_sequence )
).select()
if len(row) > 0 : ## update
data_id = row[0].id
else: ## create
data_id = db.data_file.insert(sequence_file_id = id_sequence,
data_id = db.results_file.insert(sequence_file_id = id_sequence,
config_id = id_config )
## check fused_file
......@@ -40,18 +40,16 @@ def schedule_run(id_sequence, id_config):
return res
##add task to scheduller
##add task to scheduler
task = scheduler.queue_task('run', [id_sequence, id_config, data_id, fuse_id]
, repeats = 1, timeout = 6000)
db.data_file[data_id] = dict(scheduler_task_id = task.id)
db.results_file[data_id] = dict(scheduler_task_id = task.id)
(filename, str2) = db.sequence_file.data_file.retrieve(db.sequence_file[id_sequence].data_file)
filename= db.sequence_file[id_sequence].filename
config_name = db.config[id_config].name
patient_name = db.patient[id_patient].first_name + " " + db.patient[id_patient].last_name
res = {"redirect": "patient/info",
"args" : { "id" : id_patient,
"config_id" : id_config},
res = {"redirect": "reload",
"message": "default/run_request : request added to run config " + config_name + " on " + filename + " for " + patient_name }
return res
......@@ -90,14 +88,14 @@ def run_vidjil(id_file, id_config, id_data, id_fuse):
print p.stdout.read()
## récupération du fichier data.json généré
data_filepath = os.path.abspath(out_folder+"vidjil.data")
stream = open(data_filepath, 'rb')
results_filepath = os.path.abspath(out_folder+"vidjil.data")
stream = open(results_filepath, 'rb')
## insertion dans la base de donnée
ts = time.time()
db.data_file[id_data] = dict(status = "ready",
run_date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d'),
db.results_file[id_data] = dict(status = "ready",
run_date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'),
data_file = stream
)
......@@ -107,13 +105,13 @@ def run_vidjil(id_file, id_config, id_data, id_fuse):
output_file = out_folder+"result"
files = ""
query = db( ( db.patient.id == db.sequence_file.patient_id )
& ( db.data_file.sequence_file_id == db.sequence_file.id )
& ( db.results_file.sequence_file_id == db.sequence_file.id )
& ( db.patient.id == id_patient )
& ( db.data_file.config_id == id_config )
& ( db.results_file.config_id == id_config )
).select( orderby=db.sequence_file.sampling_date )
for row in query :
if row.data_file.data_file is not None :
files += os.path.abspath(os.path.dirname(sys.argv[0])) + "/applications/vidjil/uploads/"+row.data_file.data_file+" "
if row.results_file.data_file is not None :
files += os.path.abspath(os.path.dirname(sys.argv[0])) + "/applications/vidjil/uploads/"+row.results_file.data_file+" "
cmd = "python ../fuse.py -o "+output_file+" -t 100 -g "+vidjil_germline+" "+files
......@@ -123,7 +121,9 @@ def run_vidjil(id_file, id_config, id_data, id_fuse):
fuse_filepath = os.path.abspath(output_file)
stream = open(fuse_filepath, 'rb')
db.fused_file[id_fuse] = dict(fuse_date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d'),
ts = time.time()
db.fused_file[id_fuse] = dict(fuse_date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'),
fused_file = stream)
db.commit()
......
......@@ -4,4 +4,4 @@ Bientot vous trouverez içi un magnifique panneau d'administration, en attendant
<img src="http://upload.wikimedia.org/wikipedia/commons/3/3b/Rabbit_in_montana.jpg" style="width:200px; height:200px;">
</br>
<a class="button" onclick="db.call('admin/result');">liste des fichiers result (data)</a>
<a class="button" onclick="db.call('results_file/index');">liste des fichiers result (data)</a>
......@@ -7,7 +7,7 @@
<h3>{{=message}}</h3>
Are you sure you want to delete this config</br>
All data file using this config will also be deleted ({{=db(db.data_file.config_id==request.vars["id"]).count()}} data file(s) will be deleted).</br>
All data file using this config will also be deleted ({{=db(db.results_file.config_id==request.vars["id"]).count()}} data file(s) will be deleted).</br>
<div class="center">
<button onclick="db.call('config/delete', {'id' :'{{=request.vars["id"]}}'} )">continue</button>
......
......@@ -7,7 +7,7 @@
<h3>{{=message}}</h3>
Are you sure you want to delete this sequence file?</br>
This will also delete {{=db(db.data_file.sequence_file_id==request.vars["id"]).count()}} related result files.</br>
This will also delete {{=db(db.results_file.sequence_file_id==request.vars["id"]).count()}} related result files.</br>
This action cannot be undone.
<div class="center">
......
......@@ -4,53 +4,34 @@
<table>
<tbody>
<tr>
<td >
<label for="patient_first_name" id="patient_first_name__label"> First Name: </label>
</td>
<td >
<input class="string" id="patient_first_name" name="first_name" type="text" value=""><span>*</span>
</td>
<td >
</td>
<td ><label for="patient_first_name" id="patient_first_name__label"> First Name: </label><