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
Levin Zimmermann
erp5
Commits
66403bf8
Commit
66403bf8
authored
May 22, 2015
by
wenjie.zheng
Committed by
Sebastien Robin
Jul 16, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ERP5Workflow: add configuration workflowfiles.
parent
81d68346
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
464 additions
and
0 deletions
+464
-0
product/ERP5Workflow/Document/ConfigurationState.py
product/ERP5Workflow/Document/ConfigurationState.py
+122
-0
product/ERP5Workflow/Document/ConfigurationTransition.py
product/ERP5Workflow/Document/ConfigurationTransition.py
+147
-0
product/ERP5Workflow/Document/ConfigurationWorkflow.py
product/ERP5Workflow/Document/ConfigurationWorkflow.py
+195
-0
No files found.
product/ERP5Workflow/Document/ConfigurationState.py
0 → 100644
View file @
66403bf8
##############################################################################
#
# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved.
# Romain Courteaud <romain@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
,
PropertySheet
from
Products.ERP5Type.XMLObject
import
XMLObject
from
zLOG
import
LOG
,
ERROR
,
DEBUG
,
WARNING
class
StateError
(
Exception
):
"""
Must call only an available transition
"""
pass
class
ConfigurationState
(
XMLObject
):
"""
A Busniess Configuration State.
"""
meta_type
=
'ERP5 State'
portal_type
=
'Configuration State'
add_permission
=
Permissions
.
AddPortalContent
isPortalContent
=
1
isRADContent
=
1
# Declarative security
security
=
ClassSecurityInfo
()
security
.
declareObjectProtected
(
Permissions
.
AccessContentsInformation
)
# Declarative properties
property_sheets
=
(
PropertySheet
.
Base
,
PropertySheet
.
XMLObject
,
PropertySheet
.
CategoryCore
,
PropertySheet
.
DublinCore
,
PropertySheet
.
State
,)
def
getAvailableTransitionList
(
self
,
document
):
"""
Return available transitions only if they are accessible for document.
"""
transition_list
=
self
.
getDestinationValueList
(
portal_type
=
'Transition'
)
result_list
=
[]
for
transition
in
transition_list
:
value
=
transition
.
_checkPermission
(
document
)
if
value
:
result_list
.
append
(
transition
)
return
result_list
def
executeTransition
(
self
,
transition
,
document
,
form_kw
=
None
):
"""
Execute transition on the object.
"""
if
transition
not
in
self
.
getAvailableTransitionList
(
document
):
raise
StateError
else
:
transition
.
execute
(
document
,
form_kw
=
form_kw
)
def
undoTransition
(
self
,
document
):
"""
Reverse previous transition
"""
wh
=
self
.
getWorkflowHistory
(
document
,
remove_undo
=
1
)
status_dict
=
wh
[
-
2
]
# Update workflow state
state_bc_id
=
self
.
getParentValue
().
getStateBaseCategory
()
document
.
setCategoryMembership
(
state_bc_id
,
status_dict
[
state_bc_id
])
# Update workflow history
status_dict
[
'undo'
]
=
1
self
.
getParentValue
().
_updateWorkflowHistory
(
document
,
status_dict
)
# XXX
LOG
(
"State, undo"
,
ERROR
,
"Variable (like DateTime) need to be updated!"
)
def
getWorkflowHistory
(
self
,
document
,
remove_undo
=
0
,
remove_not_displayed
=
0
):
"""
Return history tuple
"""
wh
=
document
.
workflow_history
[
self
.
getParentValue
().
_generateHistoryKey
()]
result
=
[]
# Remove undo
if
not
remove_undo
:
result
=
[
x
.
copy
()
for
x
in
wh
]
else
:
result
=
[]
for
x
in
wh
:
if
x
.
has_key
(
'undo'
)
and
x
[
'undo'
]
==
1
:
result
.
pop
()
else
:
result
.
append
(
x
.
copy
())
return
result
def
getVariableValue
(
self
,
document
,
variable_name
):
"""
Get current value of the variable from the object
"""
status_dict
=
self
.
getParentValue
().
getCurrentStatusDict
(
document
)
return
status_dict
[
variable_name
]
product/ERP5Workflow/Document/ConfigurationTransition.py
0 → 100644
View file @
66403bf8
##############################################################################
#
# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved.
# Romain Courteaud <romain@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
,
PropertySheet
from
Products.ERP5Type.XMLObject
import
XMLObject
from
Products.ERP5Type.Accessor.Base
import
_evaluateTales
class
ConfigurationTransition
(
XMLObject
):
"""
A Business Configuration Transition.
"""
meta_type
=
'ERP5 Transition'
portal_type
=
'Configuration Transition'
add_permission
=
Permissions
.
AddPortalContent
isPortalContent
=
1
isRADContent
=
1
# Declarative security
security
=
ClassSecurityInfo
()
security
.
declareObjectProtected
(
Permissions
.
AccessContentsInformation
)
# Declarative properties
property_sheets
=
(
PropertySheet
.
Base
,
PropertySheet
.
XMLObject
,
PropertySheet
.
CategoryCore
,
PropertySheet
.
DublinCore
,
PropertySheet
.
Transition
,
)
def
execute
(
self
,
document
,
form_kw
=
None
):
"""
Execute transition.
"""
workflow
=
self
.
getParentValue
()
# Call the before script
self
.
_executeBeforeScript
(
document
)
# Modify the state
self
.
_changeState
(
document
)
# Get variable values
status_dict
=
workflow
.
getCurrentStatusDict
(
document
)
status_dict
[
'undo'
]
=
0
# Modify workflow history
state_bc_id
=
workflow
.
getStateBaseCategory
()
status_dict
[
state_bc_id
]
=
document
.
getCategoryMembershipList
(
state_bc_id
)[
0
]
state_object
=
document
.
unrestrictedTraverse
(
status_dict
[
state_bc_id
])
object
=
workflow
.
getStateChangeInformation
(
document
,
state_object
,
transition
=
self
)
# Update all variables
for
variable
in
workflow
.
contentValues
(
portal_type
=
'Variable'
):
if
variable
.
getAutomaticUpdate
():
# if we have it in form get it from there
# otherwise use default
variable_title
=
variable
.
getTitle
()
if
variable_title
in
form_kw
:
status_dict
[
variable_title
]
=
form_kw
[
variable_title
]
else
:
status_dict
[
variable_title
]
=
variable
.
getInitialValue
(
object
=
object
)
# Update all transition variables
if
form_kw
is
not
None
:
object
.
REQUEST
.
other
.
update
(
form_kw
)
for
variable
in
self
.
contentValues
(
portal_type
=
'Transition Variable'
):
status_dict
[
variable
.
getCausalityTitle
()]
=
variable
.
getInitialValue
(
object
=
object
)
workflow
.
_updateWorkflowHistory
(
document
,
status_dict
)
# Call the after script
self
.
_executeAfterScript
(
document
,
form_kw
=
form_kw
)
def
_changeState
(
self
,
document
):
"""
Change the state of the object.
"""
state
=
self
.
getDestination
()
if
state
is
not
None
:
# Some transitions don't update the state
state_bc_id
=
self
.
getParentValue
().
getStateBaseCategory
()
document
.
setCategoryMembership
(
state_bc_id
,
state
)
def
_executeAfterScript
(
self
,
document
,
form_kw
=
None
):
"""
Execute post transition script.
"""
if
form_kw
is
None
:
form_kw
=
{}
script_id
=
self
.
getAfterScriptId
()
if
script_id
is
not
None
:
script
=
getattr
(
document
,
script_id
)
script
(
**
form_kw
)
def
_executeBeforeScript
(
self
,
document
,
form_kw
=
None
):
"""
Execute pre transition script.
"""
if
form_kw
is
None
:
form_kw
=
{}
script_id
=
self
.
getBeforeScriptId
()
if
script_id
is
not
None
:
script
=
getattr
(
document
,
script_id
)
script
(
**
form_kw
)
def
_checkPermission
(
self
,
document
):
"""
Check if transition is allowed.
"""
expr_value
=
self
.
getGuardExpression
(
evaluate
=
0
)
if
expr_value
is
not
None
:
# do not use 'getGuardExpression' to calculate tales because
# it caches value which is bad. Instead do it manually
value
=
_evaluateTales
(
document
,
expr_value
)
else
:
value
=
True
#print "CALC", expr_value, '-->', value
return
value
product/ERP5Workflow/Document/ConfigurationWorkflow.py
0 → 100644
View file @
66403bf8
##############################################################################
#
# Copyright (c) 2006 Nexedi SARL and Contributors. All Rights Reserved.
# Romain Courteaud <romain@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
,
PropertySheet
from
Products.ERP5Type.XMLObject
import
XMLObject
from
Products.ERP5Type.Globals
import
PersistentMapping
from
tempfile
import
mktemp
import
os
from
Products.DCWorkflowGraph.config
import
DOT_EXE
from
Products.DCWorkflowGraph.DCWorkflowGraph
import
bin_search
,
getGraph
from
Acquisition
import
aq_base
from
DateTime
import
DateTime
class
ConfigurationWorkflow
(
XMLObject
):
"""
A Business Configuration Workflow.
"""
meta_type
=
'ERP5 Workflow'
portal_type
=
'Configuration Workflow'
add_permission
=
Permissions
.
AddPortalContent
isPortalContent
=
1
isRADContent
=
1
# Declarative security
security
=
ClassSecurityInfo
()
security
.
declareObjectProtected
(
Permissions
.
AccessContentsInformation
)
# Declarative properties
property_sheets
=
(
PropertySheet
.
Base
,
PropertySheet
.
XMLObject
,
PropertySheet
.
CategoryCore
,
PropertySheet
.
DublinCore
,
PropertySheet
.
Workflow
,
)
def
initializeDocument
(
self
,
document
):
"""
Set initial state on the Document
"""
state_bc_id
=
self
.
getStateBaseCategory
()
document
.
setCategoryMembership
(
state_bc_id
,
self
.
getSource
())
object
=
self
.
getStateChangeInformation
(
document
,
self
.
getSourceValue
())
# Initialize workflow history
status_dict
=
{
state_bc_id
:
self
.
getSource
()}
variable_list
=
self
.
contentValues
(
portal_type
=
'Variable'
)
for
variable
in
variable_list
:
status_dict
[
variable
.
getTitle
()]
=
variable
.
getInitialValue
(
object
=
object
)
self
.
_updateWorkflowHistory
(
document
,
status_dict
)
def
_generateHistoryKey
(
self
):
"""
Generate a key used in the workflow history.
"""
return
self
.
getRelativeUrl
()
def
_updateWorkflowHistory
(
self
,
document
,
status_dict
):
"""
Change the state of the object.
"""
# Create history attributes if needed
if
getattr
(
aq_base
(
document
),
'workflow_history'
,
None
)
is
None
:
document
.
workflow_history
=
PersistentMapping
()
# XXX this _p_changed is apparently not necessary
document
.
_p_changed
=
1
# Add an entry for the workflow in the history
workflow_key
=
self
.
_generateHistoryKey
()
if
not
document
.
workflow_history
.
has_key
(
workflow_key
):
document
.
workflow_history
[
workflow_key
]
=
()
# Update history
document
.
workflow_history
[
workflow_key
]
+=
(
status_dict
,
)
# XXX this _p_changed marks the document modified, but the
# only the PersistentMapping is modified
document
.
_p_changed
=
1
# XXX this _p_changed is apparently not necessary
document
.
workflow_history
.
_p_changed
=
1
def
getCurrentStatusDict
(
self
,
document
):
"""
Get the current status dict.
"""
workflow_key
=
self
.
_generateHistoryKey
()
# Copy is requested
result
=
document
.
workflow_history
[
workflow_key
][
-
1
].
copy
()
return
result
def
getDateTime
(
self
):
"""
Return current date time.
"""
return
DateTime
()
def
getStateChangeInformation
(
self
,
document
,
state
,
transition
=
None
):
"""
Return an object used for variable tales expression.
"""
if
transition
is
None
:
transition_url
=
None
else
:
transition_url
=
transition
.
getRelativeUrl
()
return
self
.
asContext
(
document
=
document
,
transition
=
transition
,
transition_url
=
transition_url
,
state
=
state
)
###########
## Graph ##
############
getGraph
=
getGraph
def
getPOT
(
self
,
*
args
,
**
kwargs
):
"""
get the pot, copy from:
"dcworkfow2dot.py":http://awkly.org/Members/sidnei/weblog_storage/blog_27014
and Sidnei da Silva owns the copyright of the this function
"""
out
=
[]
transition_dict
=
{}
out
.
append
(
'digraph "%s" {'
%
self
.
getTitle
())
transition_with_init_state_list
=
[]
for
state
in
self
.
contentValues
(
portal_type
=
'State'
):
out
.
append
(
'%s [shape=box,label="%s",'
\
'style="filled",fillcolor="#ffcc99"];'
%
\
(
state
.
getId
(),
state
.
getTitle
()))
# XXX Use API instead of getDestinationValueList
for
available_transition
in
state
.
getDestinationValueList
():
transition_with_init_state_list
.
append
(
available_transition
.
getId
())
destination_state
=
available_transition
.
getDestinationValue
()
if
destination_state
is
None
:
# take care of 'remain in state' transitions
destination_state
=
state
#
key
=
(
state
.
getId
(),
destination_state
.
getId
())
value
=
transition_dict
.
get
(
key
,
[])
value
.
append
(
available_transition
.
getTitle
())
transition_dict
[
key
]
=
value
# iterate also on transitions, and add transitions with no initial state
for
transition
in
self
.
contentValues
(
portal_type
=
'Transition'
):
trans_id
=
transition
.
getId
()
if
trans_id
not
in
transition_with_init_state_list
:
destination_state
=
transition
.
getDestinationValue
()
if
destination_state
is
None
:
dest_state_id
=
None
else
:
dest_state_id
=
destination_state
.
getId
()
key
=
(
None
,
dest_state_id
)
value
=
transition_dict
.
get
(
key
,
[])
value
.
append
(
transition
.
getTitle
())
transition_dict
[
key
]
=
value
for
k
,
v
in
transition_dict
.
items
():
out
.
append
(
'%s -> %s [label="%s"];'
%
(
k
[
0
],
k
[
1
],
',
\
\
n'
.
join
(
v
)))
out
.
append
(
'}'
)
return
'
\
n
'
.
join
(
out
)
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