Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5_fork
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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Eteri
erp5_fork
Commits
09c8f83f
Commit
09c8f83f
authored
Apr 02, 2012
by
Julien Muchembled
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Unindent RuleTool to our convention
parent
cb634656
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
82 additions
and
82 deletions
+82
-82
product/ERP5/Tool/RuleTool.py
product/ERP5/Tool/RuleTool.py
+82
-82
No files found.
product/ERP5/Tool/RuleTool.py
View file @
09c8f83f
...
...
@@ -33,107 +33,107 @@ from Products.ERP5Type import Permissions
from
Products.ERP5
import
_dtmldir
class
RuleTool
(
BaseTool
):
"""
The RulesTool implements portal object
transformation policies.
"""
The RulesTool implements portal object
transformation policies.
An object transformation template is defined by
a domain and a transformation pattent:
The domain is defined as:
- the meta_type it applies to
An object transformation template is defined by
a domain and a transformation pattent:
- the portal_type it applies to
The domain is defined as:
- the conditions of application (category membership, value range,
security, function, etc.)
- the meta_type it applies to
The transformation template is defined as:
- the portal_type it applies to
- a tree of portal_types starting on the object itself
- the conditions of application (category membership, value range,
security, function, etc.)
- default values for each node of the tree, incl. the root itself
The transformation template is defined as:
When a transformation is triggered, it will check the existence of
each node and eventually update values
- a tree of portal_types starting on the object itself
Transformations are very similar to XSLT in the XML world.
- default values for each node of the tree, incl. the root itself
Examples of applications:
When a transformation is triggered, it will check the existence of
each node and eventually update values
- generate accounting movements from a stock movement
Transformations are very similar to XSLT in the XML world.
- generate a birthday event from a person
Examples of applications:
ERP5 main application : generate submovements from movements
according to templates. Allows to parametrize modules
such as payroll.
- generate accounting movements from a stock movement
"""
id
=
'portal_rules'
meta_type
=
'ERP5 Rule Tool'
portal_type
=
'Rule Tool'
allowed_types
=
(
'ERP5 Order Rule'
,
'ERP5 Transformation Rule'
,
'ERP5 Zero Stock Rule'
,
'ERP5 Delivery Rule'
,
'ERP5 Amortisation Rule'
)
- generate a birthday event from a person
# Declarative Security
security
=
ClassSecurityInfo
()
ERP5 main application : generate submovements from movements
according to templates. Allows to parametrize modules
such as payroll.
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'manage_overview'
)
manage_overview
=
DTMLFile
(
'explainRuleTool'
,
_dtmldir
)
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'searchRuleList'
)
def
searchRuleList
(
self
,
movement
,
tested_base_category_list
=
None
,
**
kw
):
"""
id
=
'portal_rules'
meta_type
=
'ERP5 Rule Tool'
portal_type
=
'Rule Tool'
allowed_types
=
(
'ERP5 Order Rule'
,
'ERP5 Transformation Rule'
,
'ERP5 Zero Stock Rule'
,
'ERP5 Delivery Rule'
,
'ERP5 Amortisation Rule'
)
# Declarative Security
security
=
ClassSecurityInfo
()
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'manage_overview'
)
manage_overview
=
DTMLFile
(
'explainRuleTool'
,
_dtmldir
)
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'searchRuleList'
)
def
searchRuleList
(
self
,
movement
,
tested_base_category_list
=
None
,
**
kw
):
"""
this method searches for rules, as predicates against movement
- the rule must be in "validated" state
- the rule must be of a known portal type
- Predicate criterions can be used (like start_date_range_min)
"""
portal
=
self
.
getPortalObject
()
# XXX: For performance reasons, current implementation does not use
# DomainTool._searchPredicateList anymore, because in most cases, it
# does not filter anything before actualling calling Predicate.test()
# Properties must be added on rules to minimize the number of test
# scripts/expressions, like the portal types of the possible parent
# applied rules, so that filtering can be done via the catalog.
# Then it would be possible to use Domain Tool again.
#return portal.domain_tool._searchPredicateList(context=movement,
# tested_base_category_list=tested_base_category_list,
# portal_type=portal.getPortalRuleTypeList(),
# validation_state="validated", **kw) #XXX "validated" is hardcoded
# Most rules are only configured through their test_method_id,
# so filter out them quickly before calling Predicate.test()
rule_list
=
[]
for
rule
in
portal
.
portal_catalog
.
unrestrictedSearchResults
(
portal_type
=
portal
.
getPortalRuleTypeList
(),
validation_state
=
"validated"
,
**
kw
):
#XXX "validated" is hardcoded
rule
=
rule
.
getObject
()
try
:
for
test_method_id
in
rule
.
getTestMethodIdList
():
if
test_method_id
==
'Rule_testFalse'
or
\
not
getattr
(
movement
,
test_method_id
)(
rule
):
break
else
:
if
rule
.
test
(
movement
,
tested_base_category_list
=
tested_base_category_list
):
rule_list
.
append
(
rule
)
except
Exception
:
# Maybe the script is old (= it takes no argument). Or we should not
# have called it (= rule would have been excluded before, depending
# on other criterions). Or there may be a bug.
# We don't know why it failed so let Predicate.test() do the work.
this method searches for rules, as predicates against movement
- the rule must be in "validated" state
- the rule must be of a known portal type
- Predicate criterions can be used (like start_date_range_min)
"""
portal
=
self
.
getPortalObject
()
# XXX: For performance reasons, current implementation does not use
# DomainTool._searchPredicateList anymore, because in most cases, it
# does not filter anything before actualling calling Predicate.test()
# Properties must be added on rules to minimize the number of test
# scripts/expressions, like the portal types of the possible parent
# applied rules, so that filtering can be done via the catalog.
# Then it would be possible to use Domain Tool again.
#return portal.domain_tool._searchPredicateList(context=movement,
# tested_base_category_list=tested_base_category_list,
# portal_type=portal.getPortalRuleTypeList(),
# validation_state="validated", **kw) #XXX "validated" is hardcoded
# Most rules are only configured through their test_method_id,
# so filter out them quickly before calling Predicate.test()
rule_list
=
[]
for
rule
in
portal
.
portal_catalog
.
unrestrictedSearchResults
(
portal_type
=
portal
.
getPortalRuleTypeList
(),
validation_state
=
"validated"
,
**
kw
):
#XXX "validated" is hardcoded
rule
=
rule
.
getObject
()
try
:
for
test_method_id
in
rule
.
getTestMethodIdList
():
if
test_method_id
==
'Rule_testFalse'
or
\
not
getattr
(
movement
,
test_method_id
)(
rule
):
break
else
:
if
rule
.
test
(
movement
,
tested_base_category_list
=
tested_base_category_list
):
rule_list
.
append
(
rule
)
return
rule_list
except
Exception
:
# Maybe the script is old (= it takes no argument). Or we should not
# have called it (= rule would have been excluded before, depending
# on other criterions). Or there may be a bug.
# We don't know why it failed so let Predicate.test() do the work.
if
rule
.
test
(
movement
,
tested_base_category_list
=
tested_base_category_list
):
rule_list
.
append
(
rule
)
return
rule_list
InitializeClass
(
RuleTool
)
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