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
Laurent S
erp5
Commits
a68a1242
Commit
a68a1242
authored
Jan 05, 2017
by
Ayush Tiwari
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bt5_prototype: BusinessPackage class defined
parent
5292e045
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
218 additions
and
0 deletions
+218
-0
product/ERP5/Document/BusinessPackage.py
product/ERP5/Document/BusinessPackage.py
+218
-0
No files found.
product/ERP5/Document/BusinessPackage.py
0 → 100644
View file @
a68a1242
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2017 Nexedi SARL and Contributors. All Rights Reserved.
# Ayush-Tiwari <ayush.tiwari@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.
#
##############################################################################
import
fnmatch
,
re
import
transaction
from
copy
import
deepcopy
from
Acquisition
import
Implicit
,
aq_base
,
aq_inner
,
aq_parent
from
Products.ERP5Type.XMLObject
import
XMLObject
from
Products.ERP5Type
import
Permissions
,
PropertySheet
,
interfaces
from
Products.ERP5.Document.BusinessTemplate
import
ObjectTemplateItem
,
BaseTemplateItem
from
AccessControl
import
ClassSecurityInfo
,
Unauthorized
,
getSecurityManager
from
Products.ERP5Type.Globals
import
Persistent
,
PersistentMapping
_MARKER
=
[]
def
_delObjectWithoutHook
(
obj
,
id
):
"""OFS.ObjectManager._delObject without calling manage_beforeDelete."""
ob
=
obj
.
_getOb
(
id
)
if
obj
.
_objects
:
obj
.
_objects
=
tuple
([
i
for
i
in
obj
.
_objects
if
i
[
'id'
]
!=
id
])
obj
.
_delOb
(
id
)
try
:
ob
.
_v__object_deleted__
=
1
except
:
pass
def
_recursiveRemoveUid
(
obj
):
"""Recusivly set uid to None, to prevent (un)indexing.
This is used to prevent unindexing real objects when we delete subobjects on
a copy of this object.
"""
if
getattr
(
aq_base
(
obj
),
'uid'
,
_MARKER
)
is
not
_MARKER
:
obj
.
uid
=
None
for
subobj
in
obj
.
objectValues
():
_recursiveRemoveUid
(
subobj
)
class
BusinessPackage
(
XMLObject
):
"""
New implementation of Business Templates
"""
meta_type
=
'ERP5 Business Package'
portal_type
=
'Business Package'
add_permission
=
Permissions
.
AddPortalContent
# Declarative security
security
=
ClassSecurityInfo
()
security
.
declareObjectProtected
(
Permissions
.
AccessContentsInformation
)
# Declarative properties
property_sheets
=
(
PropertySheet
.
Base
,
PropertySheet
.
XMLObject
,
PropertySheet
.
SimpleItem
,
PropertySheet
.
CategoryCore
,
PropertySheet
.
BusinessPackage
)
def
_install
(
self
):
pass
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'install'
)
install
=
_install
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'build'
)
def
build
(
self
):
"""
Should also export the objects from PathTemplateItem to their xml format
"""
self
.
storePathData
()
for
item
in
self
.
_path_item
:
item
.
export
()
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'storePathData'
)
def
storePathData
(
self
):
self
.
_path_item
=
PathTemplatePackageItem
(
self
.
_getTemplatePathList
())
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'getTemplatePathList'
)
def
_getTemplatePathList
(
self
):
result
=
tuple
(
self
.
getTemplatePathList
())
if
result
is
None
:
result
=
()
return
result
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'export'
)
def
export
(
self
):
"""
Export the object
"""
pass
class
PathTemplatePackageItem
(
ObjectTemplateItem
):
def
__init__
(
self
,
id_list
,
tool_id
=
None
,
**
kw
):
BaseTemplateItem
.
__init__
(
self
,
id_list
,
tool_id
=
tool_id
,
**
kw
)
id_list
=
self
.
_archive
.
keys
()
self
.
_archive
.
clear
()
self
.
_path_archive
=
PersistentMapping
()
for
id
in
id_list
:
self
.
_path_archive
[
id
]
=
None
def
_resolvePath
(
self
,
folder
,
relative_url_list
,
id_list
):
"""
This method calls itself recursively.
The folder is the current object which contains sub-objects.
The list of ids are path components. If the list is empty,
the current folder is valid.
"""
if
len
(
id_list
)
==
0
:
return
[
'/'
.
join
(
relative_url_list
)]
id
=
id_list
[
0
]
if
re
.
search
(
'[
\
*
\
?
\
[
\
]]'
,
id
)
is
None
:
# If the id has no meta character, do not have to check all objects.
obj
=
folder
.
_getOb
(
id
,
None
)
if
obj
is
None
:
raise
AttributeError
,
"Could not resolve '%s' during business template processing."
%
id
return
self
.
_resolvePath
(
obj
,
relative_url_list
+
[
id
],
id_list
[
1
:])
path_list
=
[]
for
object_id
in
fnmatch
.
filter
(
folder
.
objectIds
(),
id
):
if
object_id
!=
""
:
path_list
.
extend
(
self
.
_resolvePath
(
folder
.
_getOb
(
object_id
),
relative_url_list
+
[
object_id
],
id_list
[
1
:]))
return
path_list
def
build
(
self
,
context
,
**
kw
):
BaseTemplateItem
.
build
(
self
,
context
,
**
kw
)
p
=
context
.
getPortalObject
()
keys
=
self
.
_path_archive
.
keys
()
keys
.
sort
()
for
path
in
keys
:
include_subobjects
=
0
if
path
.
endswith
(
"**"
):
include_subobjects
=
1
for
relative_url
in
self
.
_resolvePath
(
p
,
[],
path
.
split
(
'/'
)):
obj
=
p
.
unrestrictedTraverse
(
relative_url
)
obj
=
obj
.
_getCopy
(
context
)
obj
=
obj
.
__of__
(
context
)
_recursiveRemoveUid
(
obj
)
id_list
=
obj
.
objectIds
()
if
hasattr
(
aq_base
(
obj
),
'groups'
):
# we must keep groups because it's ereased when we delete subobjects
groups
=
deepcopy
(
obj
.
groups
)
if
len
(
id_list
)
>
0
:
if
include_subobjects
:
self
.
build_sub_objects
(
obj
,
id_list
,
relative_url
)
for
id_
in
list
(
id_list
):
_delObjectWithoutHook
(
obj
,
id_
)
if
hasattr
(
aq_base
(
obj
),
'groups'
):
obj
.
groups
=
groups
self
.
_objects
[
relative_url
]
=
obj
obj
.
wl_clearLocks
()
def
install
(
self
,
context
,
*
args
,
**
kw
):
super
(
PathTemplateItem
,
self
).
install
(
context
,
*
args
,
**
kw
)
# Regenerate local roles for all paths in this business template
p
=
context
.
getPortalObject
()
portal_type_role_list_len_dict
=
{}
update_dict
=
defaultdict
(
list
)
for
path
in
self
.
_objects
:
obj
=
p
.
unrestrictedTraverse
(
path
,
None
)
# Ignore any object without PortalType (non-ERP5 objects)
try
:
portal_type
=
aq_base
(
obj
).
getPortalType
()
except
Exception
,
e
:
pass
else
:
if
portal_type
not
in
p
.
portal_types
:
LOG
(
"BusinessTemplate"
,
WARNING
,
"Could not update Local Roles as Portal Type '%s' could not "
"be found"
%
portal_type
)
continue
if
portal_type
not
in
portal_type_role_list_len_dict
:
portal_type_role_list_len_dict
[
portal_type
]
=
\
len
(
p
.
portal_types
[
portal_type
].
getRoleInformationList
())
if
portal_type_role_list_len_dict
[
portal_type
]:
update_dict
[
portal_type
].
append
(
obj
)
if
update_dict
:
def
updateLocalRolesOnDocument
():
for
portal_type
,
obj_list
in
update_dict
.
iteritems
():
update
=
p
.
portal_types
[
portal_type
].
updateLocalRolesOnDocument
for
obj
in
obj_list
:
update
(
obj
)
LOG
(
"BusinessTemplate"
,
INFO
,
"Updated Local Roles for '%s' (%s)"
%
(
portal_type
,
obj
.
getRelativeUrl
()))
transaction
.
get
().
addBeforeCommitHook
(
updateLocalRolesOnDocument
)
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