Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
genotoul-bioinfo
jflow
Commits
137fd65e
Commit
137fd65e
authored
Sep 24, 2014
by
Frédéric Escudié
Browse files
Fix serialisation bug with DateParameter.
parent
c0924f6e
Changes
7
Hide whitespace changes
Inline
Side-by-side
application.properties
View file @
137fd65e
...
...
@@ -28,6 +28,8 @@ limit_submission = 100
server_socket_host
=
127.0.0.1
# on which socket port should run the web server
server_socket_port
=
8080
# date format
date_format
=
%d/%m/%Y
[email]
# if you want an email to be sent at the end of the workflow execution
...
...
bin/jflow_server.py
View file @
137fd65e
...
...
@@ -22,6 +22,7 @@ import json
import
sys
from
functools
import
wraps
import
time
import
datetime
import
os
import
argparse
import
logging
...
...
@@ -76,6 +77,12 @@ def CORS():
cherrypy
.
response
.
headers
[
'Access-Control-Allow-Headers'
]
=
'Content-Type, Content-Range, Content-Disposition'
cherrypy
.
tools
.
CORS
=
cherrypy
.
Tool
(
'before_finalize'
,
CORS
)
class
JFlowJSONEncoder
(
json
.
JSONEncoder
):
def
default
(
self
,
obj
):
if
isinstance
(
obj
,
(
datetime
.
date
,
datetime
.
datetime
)):
return
obj
.
strftime
(
JFlowConfigReader
().
get_date_format
()
)
else
:
return
json
.
JSONEncoder
.
default
(
self
,
obj
)
class
JFlowServer
(
object
):
...
...
@@ -94,7 +101,7 @@ class JFlowServer (object):
value
=
func
(
*
args
,
**
kw
)
cherrypy
.
response
.
headers
[
"Content-Type"
]
=
"application/json"
# if JSONP request
if
kw
.
has_key
(
"callback"
):
return
kw
[
"callback"
]
+
"("
+
json
.
dumps
(
value
)
+
")"
if
kw
.
has_key
(
"callback"
):
return
kw
[
"callback"
]
+
"("
+
json
.
dumps
(
value
,
cls
=
JFlowJSONEncoder
)
+
")"
# else return the JSON
else
:
return
json
.
dumps
(
value
)
return
wrapper
...
...
@@ -146,7 +153,7 @@ class JFlowServer (object):
"start_time"
:
start_time
,
"end_time"
:
end_time
,
"components"
:
components
}
return
status
@
cherrypy
.
expose
...
...
@@ -173,9 +180,19 @@ class JFlowServer (object):
"name"
:
param
.
name
,
"display_name"
:
param
.
display_name
,
"group"
:
param
.
group
}
if
hash_param
[
"type"
]
==
"date"
:
hash_param
[
"format"
]
=
self
.
jflow_config_reader
.
get_date_format
()
if
hash_param
[
"format"
]
==
'%d/%m/%Y'
:
hash_param
[
"format"
]
=
'dd/mm/yyyy'
elif
hash_param
[
"format"
]
==
'%d/%m/%y'
:
hash_param
[
"format"
]
=
'dd/mm/yy'
elif
hash_param
[
"format"
]
==
'%Y/%m/%d'
:
hash_param
[
"format"
]
=
'yyyy/mm/dd'
elif
hash_param
[
"format"
]
==
'%y/%m/%d'
:
hash_param
[
"format"
]
=
'yy/mm/dd'
# if it's a multiple type add sub parameters
if
type
(
param
.
type
)
==
jflow
.
parameter
.
MultipleParameters
:
hash_param
[
"sub_parameters"
]
=
[]
hash_param
[
"sub_parameters"
]
=
[]
for
sub_param
in
param
.
sub_parameters
:
hash_param
[
"sub_parameters"
].
append
({
"help"
:
sub_param
.
help
,
"required"
:
sub_param
.
required
,
...
...
@@ -186,6 +203,16 @@ class JFlowServer (object):
"name"
:
param
.
name
+
JFlowServer
.
MULTIPLE_TYPE_SPLITER
+
sub_param
.
flag
,
"display_name"
:
sub_param
.
display_name
,
"group"
:
param
.
group
})
if
hash_param
[
"type"
]
==
"date"
:
hash_param
[
"format"
]
=
self
.
jflow_config_reader
.
get_date_format
()
if
hash_param
[
"format"
]
==
'%d/%m/%Y'
:
hash_param
[
"format"
]
=
'dd/mm/yyyy'
elif
hash_param
[
"format"
]
==
'%d/%m/%y'
:
hash_param
[
"format"
]
=
'dd/mm/yy'
elif
hash_param
[
"format"
]
==
'%Y/%m/%d'
:
hash_param
[
"format"
]
=
'yyyy/mm/dd'
elif
hash_param
[
"format"
]
==
'%y/%m/%d'
:
hash_param
[
"format"
]
=
'yy/mm/dd'
parameters
.
append
(
hash_param
)
if
parameters_per_groups
.
has_key
(
param
.
group
):
parameters_per_groups
[
param
.
group
].
append
(
hash_param
)
...
...
@@ -202,27 +229,26 @@ class JFlowServer (object):
@
cherrypy
.
expose
@
jsonify
def
run_workflow
(
self
,
**
kwargs
):
try
:
kwargs_modified
=
{}
for
key
in
kwargs
.
keys
():
parts
=
key
.
split
(
JFlowServer
.
MULTIPLE_TYPE_SPLITER
)
try
:
kwargs_modified
=
{}
for
key
in
kwargs
.
keys
():
parts
=
key
.
split
(
JFlowServer
.
MULTIPLE_TYPE_SPLITER
)
# if this is a classic Parameter
if
len
(
parts
)
==
1
:
kwargs_modified
[
key
]
=
kwargs
[
key
]
if
len
(
parts
)
==
1
:
kwargs_modified
[
key
]
=
kwargs
[
key
]
# if this is a MultiParameter
elif
len
(
parts
)
==
2
:
if
kwargs_modified
.
has_key
(
parts
[
0
]):
kwargs_modified
[
parts
[
0
]].
append
((
parts
[
1
],
kwargs
[
key
]))
else
:
kwargs_modified
[
parts
[
0
]]
=
[(
parts
[
1
],
kwargs
[
key
])]
elif
len
(
parts
)
==
2
:
if
kwargs_modified
.
has_key
(
parts
[
0
]):
kwargs_modified
[
parts
[
0
]].
append
((
parts
[
1
],
kwargs
[
key
]))
else
:
kwargs_modified
[
parts
[
0
]]
=
[(
parts
[
1
],
kwargs
[
key
])]
# if this is a MultiParameterList
# TODO: du cote interface faire qq chose du genre: key.sub_key.1 ... donc si len == 3
# l'objectif etant d'avoir une structure de type: [[(sub_key1: val), (sub_key2: val)], [(sub_key1: val2), (sub_key2: val2)]]
workflow
=
self
.
wfmanager
.
run_workflow
(
kwargs_modified
[
"workflow_class"
],
kwargs_modified
)
return
{
"status"
:
0
,
"content"
:
self
.
jsonify_workflow_status
(
workflow
,
True
)
}
except
Exception
as
err
:
return
{
"status"
:
1
,
"content"
:
str
(
err
)
}
workflow
=
self
.
wfmanager
.
run_workflow
(
kwargs_modified
[
"workflow_class"
],
kwargs_modified
)
return
{
"status"
:
0
,
"content"
:
self
.
jsonify_workflow_status
(
workflow
,
True
)
}
except
Exception
as
err
:
return
{
"status"
:
1
,
"content"
:
str
(
err
)
}
@
cherrypy
.
expose
@
jsonify
...
...
src/jflow/config_reader.py
View file @
137fd65e
...
...
@@ -73,7 +73,14 @@ class JFlowConfigReader(object):
sys
.
stderr
.
write
(
"Error: 'makeflow' path connot be retrieved either in the PATH and in the application.properties file!
\n
"
)
sys
.
exit
(
1
)
return
exec_path
def
get_date_format
(
self
):
try
:
date_format
=
self
.
reader
.
get
(
"global"
,
"date_format"
)
except
:
raise
Error
(
"Failed when parsing the config file, no parameter date_format!"
)
return
date_format
def
get_batch
(
self
):
try
:
type
=
self
.
reader
.
get
(
"global"
,
"batch_system_type"
)
...
...
src/jflow/parameter.py
View file @
137fd65e
...
...
@@ -587,6 +587,14 @@ class DateParameter(datetime.datetime, AbstractParameter):
else
:
return
(
True
if
datetime
.
date
(
self
.
year
,
self
.
month
,
self
.
day
)
else
False
)
def
__reduce__
(
self
):
return
(
DateParameter
,
(
self
.
name
,
self
.
help
,
self
.
default
,
date
,
self
.
choices
,
self
.
required
,
self
.
flag
,
self
.
sub_parameters
,
self
.
group
,
self
.
display_name
),
None
,
None
,
None
)
def
__reduce_ex__
(
self
,
protocol
):
return
(
DateParameter
,
(
self
.
name
,
self
.
help
,
self
.
default
,
date
,
self
.
choices
,
self
.
required
,
self
.
flag
,
self
.
sub_parameters
,
self
.
group
,
self
.
display_name
),
None
,
None
,
None
)
class
AbstractInputFile
(
AbstractIOFile
):
"""
...
...
@@ -616,7 +624,7 @@ class AbstractInputFile(AbstractIOFile):
return
[
file_path
,
True
]
except
:
return
[
input
,
False
]
def
check
(
self
,
ifile
):
try
:
eval
(
self
.
file_format
)
...
...
@@ -673,7 +681,7 @@ class InputFile(StrParameter, AbstractInputFile):
if
is_local
:
new_path
=
input
self
.
check
(
new_path
)
return
new_path
class
OutputFile
(
StrParameter
,
AbstractOutputFile
):
...
...
src/jflow/workflow.py
View file @
137fd65e
...
...
@@ -100,7 +100,7 @@ class Workflow(threading.Thread):
if
type
:
self
.
engine_arguments
+=
' -T '
+
type
if
options
:
self
.
engine_arguments
+=
' -B "'
+
options
+
'"'
except
:
self
.
engine_arguments
=
None
self
.
id
=
id
self
.
name
=
self
.
get_name
()
self
.
description
=
self
.
get_description
()
...
...
@@ -669,14 +669,14 @@ class Workflow(threading.Thread):
# if post processing has ne been done yet
if
self
.
step
==
3
:
self
.
post_process
()
if
self
.
status
==
self
.
STATUS_STARTED
:
self
.
status
=
self
.
STATUS_COMPLETED
if
self
.
status
==
self
.
STATUS_STARTED
:
self
.
status
=
self
.
STATUS_COMPLETED
self
.
end_time
=
time
.
time
()
self
.
_serialize
()
self
.
_send_email
()
except
:
logging
.
getLogger
(
"wf."
+
str
(
self
.
id
)).
exception
(
"RunWorflowException"
)
raise
def
_update_status_from_log
(
self
):
# first update the status from weaver folders
# TODO update self.end_time
...
...
src/js/jflow-wfform.js
View file @
137fd65e
...
...
@@ -508,7 +508,7 @@ jQuery.validator.addMethod("exclude_required", function(value, element, options)
'
</select>
'
,
// if param is a date
'
{{else param.type == "date"}}
'
,
'
<div class="input-append date" data-date="${param.default}" data-date-format="
dd/mm/yyyy
">
'
,
'
<div class="input-append date" data-date="${param.default}" data-date-format="
${param.format}
">
'
,
'
<input id="${param.name}" name="${param.name}" class="${param.group} ${input_size} span2" type="text" value="${param.default}">
'
,
'
<button class="btn" type="button"><i class="icon-calendar"></i></button>
'
,
'
</div>
'
,
...
...
workflows/types.py
View file @
137fd65e
...
...
@@ -17,12 +17,12 @@
import
argparse
import
datetime
from
jflow.config_reader
import
JFlowConfigReader
def
date
(
datestr
):
try
:
return
datetime
.
datetime
.
strptime
(
datestr
,
'%d/%m/%Y'
)
return
datetime
.
datetime
.
strptime
(
datestr
,
JFlowConfigReader
().
get_date_format
()
)
except
:
raise
argparse
.
ArgumentTypeError
(
"'"
+
datestr
+
"' is an invalid date!"
)
\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment