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
amrani
erp5
Commits
b4048cb2
Commit
b4048cb2
authored
Apr 26, 2017
by
Ayush Tiwari
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bt5_config: Use property rather than attributes for BusinessItem objects
parent
7bd395b2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
43 additions
and
78 deletions
+43
-78
product/ERP5/Document/BusinessManager.py
product/ERP5/Document/BusinessManager.py
+43
-78
No files found.
product/ERP5/Document/BusinessManager.py
View file @
b4048cb2
...
...
@@ -177,6 +177,7 @@ class BusinessManager(Folder):
template_path_list
=
()
template_format_version
=
3
status
=
'uninstalled'
_path_item_list
=
PersistentList
()
# Declarative security
security
=
ClassSecurityInfo
()
...
...
@@ -255,7 +256,7 @@ class BusinessManager(Folder):
final_prop_map
=
prop_map
+
self
.
_properties
return
final_prop_map
def
export
(
self
,
path
=
None
,
local
=
0
,
bma
=
None
,
**
kw
):
def
export
(
self
,
path
=
None
,
**
kw
):
"""
Export the object as zexp file
"""
...
...
@@ -336,8 +337,13 @@ class BusinessManager(Folder):
"""
portal
=
self
.
getPortalObject
()
LOG
(
'Business Manager'
,
INFO
,
'Storing Manager Data'
)
self
.
_path_item_list
=
PersistentList
()
path_item_list
=
self
.
getTemplatePathList
()
# Delete all the older Business Item objects while rebuilding
exisiting_path_item_id_list
=
[
l
for
l
in
self
.
objectIds
()]
self
.
manage_delObjects
(
ids
=
exisiting_path_item_id_list
)
# Create an empty _path_item_list everytime we storeTemplateData
self
.
_path_item_list
=
PersistentList
()
if
path_item_list
:
path_item_list
=
[
l
.
split
(
' | '
)
for
l
in
path_item_list
]
...
...
@@ -349,9 +355,9 @@ class BusinessManager(Folder):
PathItem
=
self
.
newContent
(
portal_type
=
'Business Item'
)
# If its a property, no need to resolve the path
PathItem
.
edit
(
path
=
path_item
[
0
],
sign
=
path_item
[
1
],
layer
=
path_item
[
2
]
item_
path
=
path_item
[
0
],
item_
sign
=
path_item
[
1
],
item_
layer
=
path_item
[
2
]
)
self
.
_path_item_list
.
append
(
PathItem
)
else
:
...
...
@@ -368,9 +374,9 @@ class BusinessManager(Folder):
try
:
PathItem
=
self
.
newContent
(
portal_type
=
'Business Item'
)
PathItem
.
edit
(
path
=
path
,
sign
=
path_item
[
1
],
layer
=
path_item
[
2
]
item_
path
=
path
,
item_
sign
=
path_item
[
1
],
item_
layer
=
path_item
[
2
]
)
self
.
_path_item_list
.
append
(
PathItem
)
resolved_path
=
(
' | '
).
join
((
path
,
path_item
[
1
],
path_item
[
2
]))
...
...
@@ -380,9 +386,9 @@ class BusinessManager(Folder):
else
:
PathItem
=
self
.
newContent
(
portal_type
=
'Business Item'
)
PathItem
.
edit
(
path
=
path_item
[
0
],
sign
=
path_item
[
1
],
layer
=
path_item
[
2
]
item_
path
=
path_item
[
0
],
item_
sign
=
path_item
[
1
],
item_
layer
=
path_item
[
2
]
)
# If not build, i.e, import/export, just update the _path_item_list
self
.
_path_item_list
.
append
(
PathItem
)
...
...
@@ -651,58 +657,38 @@ class BusinessItem(XMLObject):
isProperty
=
False
isIndexable
=
False
def
__init__
(
self
,
path
,
sign
=
1
,
layer
=
0
,
value
=
None
,
*
args
,
**
kw
):
"""
Initialize/update the attributes
"""
self
.
__dict__
.
update
(
kw
)
self
.
path
=
path
self
.
sign
=
int
(
sign
)
self
.
layer
=
int
(
layer
)
self
.
value
=
value
if
value
:
# Generate hash of from the value
self
.
sha
=
self
.
_generateHash
()
else
:
self
.
sha
=
''
def
_edit
(
self
,
**
kw
):
def
_edit
(
self
,
item_path
=
''
,
item_sign
=
1
,
item_layer
=
0
,
*
args
,
**
kw
):
"""
Overriden function so that we can update attributes for BusinessItem objects
"""
self
.
path
=
kw
.
get
(
'path'
,
''
)
self
.
sign
=
int
(
kw
.
get
(
'sign'
,
1
))
self
.
layer
=
int
(
kw
.
get
(
'layer'
,
0
))
self
.
value
=
kw
.
get
(
'value'
,
None
)
if
self
.
value
:
# Generate hash of from the value
self
.
sha
=
self
.
_generateHash
()
else
:
self
.
sha
=
''
return
super
(
BusinessItem
,
self
).
_edit
(
item_path
=
item_path
,
item_sign
=
item_sign
,
item_layer
=
item_layer
,
**
kw
)
def
_generateHash
(
self
):
def
_generateHash
(
self
,
item_value
=
None
):
"""
Generate hash based on value for the object.
Initially, for simplicity, we go on with SHA256 values only
"""
LOG
(
'Business Manager'
,
INFO
,
'Genrating hash'
)
if
not
self
.
value
:
if
not
item_
value
:
# Raise in case there is no value for the BusinessItem object
raise
ValueError
,
"Value not defined for the
%s BusinessItem"
%
self
.
path
raise
ValueError
,
"Value not defined for the
BusinessItem"
elif
self
.
isProperty
:
# In case of property, the value is a PersisitentMapping object, so it
# can be easily hashed after formatting
sha256
=
hash
(
pprint
.
pformat
(
self
.
value
))
sha256
=
hash
(
pprint
.
pformat
(
item_
value
))
else
:
# Expects to raise error on case the value for the object
# is not picklable
try
:
sha256
=
hashlib
.
sha256
(
self
.
value
).
hexdigest
()
sha256
=
hashlib
.
sha256
(
item_
value
).
hexdigest
()
except
TypeError
:
obj_dict
=
self
.
value
.
__dict__
.
copy
()
obj_dict
=
item_
value
.
__dict__
.
copy
()
del
obj_dict
[
'uid'
]
sha256
=
hash
(
pprint
.
pformat
(
obj_dict
))
self
.
sha
=
sha256
return
sha256
def
build
(
self
,
context
,
**
kw
):
"""
...
...
@@ -716,7 +702,7 @@ class BusinessItem(XMLObject):
"""
LOG
(
'Business Manager'
,
INFO
,
'Building Business Item'
)
p
=
context
.
getPortalObject
()
path
=
self
.
path
path
=
self
.
getProperty
(
'item_path'
)
if
'#'
in
str
(
path
):
self
.
isProperty
=
True
relative_url
,
property_id
=
path
.
split
(
'#'
)
...
...
@@ -728,11 +714,9 @@ class BusinessItem(XMLObject):
value
[
'name'
]
=
property_id
value
[
'type'
]
=
property_type
value
[
'value'
]
=
property_value
self
.
value
=
value
self
.
setProperty
(
'item_value'
,
value
)
# Add the value object in the database
obj
.
_p_jar
.
add
(
value
)
# Generate hash for the property value
self
.
_generateHash
()
else
:
try
:
# XXX: After we apply _resolve path list while storing Data for the
...
...
@@ -747,9 +731,8 @@ class BusinessItem(XMLObject):
obj
=
obj
.
__of__
(
context
)
# XXX: '_recursiveRemoveUid' is not working as expected
_recursiveRemoveUid
(
obj
)
self
.
value
=
obj
# Generate hash for the erp5 object value
self
.
_generateHash
()
obj
=
aq_base
(
obj
)
self
.
_setObject
(
obj
.
getId
(),
obj
)
except
AttributeError
:
# In case the object doesn't exist, just pass without raising error
pass
...
...
@@ -828,18 +811,19 @@ class BusinessItem(XMLObject):
# In case the path denotes property, we create separate object for
# ObjectTemplateItem and handle the installation there.
portal
=
context
.
getPortalObject
()
if
'#'
in
str
(
self
.
path
):
path
=
self
.
getProperty
(
'item_path'
)
if
'#'
in
str
(
path
):
self
.
isProperty
=
True
relative_url
,
property_id
=
self
.
path
.
split
(
'#'
)
relative_url
,
property_id
=
path
.
split
(
'#'
)
obj
=
portal
.
unrestrictedTraverse
(
relative_url
)
prop
=
self
.
value
prop
=
self
.
getProperty
(
'value'
)
# First remove the property from the existing path and keep the default
# empty, and update only if the sign is +1
obj
.
_delPropValue
(
prop
[
'name'
])
if
self
.
sign
==
1
:
if
self
.
getProperty
(
'item_sign'
)
==
1
:
obj
.
setProperty
(
prop
[
'name'
],
prop
[
'value'
],
prop
[
'type'
])
else
:
path_list
=
self
.
path
.
split
(
'/'
)
path_list
=
path
.
split
(
'/'
)
container_path
=
path_list
[:
-
1
]
object_id
=
path_list
[
-
1
]
try
:
...
...
@@ -855,7 +839,7 @@ class BusinessItem(XMLObject):
# If sign is +1, set the new object on the container
if
self
.
sign
==
1
:
# install object
obj
=
self
.
value
obj
=
self
.
getProperty
(
'item_value'
)
obj
=
obj
.
_getCopy
(
container
)
container
.
_setObject
(
object_id
,
obj
)
obj
=
container
.
_getOb
(
object_id
)
...
...
@@ -1099,32 +1083,13 @@ class BusinessItem(XMLObject):
return
obj
def
getBusinessPath
(
self
):
return
self
.
path
return
self
.
getProperty
(
'item_path'
)
def
getBusinessPathSign
(
self
):
return
self
.
sign
return
self
.
getProperty
(
'item_sign'
)
def
getBusinessPathLayer
(
self
):
return
self
.
layer
def
getBusinessPathValue
(
self
):
return
self
.
value
def
setBusinessPathValue
(
self
,
value
):
self
.
value
=
value
def
getBusinessPathSha
(
self
):
return
self
.
sha
return
self
.
getProperty
(
'item_layer'
)
def
getParentBusinessManager
(
self
):
return
self
.
aq_parent
class
bm
(
dict
):
"""
Fake 'bm' item to read bm/* files through BusinessManagerArchive
"""
def
_importFile
(
self
,
file_name
,
file
,
parent
):
self
[
file_name
]
=
file
.
read
()
#InitializeClass(BusinessItem)
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