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
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
Iliya Manolov
erp5
Commits
7865c58d
Commit
7865c58d
authored
Jan 23, 2013
by
Julien Muchembled
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CMFCategory: add support for ZODB indexing of related documents
parent
a47a9bbd
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
503 additions
and
43 deletions
+503
-43
product/CMFCategory/CategoryTool.py
product/CMFCategory/CategoryTool.py
+190
-35
product/CMFCategory/tests/testCMFCategory.py
product/CMFCategory/tests/testCMFCategory.py
+57
-1
product/ERP5/Document/BusinessTemplate.py
product/ERP5/Document/BusinessTemplate.py
+2
-1
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseCategory_validateRelatedLocallyIndexed.xml
.../erp5_core/BaseCategory_validateRelatedLocallyIndexed.xml
+69
-0
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseCategory_view.xml
...TemplateItem/portal_skins/erp5_core/BaseCategory_view.xml
+1
-0
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseCategory_view/my_related_locally_indexed.xml
...rp5_core/BaseCategory_view/my_related_locally_indexed.xml
+124
-0
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_zSearchRelatedObjectsByCategoryList.xml
...ns/erp5_core/Base_zSearchRelatedObjectsByCategoryList.xml
+2
-6
product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/BaseCategory/related_locally_indexed_property.xml
..._sheets/BaseCategory/related_locally_indexed_property.xml
+58
-0
No files found.
product/CMFCategory/CategoryTool.py
View file @
7865c58d
...
...
@@ -31,6 +31,7 @@
ERP portal_categories tool.
"""
from
collections
import
deque
from
BTrees.OOBTree
import
OOTreeSet
from
OFS.Folder
import
Folder
from
Products.CMFCore.utils
import
UniqueObject
from
Products.ERP5Type.Globals
import
InitializeClass
,
DTMLFile
...
...
@@ -40,9 +41,11 @@ from Acquisition import aq_base, aq_inner
from
Products.ERP5Type
import
Permissions
from
Products.ERP5Type.Base
import
Base
from
Products.ERP5Type.Cache
import
getReadOnlyTransactionCache
from
Products.ERP5Type.TransactionalVariable
import
getTransactionalVariable
from
Products.CMFCategory
import
_dtmldir
from
Products.CMFCore.PortalFolder
import
ContentFilter
from
Products.CMFCategory.Renderer
import
Renderer
from
Products.CMFCategory.Category
import
Category
,
BaseCategory
from
OFS.Traversable
import
NotFound
import
types
...
...
@@ -55,6 +58,34 @@ _marker = object()
class
CategoryError
(
Exception
):
pass
class
RelatedIndex
():
# persistent.Persistent can be added
# without breaking compatibility
def
__repr__
(
self
):
try
:
contents
=
', '
.
join
(
'%s=%r'
%
(
k
,
list
(
v
))
for
(
k
,
v
)
in
self
.
__dict__
.
iteritems
())
except
Exception
:
contents
=
'...'
return
'<%s(%s) at 0x%x>'
%
(
self
.
__class__
.
__name__
,
contents
,
id
(
self
))
def
__nonzero__
(
self
):
return
any
(
self
.
__dict__
.
itervalues
())
def
add
(
self
,
base
,
relative_url
):
try
:
getattr
(
self
,
base
).
add
(
relative_url
)
except
AttributeError
:
setattr
(
self
,
base
,
OOTreeSet
((
relative_url
,)))
def
remove
(
self
,
base
,
relative_url
):
try
:
getattr
(
self
,
base
).
remove
(
relative_url
)
except
(
AttributeError
,
KeyError
):
pass
class
CategoryTool
(
UniqueObject
,
Folder
,
Base
):
"""
The CategoryTool object is the placeholder for all methods
...
...
@@ -1174,7 +1205,28 @@ class CategoryTool( UniqueObject, Folder, Base ):
security
.
declareProtected
(
Permissions
.
ModifyPortalContent
,
'_setCategoryList'
)
def
_setCategoryList
(
self
,
context
,
value
):
context
.
categories
=
tuple
(
value
)
old
=
set
(
getattr
(
aq_base
(
context
),
'categories'
,
()))
context
.
categories
=
value
=
tuple
(
value
)
if
context
.
isTempDocument
():
return
value
=
set
(
value
)
relative_url
=
context
.
getRelativeUrl
()
for
edit
,
value
in
(
"remove"
,
old
-
value
),
(
"add"
,
value
-
old
):
for
path
in
value
:
base
=
self
.
getBaseCategoryId
(
path
)
try
:
if
self
[
base
].
isRelatedLocallyIndexed
():
path
=
self
.
_removeDuplicateBaseCategoryIdInCategoryPath
(
base
,
path
)
ob
=
aq_base
(
self
.
unrestrictedTraverse
(
path
))
try
:
related
=
ob
.
_related_index
except
AttributeError
:
if
edit
is
"remove"
:
continue
related
=
ob
.
_related_index
=
RelatedIndex
()
getattr
(
related
,
edit
)(
base
,
relative_url
)
except
KeyError
:
pass
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'getAcquiredCategoryList'
)
def
getAcquiredCategoryList
(
self
,
context
):
...
...
@@ -1287,50 +1339,153 @@ class CategoryTool( UniqueObject, Folder, Base ):
portal_type
=
kw
.
get
(
'portal_type'
)
if
isinstance
(
portal_type
,
str
):
portal_type
=
[
portal_type
]
portal_type
=
portal_type
,
# Base Category may not be related, besides sub categories
if
context
.
getPortalType
()
==
'Base Category'
:
category_list
=
[
context
.
getRelativeUrl
()]
relative_url
=
context
.
getRelativeUrl
()
local_index_dict
=
{}
if
isinstance
(
context
,
BaseCategory
):
category_list
=
relative_url
,
else
:
category_list
=
[]
if
isinstance
(
base_category_list
,
str
):
base_category_list
=
[
base_category_list
]
base_category_list
=
base_category_list
,
elif
base_category_list
is
()
or
base_category_list
is
None
:
base_category_list
=
self
.
getBaseCategoryList
()
category_list
=
[]
for
base_category
in
base_category_list
:
category_list
.
append
(
"%s/%s"
%
(
base_category
,
context
.
getRelativeUrl
()))
brain_result
=
self
.
Base_zSearchRelatedObjectsByCategoryList
(
category_list
=
category_list
,
portal_type
=
portal_type
,
strict_membership
=
strict_membership
)
if
self
[
base_category
].
isRelatedLocallyIndexed
():
category
=
base_category
+
'/'
local_index_dict
[
base_category
]
=
''
\
if
relative_url
.
startswith
(
category
)
else
category
else
:
category_list
.
append
(
"%s/%s"
%
(
base_category
,
relative_url
))
search
=
self
.
getPortalObject
().
Base_zSearchRelatedObjectsByCategoryList
if
local_index_dict
:
# For some base categories, lookup indexes in ZODB.
recurse
=
isinstance
(
context
,
Category
)
and
not
strict_membership
result_dict
=
{}
def
check_local
():
r
=
set
(
getattr
(
related
,
base_category
,
()))
r
.
difference_update
(
result_dict
)
for
r
in
r
:
try
:
ob
=
self
.
unrestrictedTraverse
(
r
)
if
category
in
aq_base
(
ob
).
categories
:
result_dict
[
r
]
=
ob
continue
# Do not add 'r' to result_dict, because 'ob' may be linked in
# another way.
except
(
AttributeError
,
KeyError
):
result_dict
[
r
]
=
None
related
.
remove
(
base_category
,
r
)
tv
=
getTransactionalVariable
().
setdefault
(
'CategoriesTool.getRelatedValueList'
,
{})
try
:
related
=
aq_base
(
context
).
_related_index
except
AttributeError
:
related
=
RelatedIndex
()
include_self
=
False
for
base_category
,
category
in
local_index_dict
.
iteritems
():
if
not
category
:
# Categories are member of themselves.
include_self
=
True
result_dict
[
relative_url
]
=
context
category
+=
relative_url
if
tv
.
get
(
category
,
-
1
)
<
recurse
:
# Update local index with results from catalog for backward
# compatibility. But no need to do it several times in the same
# transaction.
for
r
in
search
(
category_list
=
category
,
portal_type
=
None
,
strict_membership
=
strict_membership
):
r
=
r
.
relative_url
# relative_url is empty if object is deleted (but not yet
# unindexed). Nothing specific to do in such case because
# category tool won't match.
try
:
ob
=
self
.
unrestrictedTraverse
(
r
)
categories
=
aq_base
(
ob
).
categories
except
(
AttributeError
,
KeyError
):
result_dict
[
r
]
=
None
continue
if
category
in
categories
:
related
.
add
(
base_category
,
r
)
result_dict
[
r
]
=
ob
elif
recurse
:
for
p
in
categories
:
if
p
.
startswith
(
category
+
'/'
):
try
:
o
=
self
.
unrestrictedTraverse
(
p
)
p
=
aq_base
(
o
).
_related_index
except
KeyError
:
continue
except
AttributeError
:
p
=
o
.
_related_index
=
RelatedIndex
()
result_dict
[
r
]
=
ob
p
.
add
(
base_category
,
r
)
tv
[
category
]
=
recurse
# Get and check all objects referenced by local index for the base
# category that is currently considered.
check_local
()
# Modify context only if it's worth it.
if
related
and
not
hasattr
(
aq_base
(
context
),
'_related_index'
):
context
.
_related_index
=
related
# In case of non-strict membership search, include all objects that
# are linked to a subobject of context.
if
recurse
:
r
=
[
context
]
while
r
:
for
ob
in
r
.
pop
().
objectValues
():
r
.
append
(
ob
)
relative_url
=
ob
.
getRelativeUrl
()
if
include_self
:
result_dict
[
relative_url
]
=
ob
try
:
related
=
aq_base
(
ob
).
_related_index
except
AttributeError
:
continue
for
base_category
,
category
in
local_index_dict
.
iteritems
():
category
+=
relative_url
check_local
()
# Filter out objects that are not of requested portal type.
result
=
[
ob
for
ob
in
result_dict
.
itervalues
()
if
ob
is
not
None
and
(
not
portal_type
or
ob
.
getPortalType
()
in
portal_type
)]
# Finish with base categories that are only indexed in catalog,
# making sure we don't return duplicate values.
if
category_list
:
for
r
in
search
(
category_list
=
category_list
,
portal_type
=
portal_type
,
strict_membership
=
strict_membership
):
if
r
.
relative_url
not
in
result_dict
:
try
:
result
.
append
(
self
.
unrestrictedTraverse
(
r
.
path
))
except
KeyError
:
pass
result
=
[]
if
checked_permission
is
None
:
# No permission to check
for
b
in
brain_result
:
o
=
b
.
getObject
()
if
o
is
not
None
:
result
.
append
(
o
)
else
:
# Check permissions on object
if
isinstance
(
checked_permission
,
str
):
checked_permission
=
(
checked_permission
,
)
checkPermission
=
self
.
portal_membership
.
checkPermission
for
b
in
brain_result
:
obj
=
b
.
getObject
()
if
obj
is
not
None
:
for
permission
in
checked_permission
:
if
not
checkPermission
(
permission
,
obj
):
break
result
.
append
(
obj
)
# Catalog-only search.
result
=
[]
for
r
in
search
(
category_list
=
category_list
,
portal_type
=
portal_type
,
strict_membership
=
strict_membership
):
try
:
result
.
append
(
self
.
unrestrictedTraverse
(
r
.
path
))
except
KeyError
:
pass
return
result
# XXX missing filter and **kw stuff
#return self.search_category(category_list=category_list,
# portal_type=spec)
# future implementation with brains, much more efficient
if
checked_permission
is
None
:
return
result
# Check permissions on object
if
isinstance
(
checked_permission
,
str
):
checked_permission
=
checked_permission
,
checkPermission
=
self
.
portal_membership
.
checkPermission
def
check
(
ob
):
for
permission
in
checked_permission
:
if
checkPermission
(
permission
,
ob
):
return
True
return
filter
(
check
,
result
)
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'getRelatedPropertyList'
)
...
...
product/CMFCategory/tests/testCMFCategory.py
View file @
7865c58d
...
...
@@ -60,6 +60,11 @@ class TestCMFCategory(ERP5TypeTestCase):
),
resource
=
dict
(
),
test0
=
dict
(
),
test1
=
dict
(
contents
=
(
'a'
,
(
'ab'
,
'ac'
,
(
'acd'
,))),
),
)
def
getTitle
(
self
):
...
...
@@ -104,7 +109,8 @@ class TestCMFCategory(ERP5TypeTestCase):
acquisition_copy_value
=
0
,
acquisition_append_value
=
0
,
acquisition_mask_value
=
0
,
acquisition_portal_type_list
=
"python: []"
)
acquisition_portal_type_list
=
"python: []"
,
related_locally_indexed
=
0
)
edit_kw
.
update
(
kw
)
queue
=
deque
(((
bc
,
edit_kw
.
pop
(
'contents'
,
())),))
bc
.
edit
(
**
edit_kw
)
...
...
@@ -129,6 +135,7 @@ class TestCMFCategory(ERP5TypeTestCase):
ti
=
self
.
getTypesTool
().
getTypeInfo
(
portal_type
)
ti
.
filter_content_types
=
0
self
.
_original_categories
[
portal_type
]
=
x
=
ti
.
getTypeBaseCategoryList
()
x
+=
'test0'
,
'test1'
ti
.
_setTypeBaseCategoryList
(
x
+
categories
)
# Make persons.
...
...
@@ -1094,6 +1101,55 @@ class TestCMFCategory(ERP5TypeTestCase):
self
.
assertEqual
(
get
(
bc
.
id
),
list
(
'bab'
))
_set
(
bc
.
id
,
())
def
test_relatedIndex
(
self
):
category_tool
=
self
.
getCategoriesTool
()
newOrganisation
=
self
.
getOrganisationModule
().
newContent
organisation
=
newOrganisation
()
other_organisation
=
newOrganisation
(
destination_value
=
organisation
)
person
=
self
.
getPersonModule
().
newContent
(
test0_value
=
organisation
,
test1
=
'a/ac/acd'
)
self
.
tic
()
get
=
organisation
.
getTest0RelatedValueList
a
=
category_tool
.
test1
.
a
def
check
():
self
.
assertEqual
([
person
,
other_organisation
],
category_tool
.
getRelatedValueList
(
organisation
))
self
.
assertEqual
([
person
],
get
())
self
.
assertEqual
([
person
],
get
(
portal_type
=
'Person'
))
self
.
assertEqual
([],
get
(
portal_type
=
'Organisation'
))
self
.
assertEqual
([
person
],
a
.
getTest1RelatedValueList
(
portal_type
=
'Person'
))
self
.
assertEqual
([
a
],
a
.
getTest1RelatedValueList
(
strict_membership
=
True
))
self
.
assertEqual
([
person
],
a
.
ac
.
acd
.
getTest1RelatedValueList
(
portal_type
=
'Person'
,
strict_membership
=
True
))
category_tool
.
test0
.
_setRelatedLocallyIndexed
(
True
)
category_tool
.
test1
.
_setRelatedLocallyIndexed
(
True
)
check
()
related_list
=
sorted
(
a
.
getTest1RelatedList
())
self
.
assertTrue
(
person
.
getRelativeUrl
()
in
related_list
)
self
.
assertEqual
(
related_list
,
sorted
(
x
.
getRelativeUrl
()
for
x
in
self
.
portal
.
portal_catalog
(
test1_uid
=
a
.
getUid
())))
related
=
organisation
.
_related_index
self
.
assertTrue
(
related
)
self
.
assertEqual
([
person
.
getRelativeUrl
()],
list
(
related
.
test0
))
person
.
unindexObject
()
self
.
tic
()
category_tool
.
test0
.
_setRelatedLocallyIndexed
(
False
)
self
.
assertEqual
([],
get
())
category_tool
.
test0
.
_setRelatedLocallyIndexed
(
True
)
check
()
person
.
categories
=
tuple
(
x
for
x
in
person
.
categories
if
not
x
.
startswith
(
'test0/'
))
self
.
assertEqual
([],
get
())
self
.
assertFalse
(
related
)
self
.
assertEqual
([],
list
(
related
.
test0
))
related
=
a
.
ac
.
acd
.
_related_index
.
test1
self
.
assertEqual
(
list
(
related
),
[
person
.
getRelativeUrl
()])
person
.
_setTest1Value
(
a
)
self
.
assertEqual
(
list
(
related
),
[])
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
TestCMFCategory
))
...
...
product/ERP5/Document/BusinessTemplate.py
View file @
7865c58d
...
...
@@ -544,7 +544,8 @@ class BaseTemplateItem(Implicit, Persistent):
klass
=
obj
.
__class__
classname
=
klass
.
__name__
attr_set
=
set
((
'_dav_writelocks'
,
'_filepath'
,
'_owner'
,
'last_id'
,
'uid'
,
attr_set
=
set
((
'_dav_writelocks'
,
'_filepath'
,
'_owner'
,
'_related_index'
,
'last_id'
,
'uid'
,
'__ac_local_roles__'
,
'__ac_local_roles_group_id_dict__'
))
if
export
:
if
not
keep_workflow_history
:
...
...
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseCategory_validateRelatedLocallyIndexed.xml
0 → 100644
View file @
7865c58d
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_body
</string>
</key>
<value>
<string>
return not (value and (\n
request.other[\'field_my_acquisition_object_id_list\'] or\n
request.other[\'field_my_acquisition_base_category_list\']))\n
</string>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
value, request
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
BaseCategory_validateRelatedLocallyIndexed
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseCategory_view.xml
View file @
7865c58d
...
...
@@ -105,6 +105,7 @@
<key>
<string>
right
</string>
</key>
<value>
<list>
<string>
my_related_locally_indexed
</string>
<string>
my_acquisition_copy_value
</string>
<string>
my_acquisition_mask_value
</string>
<string>
my_acquisition_append_value
</string>
...
...
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BaseCategory_view/my_related_locally_indexed.xml
0 → 100644
View file @
7865c58d
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ProxyField"
module=
"Products.ERP5Form.ProxyField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
delegated_list
</string>
</key>
<value>
<list>
<string>
external_validator
</string>
<string>
title
</string>
</list>
</value>
</item>
<item>
<key>
<string>
delegated_message_list
</string>
</key>
<value>
<list>
<string>
external_validator_failed
</string>
</list>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
my_related_locally_indexed
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
Local index is incompatible with category acquision.
</string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
overrides
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
tales
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string>
my_checkbox
</string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string>
Base_viewFieldLibrary
</string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string>
Click to edit the target
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Index Related Documents Locally
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"Method"
module=
"Products.Formulator.MethodField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
method_name
</string>
</key>
<value>
<string>
BaseCategory_validateRelatedLocallyIndexed
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Base_zSearchRelatedObjectsByCategoryList.xml
View file @
7865c58d
...
...
@@ -58,15 +58,11 @@ order_by_expression</string> </value>
<key>
<string>
src
</string>
</key>
<value>
<string
encoding=
"cdata"
>
<![CDATA[
SELECT DISTINCT catalog.uid,
catalog.path
, portal_type\n
SELECT DISTINCT catalog.uid,
path, relative_url
, portal_type\n
FROM catalog, category\n
WHERE catalog.uid = category.uid\n
<dtml-if portal_type>
\n
AND\n
(
<dtml-in
portal_type
>
\n
<dtml-unless
sequence-start
>
OR
</dtml-unless>
\n
catalog.portal_type=\'
<dtml-var
sequence-item
>
\'\n
</dtml-in>
)\n
AND
<dtml-sqltest
portal_type
type=
"string"
multiple
>
\n
</dtml-if>
\n
AND (
<dtml-var
"portal_categories.buildSQLSelector(category_list)"
>
)\n
<dtml-if
strict_membership
>
\n
...
...
product/ERP5/bootstrap/erp5_property_sheets/PropertySheetTemplateItem/portal_property_sheets/BaseCategory/related_locally_indexed_property.xml
0 → 100644
View file @
7865c58d
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Standard Property"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_local_properties
</string>
</key>
<value>
<tuple>
<dictionary>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
mode
</string>
</value>
</item>
<item>
<key>
<string>
type
</string>
</key>
<value>
<string>
string
</string>
</value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
elementary_type/boolean
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
Determines if related values should be indexed on target documents (i.e. in ZODB) in addition to catalog.\n
This is incompatible with category acquisition.
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
related_locally_indexed_property
</string>
</value>
</item>
<item>
<key>
<string>
mode
</string>
</key>
<value>
<string>
w
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Standard Property
</string>
</value>
</item>
<item>
<key>
<string>
property_default
</string>
</key>
<value>
<string>
python: 0
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
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