Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Carlos Ramos Carreño
erp5
Commits
35bc8338
Commit
35bc8338
authored
May 05, 2015
by
wenjie.zheng
Committed by
Sebastien Robin
Jul 16, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Base.py: MERGE ALL TOGETHER.
parent
2ff4d690
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
16 additions
and
315 deletions
+16
-315
product/ERP5Type/Base.py
product/ERP5Type/Base.py
+16
-315
No files found.
product/ERP5Type/Base.py
View file @
35bc8338
...
...
@@ -123,119 +123,6 @@ def resetRegisteredERP5WorkflowMethod(portal_type=None):
for
method
in
erp5workflow_method_registry
:
method
.
reset
(
portal_type
=
portal_type
)
class
ERP5WorkflowMethod
(
Method
):
### to get the name of the class
def
__init__
(
self
,
method
,
id
=
None
,
reindex
=
1
):
self
.
_m
=
method
if
id
is
None
:
self
.
_transition_id
=
method
.
__name__
else
:
self
.
_transition_id
=
id
LOG
(
"134 initializing method '%s'"
%
self
.
_transition_id
,
WARNING
,
" in Base.py"
)
if
not
method
.
__name__
.
startswith
(
'_'
):
self
.
__name__
=
method
.
__name__
for
func_id
in
[
'func_code'
,
'func_defaults'
,
'func_dict'
,
'func_doc'
,
'func_globals'
,
'func_name'
]:
setattr
(
self
,
func_id
,
getattr
(
method
,
func_id
,
None
))
self
.
_invoke_once
=
{}
self
.
_invoke_always
=
{}
# Store in a dict all workflow IDs which require to
# invoke wrapWorkflowMethod at every call
# during the same transaction
def
getTransitionId
(
self
):
return
self
.
_transition_id
def
__call__
(
self
,
instance
,
*
args
,
**
kw
):
LOG
(
"148 Calling method '%s' by '%s'"
%
(
self
.
_transition_id
,
instance
.
getId
()),
WARNING
,
" in Base.py"
)
if
getattr
(
self
,
'__name__'
,
None
)
in
(
'getPhysicalPath'
,
'getId'
,):
return
self
.
_m
(
instance
,
*
args
,
**
kw
)
# Build a list of transitions which may need to be invoked
instance_path
=
instance
.
getPhysicalPath
()
portal_type
=
instance
.
portal_type
transactional_variable
=
getTransactionalVariable
()
invoke_once_dict
=
self
.
_invoke_once
.
get
(
portal_type
,
{})
valid_invoke_once_item_list
=
[]
# Only keep those transitions which were never invoked
once_transition_dict
=
{}
# New implementation does not use any longer wrapWorkflowMethod
# but directly calls the workflow methods
for
wf_id
,
transition_list
in
invoke_once_dict
.
iteritems
():
valid_transition_list
=
[]
for
transition_id
in
transition_list
:
once_transition_key
=
(
'Products.ERP5Type.Base.ERP5WorkflowMethod.__call__'
,
wf_id
,
transition_id
,
instance_path
)
once_transition_dict
[(
wf_id
,
transition_id
)]
=
once_transition_key
if
once_transition_key
not
in
transactional_variable
:
valid_transition_list
.
append
(
transition_id
)
if
valid_transition_list
:
valid_invoke_once_item_list
.
append
((
wf_id
,
valid_transition_list
))
LOG
(
"173 _invoke_always list contains: '%s'"
%
self
.
_invoke_always
,
WARNING
,
" in Base.py"
)
candidate_transition_item_list
=
valid_invoke_once_item_list
+
\
self
.
_invoke_always
.
get
(
portal_type
,
{}).
items
()
# Try to return immediately if there are no transition to invoke
if
not
candidate_transition_item_list
:
return
apply
(
self
.
__dict__
[
'_m'
],
(
instance
,)
+
args
,
kw
)
try
:
wf_module
=
instance
.
getPortalObject
().
portal_workflow
except
AttributeError
:
return
self
.
_m
(
instance
,
*
arge
,
**
kw
)
valid_transition_item_list
=
[]
for
wf_id
,
transition_list
in
candidate_transition_item_list
:
valid_list
=
[]
workflow
=
wf_module
.
_getOb
(
wf_id
)
for
transition_id
in
transition_list
:
LOG
(
"191 Type '%s' is checking transition '%s' of workflow '%s'"
%
(
instance
.
getPortalType
(),
transition_id
,
wf_id
),
WARNING
,
" in Base.py"
)
if
workflow
.
isERP5WorkflowMethodSupported
(
instance
,
workflow
.
_getOb
(
transition_id
)):
valid_list
.
append
(
transition_id
)
once_transition_key
=
once_transition_dict
.
get
((
wf_id
,
transition_id
))
transactional_variable
[
once_transition_key
]
=
1
else
:
raise
UnsupportedWorkflowMethod
(
instance
,
wf_id
,
transition_id
)
if
valid_list
:
valid_transition_item_list
.
append
((
wf_id
,
valid_list
))
result
=
apply
(
self
.
__dict__
[
'_m'
],
(
instance
,)
+
args
,
kw
)
### zwj: Execute method
for
wf_id
,
transition_list
in
valid_transition_item_list
:
try
:
for
tr_id
in
transition_list
:
method
=
wf_module
.
_getOb
(
wf_id
).
_getOb
(
tr_id
)
LOG
(
" 208 executing method '%s' of workflow '%s'"
%
(
tr_id
,
wf_id
),
WARNING
,
" in Base.py"
)
method
.
execute
(
instance
)
except
ObjectDeleted
:
raise
ObjectDeleted
(
result
)
except
ObjectMoved
,
ex
:
raise
ObjectMoved
(
ex
.
getNewObject
(),
result
)
def
registerERP5TransitionAlways
(
self
,
portal_type
,
workflow_id
,
transition_id
):
LOG
(
" 216 register transition-always '%s' of workflow '%s'"
%
(
transition_id
,
workflow_id
),
WARNING
,
" in Base.py"
)
transition_list
=
self
.
_invoke_always
.
setdefault
(
portal_type
,
{}).
setdefault
(
workflow_id
,
[])
if
transition_id
not
in
transition_list
:
transition_list
.
append
(
transition_id
)
self
.
registerERP5
()
def
registerERP5TransitionOncePerTransaction
(
self
,
portal_type
,
workflow_id
,
transition_id
):
LOG
(
" 222 register transition-once '%s' of workflow '%s'"
%
(
transition_id
,
worfklow_id
),
WARNING
,
" in Base.py"
)
transition_list
=
self
.
_invoke_once
.
setdefault
(
portal_type
,
{}).
setdefault
(
workflow_id
,
[])
if
transition_id
not
in
transition_list
:
transition_list
.
append
(
transition_id
)
self
.
registerERP5
()
def
registerERP5
(
self
):
erp5workflow_method_registry
.
append
(
self
)
def
reset
(
self
,
portal_type
=
None
):
if
portal_type
:
self
.
_invoke_once
[
portal_type
]
=
{}
self
.
_invoke_always
[
portal_type
]
=
{}
else
:
self
.
_invoke_once
=
{}
self
.
_invoke_always
=
{}
### ==========================================================================
class
WorkflowMethod
(
Method
):
def
__init__
(
self
,
method
,
id
=
None
,
reindex
=
1
):
...
...
@@ -342,7 +229,8 @@ class WorkflowMethod(Method):
# a run-once transition, prevent it from running again in
# the same transaction
transactional_variable
[
once_transition_key
]
=
1
elif
candidate_workflow
.
__class__
.
__name__
==
'DCWorkflowDefinition'
:
elif
candidate_workflow
.
__class__
.
__name__
==
'DCWorkflowDefinition'
or
\
candidate_workflow
.
__class__
.
__name__
==
'Workflow'
:
raise
UnsupportedWorkflowMethod
(
instance
,
wf_id
,
transition_id
)
# XXX Keep the log for projects that needs to comment out
# the previous line.
...
...
@@ -642,195 +530,7 @@ def getClassPropertyList(klass):
if
p
not
in
ps_list
])
return
ps_list
def
initializePortalTypeERP5WorkflowMethod
(
ptype_klass
,
portal_workflow
):
portal_type
=
ptype_klass
.
__name__
workflow_dict
=
{}
interaction_workflow_dict
=
{}
portal_workflow
=
aq_inner
(
portal_workflow
)
portal_type_module
=
portal_workflow
.
getPortalObject
().
getDefaultModule
(
portal_type
=
"portal_types"
)
portal_type_value
=
portal_type_module
.
_getOb
(
portal_type
,
None
)
for
ERP5Workflow
in
portal_workflow
.
getWorkflowValueListFor
(
portal_type_value
):
ERP5Workflow_id
=
ERP5Workflow
.
getId
()
workflow_type
=
ERP5Workflow
.
__class__
.
__name__
LOG
(
" 661 initializing portal type '%s' "
%
ptype_klass
.
__name__
,
WARNING
,
" in Base.py"
)
LOG
(
" 664 Found Workflow type = %s"
%
workflow_type
,
WARNING
,
" in Base.py."
)
if
workflow_type
==
'Workflow'
or
workflow_type
==
'DCWorkflowDefinition'
:
state_var
=
ERP5Workflow
.
getStateVariable
()
LOG
(
" 666 Found Workflow '%s' with state_var '%s'"
%
(
ERP5Workflow_id
,
state_var
),
WARNING
,
" in Base.py."
)
for
method_id
,
getter
in
(
(
'get%s'
%
UpperCase
(
state_var
),
WorkflowState
.
Getter
),
(
'get%sTitle'
%
UpperCase
(
state_var
),
WorkflowState
.
TitleGetter
),
(
'getTranslated%s'
%
UpperCase
(
state_var
),
WorkflowState
.
TranslatedGetter
),
(
'getTranslated%sTitle'
%
UpperCase
(
state_var
),
WorkflowState
.
TranslatedTitleGetter
),
(
'serialize%s'
%
UpperCase
(
state_var
),
WorkflowState
.
SerializeGetter
),
):
method
=
getter
(
method_id
,
ERP5Workflow_id
)
ptype_klass
.
registerAccessor
(
method
,
Permissions
.
AccessContentsInformation
)
if
workflow_type
==
'Workflow'
:
LOG
(
" 681 Generating methods of Workflow type workflow '%s'"
%
ERP5Workflow_id
,
WARNING
,
" in Base.py"
)
transition_id_list
=
[]
#ERP5Workflow.objectIds(portal_type='Transition')
transition_list
=
ERP5Workflow
.
objectValues
(
portal_type
=
'Transition'
)
for
tr
in
transition_list
:
transition_id_list
.
append
(
tr
.
getReference
())
### getRef, this id list is actually a reference list
LOG
(
" 686 transition_id_list = '%s'"
%
transition_id_list
,
WARNING
,
" in Base.py"
)
elif
workflow_type
==
'DCWorkflowDefinition'
:
LOG
(
" 688 Generating methods of DCWorkflow '%s'"
%
ERP5Workflow_id
,
WARNING
,
" in Base.py"
)
transition_id_list
=
ERP5Workflow
.
transitions
transition_list
=
[]
for
transition_id
in
transition_id_list
:
LOG
(
" 692 register transition '%s' to transition_list"
%
transition_id
,
WARNING
,
" in Base.py"
)
transition
=
ERP5Workflow
.
transitions
.
get
(
transition_id
)
transition_list
.
append
(
transition
)
storage
=
workflow_dict
elif
workflow_type
==
'Interaction Workflow'
or
workflow_type
==
'InteractionWorkflowDefinition'
:
if
workflow_type
==
'Interaction Workflow'
:
LOG
(
" 698 Generating methods of Interaction Workflow '%s'"
%
ERP5Workflow_id
,
WARNING
,
' in Base.py'
)
transition_id_list
=
[]
transition_list
=
ERP5Workflow
.
objectValues
(
portal_type
=
'Interaction'
)
for
tr
in
transition_list
:
transition_id_list
.
append
(
tr
.
getReference
())
# remove suffinx
LOG
(
" 703 transition_id_list = '%s'"
%
transition_id_list
,
WARNING
,
' in Base.py'
)
elif
workflow_type
==
'InteractionWorkflowDefinition'
:
LOG
(
" 705 Generating methods of DC Interaction Workflow '%s'"
%
ERP5Workflow_id
,
WARNING
,
' in Base.py'
)
transition_id_list
=
ERP5Workflow
.
interactions
transition_list
=
[]
for
interaction_id
in
transition_id_list
:
interaction
=
ERP5Workflow
.
interactions
.
get
(
interaction_id
)
transition_list
.
append
(
interaction
)
storage
=
interaction_workflow_dict
else
:
LOG
(
"Please check workflow list definded. '%s' '%s' is ignored "
%
(
workflow_type
,
ERP5Workflow_id
),
WARNING
,
"in Base.py/initializePortalTypeWorkflowMethod."
)
continue
### zwj: compatibility for Interaction Workflow and Workflow ===============
transition_id_set
=
set
(
transition_id_list
)
trigger_dict
=
{}
for
transition
in
transition_list
:
transition_id
=
transition
.
getReference
()
LOG
(
"722 Found transition '%s'"
%
transition_id
,
WARNING
,
" in Base.py"
)
if
transition
.
trigger_type
==
TRIGGER_WORKFLOW_METHOD
:
LOG
(
"723 Register Trigger by workflow method transition %s"
%
transition_id
,
WARNING
,
" in Base.py"
)
trigger_dict
[
transition_id
]
=
transition
storage
[
ERP5Workflow_id
]
=
(
transition_id_set
,
trigger_dict
)
### zwj: generate Workflow methods
for
ERP5Workflow_id
,
v
in
workflow_dict
.
iteritems
():
LOG
(
"730 Generating methods of Workflow '%s'"
%
ERP5Workflow_id
,
WARNING
,
" in Base.py"
)
transition_id_set
,
trigger_dict
=
v
for
tr_id
,
tdef
in
trigger_dict
.
iteritems
():
LOG
(
"733 processing transition '%s' of '%s'"
%
(
tr_id
,
ERP5Workflow_id
),
WARNING
,
"in Base.py"
)
method_id
=
convertToMixedCase
(
tr_id
)
LOG
(
" 731 register transition '%s' as method '%s'"
%
(
tr_id
,
method_id
),
WARNING
,
" in Base.py"
)
try
:
method
=
getattr
(
ptype_klass
,
method_id
)
except
AttributeError
:
LOG
(
"738 processing new method '%s'"
%
method_id
,
WARNING
,
" in Base.py."
)
ptype_klass
.
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
method_id
)
ptype_klass
.
registerERP5WorkflowMethod
(
method_id
,
ERP5Workflow_id
,
tr_id
,
0
)
continue
LOG
(
"743 check if method '%s' is callable"
%
method_id
,
WARNING
,
" in Base.py"
)
# Wrap method
if
not
callable
(
method
):
LOG
(
'initializePortalTypeDynamicWorkflowMethods'
,
100
,
'WARNING! Can not initialize %s on %s'
%
\
(
method_id
,
portal_type
))
continue
LOG
(
"751 check if workflow method '%s' is an ERP5 WorkflowMethod"
%
method_id
,
WARNING
,
" in Base.py"
)
if
not
isinstance
(
method
,
ERP5WorkflowMethod
):
method
=
ERP5WorkflowMethod
(
method
,
method_id
)
setattr
(
ptype_klass
,
method_id
,
method
)
else
:
transition_id
=
method
.
getTransitionId
()
if
transition_id
in
transition_id_set
:
method
.
registerERP5TransitionAlways
(
portal_type
,
ERP5Workflow_id
,
transition_id
)
method
.
registerERP5TransitionAlways
(
portal_type
,
ERP5Workflow_id
,
tr_id
)
### zwj: generate interaction workflow methods
if
not
interaction_workflow_dict
:
return
class_method_id_list
=
ptype_klass
.
getClassMethodIdList
(
ptype_klass
)
interaction_queue
=
[]
LOG
(
" 767 Initializing Interaction Workflow methods"
,
WARNING
,
" in Base.py"
)
for
wf_id
,
v
in
interaction_workflow_dict
.
iteritems
():
transition_id_set
,
trigger_dict
=
v
for
tr_id
,
tdef
in
trigger_dict
.
iteritems
():
# check portal type filter
LOG
(
" 772 processing transition '%s' of workflow '%s'"
%
(
tdef
.
getId
(),
wf_id
),
WARNING
,
" in Base.py."
)
type_filter
=
list
(
tdef
.
portal_type_filter
)
if
(
type_filter
!=
[]
and
portal_type
not
in
type_filter
):
continue
# check portal type group filter
group_filter
=
list
(
tdef
.
portal_type_group_filter
)
### not use property sheet accessor
if
group_filter
!=
[]:
getPortalGroupedTypeSet
=
portal_workflow
.
getPortalObject
().
_getPortalGroupedTypeSet
if
not
any
(
portal_type
in
getPortalGroupedTypeSet
(
portal_type_group
)
for
portal_type_group
in
group_filter
):
continue
# gather trigger method id
if
list
(
tdef
.
method_id
)
==
[]:
raise
NotImplementedError
(
"Please give a trigger method for interaction: %s in interaction workflow: %s."
%
(
tr_id
,
wf_id
))
for
imethod_id
in
list
(
tdef
.
method_id
):
if
wildcard_interaction_method_id_match
(
imethod_id
):
method_id_matcher
=
re
.
compile
(
imethod_id
).
match
# queue transitions using regexps for later examination
interaction_queue
.
append
((
wf_id
,
tr_id
,
transition_id_set
,
tdef
.
once_per_transaction
,
method_id_matcher
))
method_id_list
=
filter
(
method_id_matcher
,
class_method_id_list
)
else
:
method_id_list
=
[
imethod_id
]
for
method_id
in
method_id_list
:
method
=
getattr
(
ptype_klass
,
method_id
,
_MARKER
)
if
method
is
_MARKER
:
if
method_id
not
in
ptype_klass
.
security
.
names
:
ptype_klass
.
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
method_id
)
ptype_klass
.
registerERP5WorkflowMethod
(
method_id
,
wf_id
,
tr_id
,
tdef
.
once_per_transaction
)
continue
# wrap method
if
not
callable
(
method
):
LOG
(
'initializePortalTypeDynamicWorkflowMethods'
,
100
,
'WARNING! Can not initialize %s on %s'
%
\
(
method_id
,
portal_type
))
continue
if
not
isinstance
(
method
,
ERP5WorkflowMethod
):
method
=
ERP5WorkflowMethod
(
method
,
method_id
)
setattr
(
ptype_klass
,
method_id
,
method
)
else
:
transition_id
=
method
.
getTransitionId
()
if
transition_id
in
transition_id_set
:
method
.
registerERP5TransitionAlways
(
portal_type
,
wf_id
,
transition_id
)
if
tdef
.
once_per_transaction
:
method
.
registerERP5TransitionOncePerTransaction
(
portal_type
,
wf_id
,
tr_id
)
else
:
method
.
registerERP5TransitionAlways
(
portal_type
,
wf_id
,
tr_id
)
if
not
interaction_queue
:
return
new_method_set
=
set
(
ptype_klass
.
getWorkflowMethodIdList
())
added_method_set
=
new_method_set
.
difference
(
class_method_id_list
)
for
wf_id
,
tr_id
,
transition_id_set
,
once
,
method_id_matcher
in
interaction_queue
:
for
method_id
in
filter
(
method_id_matcher
,
added_method_set
):
# method must already exist and be a workflow method
method
=
getattr
(
ptype_klass
,
method_id
)
transition_id
=
method
.
getTransitionId
()
if
transition_id
in
transition_id_set
:
method
.
registerERP5TransitionAlways
(
portal_type
,
wf_id
,
transition_id
)
if
once
:
method
.
registerERP5TransitionOncePerTransaction
(
portal_type
,
wf_id
,
tr_id
)
else
:
method
.
registerERP5TransitionAlways
(
portal_type
,
wf_id
,
tr_id
)
def
initializePortalTypeDynamicWorkflowMethods
(
ptype_klass
,
portal_workflow
):
def
initializePortalTypeWorkflowMethods
(
ptype_klass
,
portal_workflow
):
"""We should now make sure workflow methods are defined
and also make sure simulation state is defined."""
# aq_inner is required to prevent extra name lookups from happening
...
...
@@ -841,15 +541,15 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow):
portal_workflow
=
aq_inner
(
portal_workflow
)
portal_type
=
ptype_klass
.
__name__
dc_
workflow_dict
=
{}
workflow_dict
=
{}
interaction_workflow_dict
=
{}
for
wf
in
portal_workflow
.
getWorkflow
s
For
(
portal_type
):
wf_id
=
wf
.
id
for
wf
in
portal_workflow
.
getWorkflow
ValueList
For
(
portal_type
):
wf_id
=
wf
.
getId
()
wf_type
=
wf
.
__class__
.
__name__
if
wf_type
==
"DCWorkflowDefinition"
:
if
wf_type
==
"DCWorkflowDefinition"
or
wf_type
==
"Workflow"
:
# Create state var accessor
# and generate methods that support the translation of workflow states
state_var
=
wf
.
variables
.
getStateVar
()
state_var
=
wf
.
getStateVariable
()
for
method_id
,
getter
in
(
(
'get%s'
%
UpperCase
(
state_var
),
WorkflowState
.
Getter
),
(
'get%sTitle'
%
UpperCase
(
state_var
),
WorkflowState
.
TitleGetter
),
...
...
@@ -865,16 +565,17 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow):
ptype_klass
.
registerAccessor
(
method
,
Permissions
.
AccessContentsInformation
)
storage
=
dc_
workflow_dict
transitions
=
wf
.
transitions
elif
wf_type
==
"InteractionWorkflowDefinition"
:
storage
=
workflow_dict
transitions
=
wf
.
getTransitionValueList
()
elif
wf_type
==
"InteractionWorkflowDefinition"
or
wf_type
==
"InteractionWorkflow"
:
storage
=
interaction_workflow_dict
transitions
=
wf
.
interactions
transitions
=
wf
.
getTransitionValueList
()
else
:
continue
# extract Trigger transitions from workflow definitions for later
transition_id_set
=
set
(
transitions
.
objectIds
())
transition_id_set
=
set
(
wf
.
getTransitionIdList
())
trigger_dict
=
{}
for
tr_id
in
transition_id_set
:
tdef
=
transitions
[
tr_id
]
...
...
@@ -883,8 +584,8 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow):
storage
[
wf_id
]
=
(
transition_id_set
,
trigger_dict
)
# Generate Workflow method:
for
wf_id
,
v
in
dc_
workflow_dict
.
iteritems
():
# Generate Workflow method
for
wf_id
,
v
in
workflow_dict
.
iteritems
():
transition_id_set
,
trigger_dict
=
v
for
tr_id
,
tdef
in
trigger_dict
.
iteritems
():
method_id
=
convertToMixedCase
(
tr_id
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a 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