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
Nikola Balog
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
Hide 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