Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
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
Kirill Smelkov
Zope
Commits
a21ac356
Commit
a21ac356
authored
Oct 04, 2005
by
Browse files
Options
Browse Files
Download
Plain Diff
backported some small interface improvements and related cleanup from the trunk
parents
e9b5dde3
a0b80c75
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
166 additions
and
396 deletions
+166
-396
lib/python/Products/MailHost/MailHost.py
lib/python/Products/MailHost/MailHost.py
+37
-25
lib/python/Products/MailHost/interfaces.py
lib/python/Products/MailHost/interfaces.py
+25
-0
lib/python/Products/MailHost/tests/testMailHost.py
lib/python/Products/MailHost/tests/testMailHost.py
+53
-18
lib/python/Products/PluginIndexes/common/PluggableIndex.py
lib/python/Products/PluginIndexes/common/PluggableIndex.py
+18
-84
lib/python/Products/PluginIndexes/interfaces.py
lib/python/Products/PluginIndexes/interfaces.py
+10
-17
lib/python/Products/ZCatalog/IZCatalog.py
lib/python/Products/ZCatalog/IZCatalog.py
+8
-234
lib/python/Products/ZCatalog/ProgressHandler.py
lib/python/Products/ZCatalog/ProgressHandler.py
+3
-6
lib/python/Products/ZCatalog/ZCatalogIndexes.py
lib/python/Products/ZCatalog/ZCatalogIndexes.py
+12
-7
lib/python/Products/ZCatalog/interfaces.py
lib/python/Products/ZCatalog/interfaces.py
+0
-5
No files found.
lib/python/Products/MailHost/MailHost.py
View file @
a21ac356
...
@@ -7,28 +7,38 @@
...
@@ -7,28 +7,38 @@
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
# FOR A PARTICULAR PURPOSE
.
#
#
##############################################################################
##############################################################################
"""SMTP mail objects
"""SMTP mail objects
$Id$"""
__version__
=
"$Revision: 1.83 $"
[
11
:
-
2
]
from
Globals
import
Persistent
,
DTMLFile
,
InitializeClass
$Id$
from
smtplib
import
SMTP
"""
from
AccessControl.Role
import
RoleManager
from
operator
import
truth
import
mimetools
import
Acquisition
,
sys
,
types
,
mimetools
import
rfc822
import
OFS.SimpleItem
,
re
,
quopri
,
rfc822
from
cStringIO
import
StringIO
from
cStringIO
import
StringIO
from
smtplib
import
SMTP
import
Acquisition
import
OFS.SimpleItem
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
ClassSecurityInfo
from
AccessControl.Permissions
import
view_management_screens
,
\
from
AccessControl.Permissions
import
change_configuration
use_mailhost_services
from
AccessControl.Permissions
import
use_mailhost_services
from
AccessControl.Permissions
import
view_management_screens
from
AccessControl.Role
import
RoleManager
from
Globals
import
Persistent
,
DTMLFile
,
InitializeClass
from
DateTime
import
DateTime
from
DateTime
import
DateTime
from
zope.interface
import
implements
from
interfaces
import
IMailHost
class
MailHostError
(
Exception
):
class
MailHostError
(
Exception
):
pass
pass
manage_addMailHostForm
=
DTMLFile
(
'dtml/addMailHost_form'
,
globals
())
manage_addMailHostForm
=
DTMLFile
(
'dtml/addMailHost_form'
,
globals
())
def
manage_addMailHost
(
self
,
id
,
title
=
''
,
smtp_host
=
'localhost'
def
manage_addMailHost
(
self
,
id
,
title
=
''
,
smtp_host
=
'localhost'
,
localhost
=
'localhost'
,
smtp_port
=
25
,
localhost
=
'localhost'
,
smtp_port
=
25
...
@@ -42,8 +52,13 @@ def manage_addMailHost( self, id, title='', smtp_host='localhost'
...
@@ -42,8 +52,13 @@ def manage_addMailHost( self, id, title='', smtp_host='localhost'
add
=
manage_addMailHost
add
=
manage_addMailHost
class
MailBase
(
Acquisition
.
Implicit
,
OFS
.
SimpleItem
.
Item
,
RoleManager
):
class
MailBase
(
Acquisition
.
Implicit
,
OFS
.
SimpleItem
.
Item
,
RoleManager
):
'a mailhost...?'
'a mailhost...?'
implements
(
IMailHost
)
meta_type
=
'Mail Host'
meta_type
=
'Mail Host'
manage
=
manage_main
=
DTMLFile
(
'dtml/manageMailHost'
,
globals
())
manage
=
manage_main
=
DTMLFile
(
'dtml/manageMailHost'
,
globals
())
manage_main
.
_setName
(
'manage_main'
)
manage_main
.
_setName
(
'manage_main'
)
...
@@ -81,8 +96,7 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
...
@@ -81,8 +96,7 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
self
.
smtp_host
=
smtp_host
self
.
smtp_host
=
smtp_host
self
.
smtp_port
=
smtp_port
self
.
smtp_port
=
smtp_port
security
.
declareProtected
(
change_configuration
,
'manage_makeChanges'
)
security
.
declareProtected
(
'Change configuration'
,
'manage_makeChanges'
)
def
manage_makeChanges
(
self
,
title
,
smtp_host
,
smtp_port
,
smtp_uid
=
''
,
smtp_pwd
=
''
,
REQUEST
=
None
):
def
manage_makeChanges
(
self
,
title
,
smtp_host
,
smtp_port
,
smtp_uid
=
''
,
smtp_pwd
=
''
,
REQUEST
=
None
):
'make the changes'
'make the changes'
...
@@ -102,8 +116,7 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
...
@@ -102,8 +116,7 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
,
manage_tabs_message
=
msg
,
manage_tabs_message
=
msg
)
)
security
.
declareProtected
(
use_mailhost_services
,
'sendTemplate'
)
security
.
declareProtected
(
use_mailhost_services
,
'sendTemplate'
)
def
sendTemplate
(
trueself
,
self
,
messageTemplate
,
def
sendTemplate
(
trueself
,
self
,
messageTemplate
,
statusTemplate
=
None
,
mto
=
None
,
mfrom
=
None
,
statusTemplate
=
None
,
mto
=
None
,
mfrom
=
None
,
encode
=
None
,
REQUEST
=
None
):
encode
=
None
,
REQUEST
=
None
):
...
@@ -122,8 +135,7 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
...
@@ -122,8 +135,7 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
except
:
except
:
return
"SEND OK"
return
"SEND OK"
security
.
declareProtected
(
use_mailhost_services
,
'send'
)
security
.
declareProtected
(
use_mailhost_services
,
'send'
)
def
send
(
self
,
messageText
,
mto
=
None
,
mfrom
=
None
,
subject
=
None
,
def
send
(
self
,
messageText
,
mto
=
None
,
mfrom
=
None
,
subject
=
None
,
encode
=
None
):
encode
=
None
):
...
@@ -131,21 +143,19 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
...
@@ -131,21 +143,19 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
messageText
=
_encode
(
messageText
,
encode
)
messageText
=
_encode
(
messageText
,
encode
)
self
.
_send
(
mfrom
,
mto
,
messageText
)
self
.
_send
(
mfrom
,
mto
,
messageText
)
# This is here for backwards compatibility only. Possibly it could
# This is here for backwards compatibility only. Possibly it could
# be used to send messages at a scheduled future time, or via a mail queue?
# be used to send messages at a scheduled future time, or via a mail queue?
security
.
declareProtected
(
use_mailhost_services
,
'scheduledSend'
)
security
.
declareProtected
(
use_mailhost_services
,
'scheduledSend'
)
scheduledSend
=
send
scheduledSend
=
send
security
.
declareProtected
(
use_mailhost_services
,
'simple_send'
)
security
.
declareProtected
(
use_mailhost_services
,
'simple_send'
)
def
simple_send
(
self
,
mto
,
mfrom
,
subject
,
body
):
def
simple_send
(
self
,
mto
,
mfrom
,
subject
,
body
):
body
=
"From: %s
\
n
To: %s
\
n
Subject: %s
\
n
\
n
%s"
%
(
body
=
"From: %s
\
n
To: %s
\
n
Subject: %s
\
n
\
n
%s"
%
(
mfrom
,
mto
,
subject
,
body
)
mfrom
,
mto
,
subject
,
body
)
self
.
_send
(
mfrom
,
mto
,
body
)
self
.
_send
(
mfrom
,
mto
,
body
)
security
.
declarePrivate
(
'_send'
)
security
.
declarePrivate
(
'_send'
)
def
_send
(
self
,
mfrom
,
mto
,
messageText
):
def
_send
(
self
,
mfrom
,
mto
,
messageText
):
""" Send the message """
""" Send the message """
smtpserver
=
SMTP
(
self
.
smtp_host
,
int
(
self
.
smtp_port
)
)
smtpserver
=
SMTP
(
self
.
smtp_host
,
int
(
self
.
smtp_port
)
)
...
@@ -154,12 +164,14 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
...
@@ -154,12 +164,14 @@ class MailBase(Acquisition.Implicit, OFS.SimpleItem.Item, RoleManager):
smtpserver
.
sendmail
(
mfrom
,
mto
,
messageText
)
smtpserver
.
sendmail
(
mfrom
,
mto
,
messageText
)
smtpserver
.
quit
()
smtpserver
.
quit
()
InitializeClass
(
MailBase
)
InitializeClass
(
MailBase
)
class
MailHost
(
Persistent
,
MailBase
):
class
MailHost
(
Persistent
,
MailBase
):
"persistent version"
"persistent version"
def
_encode
(
body
,
encode
=
None
):
def
_encode
(
body
,
encode
=
None
):
if
encode
is
None
:
if
encode
is
None
:
return
body
return
body
...
@@ -191,7 +203,7 @@ def _mungeHeaders( messageText, mto=None, mfrom=None, subject=None):
...
@@ -191,7 +203,7 @@ def _mungeHeaders( messageText, mto=None, mfrom=None, subject=None):
mo
[
'Subject'
]
=
'[No Subject]'
mo
[
'Subject'
]
=
'[No Subject]'
if
mto
:
if
mto
:
if
isinstance
(
mto
,
types
.
StringType
):
if
isinstance
(
mto
,
basestring
):
mto
=
[
rfc822
.
dump_address_pair
(
addr
)
for
addr
in
rfc822
.
AddressList
(
mto
)
]
mto
=
[
rfc822
.
dump_address_pair
(
addr
)
for
addr
in
rfc822
.
AddressList
(
mto
)
]
if
not
mo
.
getheader
(
'To'
):
if
not
mo
.
getheader
(
'To'
):
mo
[
'To'
]
=
','
.
join
(
mto
)
mo
[
'To'
]
=
','
.
join
(
mto
)
...
...
lib/python/Products/MailHost/interfaces.py
0 → 100644
View file @
a21ac356
##############################################################################
#
# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""MailHost z3 interfaces.
$Id$
"""
from
zope.interface
import
Interface
class
IMailHost
(
Interface
):
def
send
(
messageText
,
mto
=
None
,
mfrom
=
None
,
subject
=
None
,
encode
=
None
):
"""Send mail.
"""
lib/python/Products/MailHost/tests/testMailHost.py
View file @
a21ac356
import
os
,
sys
,
unittest
##############################################################################
#
# Copyright (c) 2002 Zope Corporation and Contributors. All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""MailHost unit tests.
$Id$
"""
import
unittest
import
string
,
cStringIO
,
re
import
ZODB
,
Acquisition
from
Products.MailHost.MailHost
import
MailHostError
,
_mungeHeaders
from
Products.MailHost.MailHost
import
MailHostError
,
_mungeHeaders
class
TestMailHost
(
unittest
.
TestCase
):
class
TestMailHost
(
unittest
.
TestCase
):
def
_getTargetClass
(
self
):
from
Products.MailHost.MailHost
import
MailHost
return
MailHost
def
test_z3interfaces
(
self
):
from
Products.MailHost.interfaces
import
IMailHost
from
zope.interface.verify
import
verifyClass
verifyClass
(
IMailHost
,
self
.
_getTargetClass
())
def
testAllHeaders
(
self
):
def
testAllHeaders
(
self
):
msg
=
"""To: recipient@domain.com
msg
=
"""To: recipient@domain.com
...
@@ -18,12 +45,14 @@ This is the message body."""
...
@@ -18,12 +45,14 @@ This is the message body."""
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
# Add duplicated info
# Add duplicated info
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
'recipient@domain.com'
,
'sender@domain.com'
,
'This is the subject'
)
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
'recipient@domain.com'
,
'sender@domain.com'
,
'This is the subject'
)
self
.
failUnless
(
resto
==
[
'recipient@domain.com'
])
self
.
failUnless
(
resto
==
[
'recipient@domain.com'
])
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
# Add extra info
# Add extra info
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
'recipient2@domain.com'
,
'sender2@domain.com'
,
'This is the real subject'
)
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
'recipient2@domain.com'
,
'sender2@domain.com'
,
'This is the real subject'
)
self
.
failUnless
(
resto
==
[
'recipient2@domain.com'
])
self
.
failUnless
(
resto
==
[
'recipient2@domain.com'
])
self
.
failUnless
(
resfrom
==
'sender2@domain.com'
)
self
.
failUnless
(
resfrom
==
'sender2@domain.com'
)
...
@@ -32,18 +61,23 @@ This is the message body."""
...
@@ -32,18 +61,23 @@ This is the message body."""
This is the message body."""
This is the message body."""
# Doesn't specify to
# Doesn't specify to
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mfrom
=
'sender@domain.com'
)
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mfrom
=
'sender@domain.com'
)
# Doesn't specify from
# Doesn't specify from
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mto
=
'recipient@domain.com'
)
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mto
=
'recipient@domain.com'
)
def
testNoHeaders
(
self
):
def
testNoHeaders
(
self
):
msg
=
"""This is the message body."""
msg
=
"""This is the message body."""
# Doesn't specify to
# Doesn't specify to
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mfrom
=
'sender@domain.com'
)
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mfrom
=
'sender@domain.com'
)
# Doesn't specify from
# Doesn't specify from
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mto
=
'recipient@domain.com'
)
self
.
failUnlessRaises
(
MailHostError
,
_mungeHeaders
,
msg
,
mto
=
'recipient@domain.com'
)
# Specify all
# Specify all
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
'recipient2@domain.com'
,
'sender2@domain.com'
,
'This is the real subject'
)
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
'recipient2@domain.com'
,
'sender2@domain.com'
,
'This is the real subject'
)
self
.
failUnless
(
resto
==
[
'recipient2@domain.com'
])
self
.
failUnless
(
resto
==
[
'recipient2@domain.com'
])
self
.
failUnless
(
resfrom
==
'sender2@domain.com'
)
self
.
failUnless
(
resfrom
==
'sender2@domain.com'
)
...
@@ -66,23 +100,24 @@ This is the message body."""
...
@@ -66,23 +100,24 @@ This is the message body."""
# Test Address-Parser for To & CC given in messageText
# Test Address-Parser for To & CC given in messageText
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
)
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
)
self
.
failUnless
(
resto
==
[
'"Name, Nick" <recipient@domain.com>'
,
'"Foo Bar" <foo@domain.com>'
,
'"Web, Jack" <jack@web.com>'
])
self
.
failUnless
(
resto
==
[
'"Name, Nick" <recipient@domain.com>'
,
'"Foo Bar" <foo@domain.com>'
,
'"Web, Jack" <jack@web.com>'
])
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
# Test Address-Parser for a given mto-string
# Test Address-Parser for a given mto-string
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
mto
=
'"Public, Joe" <pjoe@domain.com>, "Foo Bar" <foo@domain.com>'
)
resmsg
,
resto
,
resfrom
=
_mungeHeaders
(
msg
,
mto
=
'"Public, Joe" <pjoe@domain.com>, "Foo Bar" <foo@domain.com>'
)
self
.
failUnless
(
resto
==
[
'"Public, Joe" <pjoe@domain.com>'
,
'"Foo Bar" <foo@domain.com>'
])
self
.
failUnless
(
resto
==
[
'"Public, Joe" <pjoe@domain.com>'
,
'"Foo Bar" <foo@domain.com>'
])
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
self
.
failUnless
(
resfrom
==
'sender@domain.com'
)
def
test_suite
():
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
TestMailHost
)
)
suite
.
addTest
(
unittest
.
makeSuite
(
TestMailHost
)
)
return
suite
return
suite
def
main
():
unittest
.
TextTestRunner
().
run
(
test_suite
())
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
main
(
)
unittest
.
main
(
defaultTest
=
'test_suite'
)
lib/python/Products/PluginIndexes/common/PluggableIndex.py
View file @
a21ac356
...
@@ -7,94 +7,28 @@
...
@@ -7,94 +7,28 @@
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
# FOR A PARTICULAR PURPOSE
.
#
#
##############################################################################
##############################################################################
"""Pluggable Index interfaces.
"""Pluggable Index Interface"""
$Id$
__version__
=
'$Revision: 1.9 $'
[
11
:
-
2
]
"""
import
Interface
class
PluggableIndexInterface
(
Interface
.
Base
):
# create PluggableIndexInterface, UniqueValueIndex, SortIndex
from
Interface.bridge
import
createZope3Bridge
from
Products.PluginIndexes.interfaces
import
IPluggableIndex
from
Products.PluginIndexes.interfaces
import
ISortIndex
from
Products.PluginIndexes.interfaces
import
IUniqueValueIndex
import
PluggableIndex
def
getId
():
createZope3Bridge
(
IPluggableIndex
,
PluggableIndex
,
'PluggableIndexInterface'
)
"""Return Id of index."""
createZope3Bridge
(
ISortIndex
,
PluggableIndex
,
'SortIndex'
)
createZope3Bridge
(
IUniqueValueIndex
,
PluggableIndex
,
'UniqueValueIndex'
)
def
getEntryForObject
(
documentId
,
default
=
None
):
del
createZope3Bridge
"""Get all information contained for 'documentId'."""
del
IPluggableIndex
del
ISortIndex
def
getIndexSourceNames
():
del
IUniqueValueIndex
""" return a sequence of attribute names that are indexed
del
PluggableIndex
by the index.
"""
def
index_object
(
documentId
,
obj
,
threshold
=
None
):
"""Index an object.
'documentId' is the integer ID of the document.
'obj' is the object to be indexed.
'threshold' is the number of words to process between committing
subtransactions. If None, subtransactions are disabled.
"""
def
unindex_object
(
documentId
):
"""Remove the documentId from the index."""
def
_apply_index
(
request
,
cid
=
''
):
"""Apply the index to query parameters given in 'request'.
The argument should be a mapping object.
If the request does not contain the needed parametrs, then
None is returned.
If the request contains a parameter with the name of the column
+ "_usage", it is sniffed for information on how to handle applying
the index. (Note: this style or parameters is deprecated)
If the request contains a parameter with the name of the
column and this parameter is either a Record or a class
instance then it is assumed that the parameters of this index
are passed as attribute (Note: this is the recommended way to
pass parameters since Zope 2.4)
Otherwise two objects are returned. The first object is a
ResultSet containing the record numbers of the matching
records. The second object is a tuple containing the names of
all data fields used.
"""
def
numObjects
():
"""Return the number of indexed objects"""
def
indexSize
():
"""Return the size of the index in terms of distinct values"""
def
clear
():
"""Empty the index"""
class
UniqueValueIndex
(
PluggableIndexInterface
):
"""An index which can return lists of unique values contained in it"""
def
hasUniqueValuesFor
(
name
):
"""Return true if the index can return the unique values for name"""
def
uniqueValues
(
name
=
None
,
withLengths
=
0
):
"""Return the unique values for name.
If 'withLengths' is true, returns a sequence of tuples of
(value, length)."""
class
SortIndex
(
PluggableIndexInterface
):
"""An index which may be used to sort a set of document ids"""
def
keyForDocument
(
documentId
):
"""Return the sort key that cooresponds to the specified document id
This method is no longer used by ZCatalog, but is left for backwards
compatibility."""
def
documentToKeyMap
():
"""Return an object that supports __getitem__ and may be used to quickly
lookup the sort key given a document id"""
lib/python/Products/PluginIndexes/interfaces.py
View file @
a21ac356
...
@@ -19,8 +19,6 @@ from zope.interface import Interface
...
@@ -19,8 +19,6 @@ from zope.interface import Interface
from
zope.schema
import
Bool
from
zope.schema
import
Bool
# XXX: copied from common.PluggableIndex.PluggableIndexInterface;
# should be bridged
class
IPluggableIndex
(
Interface
):
class
IPluggableIndex
(
Interface
):
def
getId
():
def
getId
():
...
@@ -30,8 +28,7 @@ class IPluggableIndex(Interface):
...
@@ -30,8 +28,7 @@ class IPluggableIndex(Interface):
"""Get all information contained for 'documentId'."""
"""Get all information contained for 'documentId'."""
def
getIndexSourceNames
():
def
getIndexSourceNames
():
""" return a sequence of attribute names that are indexed
"""Get a sequence of attribute names that are indexed by the index.
by the index.
"""
"""
def
index_object
(
documentId
,
obj
,
threshold
=
None
):
def
index_object
(
documentId
,
obj
,
threshold
=
None
):
...
@@ -69,26 +66,24 @@ class IPluggableIndex(Interface):
...
@@ -69,26 +66,24 @@ class IPluggableIndex(Interface):
records. The second object is a tuple containing the names of
records. The second object is a tuple containing the names of
all data fields used.
all data fields used.
"""
"""
def
numObjects
():
def
numObjects
():
"""Return the number of indexed objects"""
"""Return the number of indexed objects"""
# XXX:
this is currently broken
# XXX:
not implemented by TextIndex and TopicIndex
# def indexSize():
# def indexSize():
# """Return the size of the index in terms of distinct values"""
# """Return the size of the index in terms of distinct values"""
def
clear
():
def
clear
():
"""Empty the index"""
"""Empty the index"""
# XXX: copied from from common.PluggableIndex.UniqueValueIndex;
# should be bridged
class
IUniqueValueIndex
(
IPluggableIndex
):
class
IUniqueValueIndex
(
IPluggableIndex
):
"""An index which can return lists of unique values contained in it"""
"""An index which can return lists of unique values contained in it"""
def
hasUniqueValuesFor
(
name
):
def
hasUniqueValuesFor
(
name
):
"""Return true if the index can return the unique values for name"""
"""Return true if the index can return the unique values for name"""
def
uniqueValues
(
name
=
None
,
withLengths
=
0
):
def
uniqueValues
(
name
=
None
,
withLengths
=
0
):
"""Return the unique values for name.
"""Return the unique values for name.
...
@@ -96,17 +91,15 @@ class IUniqueValueIndex(IPluggableIndex):
...
@@ -96,17 +91,15 @@ class IUniqueValueIndex(IPluggableIndex):
(value, length)."""
(value, length)."""
# XXX: copied from from common.PluggableIndex.SortIndex;
# should be bridged
class
ISortIndex
(
IPluggableIndex
):
class
ISortIndex
(
IPluggableIndex
):
"""An index which may be used to sort a set of document ids"""
"""An index which may be used to sort a set of document ids"""
def
keyForDocument
(
documentId
):
def
keyForDocument
(
documentId
):
"""Return the sort key that cooresponds to the specified document id
"""Return the sort key that cooresponds to the specified document id
This method is no longer used by ZCatalog, but is left for backwards
This method is no longer used by ZCatalog, but is left for backwards
compatibility."""
compatibility."""
def
documentToKeyMap
():
def
documentToKeyMap
():
"""Return an object that supports __getitem__ and may be used to quickly
"""Return an object that supports __getitem__ and may be used to quickly
lookup the sort key given a document id"""
lookup the sort key given a document id"""
...
...
lib/python/Products/ZCatalog/IZCatalog.py
View file @
a21ac356
##############################################################################
##############################################################################
#
#
# Copyright (c) 2002 Zope Corporation and Contributors.
# Copyright (c) 2002 Zope Corporation and Contributors. All Rights Reserved.
# All Rights Reserved.
#
#
# This software is subject to the provisions of the Zope Public License,
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
...
@@ -15,238 +14,13 @@
...
@@ -15,238 +14,13 @@
$Id$
$Id$
"""
"""
from
Interface
import
Interface
class
IZCatalog
(
Interface
):
# create IZCatalog
"""ZCatalog object
from
Interface.bridge
import
createZope3Bridge
from
interfaces
import
IZCatalog
as
z3IZCatalog
import
IZCatalog
A ZCatalog contains arbitrary index like references to Zope
createZope3Bridge
(
z3IZCatalog
,
IZCatalog
,
'IZCatalog'
)
objects. ZCatalog's can index object attribute using a variety
of "plug-in" index types.
Several index types are included, and others may be added.
del
createZope3Bridge
del
z3IZCatalog
Text -- Text indexes index textual content. The index can be
used to search for objects containing certain words.
Field -- Field indexes index atomic values. The index can be
used to search for objects that have certain properties.
Keyword -- Keyword indexes index sequences of values. The index
can be used to search for objects that match one or more of the
search terms.
Path -- Path indexes index URI paths. They allow you to find objects
based on their placement in a hierarchy.
Date -- Date indexes index date and type data. They are a type of field
index specifically optimized for indexing dates.
Date Range -- Date range indexes index time intervals. They are designed
for efficient searching of dates falling between two boundaries
(such as effective / expiration dates).
Topic -- Topic indexes store prefiltered sets of documents. They are used
to optimize complex queries into a single fast query by prefiltering
documents by an expression
The ZCatalog can maintain a table of extra data about cataloged
objects. This information can be used on search result pages to
show information about a search result.
The meta-data table schema is used to build the schema for
ZCatalog Result objects. The objects have the same attributes
as the column of the meta-data table.
ZCatalog does not store references to the objects themselves, but
rather to a unique identifier that defines how to get to the
object. In Zope, this unique identifier is the object's relative
path to the ZCatalog (since two Zope objects cannot have the same
URL, this is an excellent unique qualifier in Zope).
"""
def
catalog_object
(
obj
,
uid
,
idxs
=
None
,
update_metadata
=
1
):
"""Catalogs the object 'obj' with the unique identifier 'uid'.
The uid must be a physical path, either absolute or relative to
the catalog.
If provided, idxs specifies the names of indexes to update.
If update_metadata is specified (the default), the object's metadata
is updated. If it is not, the metadata is left untouched. This
flag has no effect if the object is not yet cataloged (metadata
is always added for new objects).
"""
def
uncatalog_object
(
uid
):
"""Uncatalogs the object with the unique identifier 'uid'.
The uid must be a physical path, either absolute or relative to
the catalog.
"""
def
uniqueValuesFor
(
name
):
"""returns the unique values for a given FieldIndex named 'name'.
"""
def
getpath
(
rid
):
"""Return the path to a cataloged object given a 'data_record_id_'
"""
def
getrid
(
rid
):
"""Return the 'data_record_id_' to a cataloged object given a path
"""
def
getobject
(
rid
,
REQUEST
=
None
):
"""Return a cataloged object given a 'data_record_id_'
"""
def
schema
():
"""Get the meta-data schema
Returns a sequence of names that correspond to columns in the
meta-data table.
"""
def
indexes
():
"""Returns a sequence of names that correspond to indexes.
"""
def
index_objects
():
"""Returns a sequence of actual index objects.
NOTE: This returns unwrapped indexes! You should probably use
getIndexObjects instead. Some indexes expect to be wrapped.
"""
def
getIndexObjects
():
"""Returns a list of acquisition wrapped index objects
"""
def
searchResults
(
REQUEST
=
None
,
**
kw
):
"""Search the catalog.
Search terms can be passed in the REQUEST or as keyword
arguments.
Search queries consist of a mapping of index names to search
parameters. You can either pass a mapping to searchResults as
the variable 'REQUEST' or you can use index names and search
parameters as keyword arguments to the method, in other words::
searchResults(title='Elvis Exposed',
author='The Great Elvonso')
is the same as::
searchResults({'title' : 'Elvis Exposed',
'author : 'The Great Elvonso'})
In these examples, 'title' and 'author' are indexes. This
query will return any objects that have the title *Elvis
Exposed* AND also are authored by *The Great Elvonso*. Terms
that are passed as keys and values in a searchResults() call
are implicitly ANDed together. To OR two search results, call
searchResults() twice and add concatenate the results like this::
results = ( searchResults(title='Elvis Exposed') +
searchResults(author='The Great Elvonso') )
This will return all objects that have the specified title OR
the specified author.
There are some special index names you can pass to change the
behavior of the search query:
sort_on -- This parameters specifies which index to sort the
results on.
sort_order -- You can specify 'reverse' or 'descending'.
Default behavior is to sort ascending.
sort_limit -- An optimization hint to tell the catalog how many
results you are really interested in. See the limit argument
to the search method for more details.
There are some rules to consider when querying this method:
- an empty query mapping (or a bogus REQUEST) returns all
items in the catalog.
- results from a query involving only field/keyword
indexes, e.g. {'id':'foo'} and no 'sort_on' will be
returned unsorted.
- results from a complex query involving a field/keyword
index *and* a text index,
e.g. {'id':'foo','PrincipiaSearchSource':'bar'} and no
'sort_on' will be returned unsorted.
- results from a simple text index query
e.g.{'PrincipiaSearchSource':'foo'} will be returned
sorted in descending order by 'score'. A text index
cannot beused as a 'sort_on' parameter, and attempting
to do so will raise an error.
Depending on the type of index you are querying, you may be
able to provide more advanced search parameters that can
specify range searches or wildcards. These features are
documented in The Zope Book.
"""
def
__call__
(
REQUEST
=
None
,
**
kw
):
"""Search the catalog, the same way as 'searchResults'.
"""
def
search
(
query_request
,
sort_index
=
None
,
reverse
=
0
,
limit
=
None
,
merge
=
1
):
"""Programmatic search interface, use for searching the catalog from
scripts.
query_request -- Dictionary containing catalog query. This uses the
same format as searchResults.
sort_index -- Name of sort index
reverse -- Boolean, reverse sort order (defaults to false)
limit -- Limit sorted result count to the n best records. This is an
optimization hint used in conjunction with a sort_index. If possible
ZCatalog will use a different sort algorithm that uses much less memory
and scales better then a full sort. The actual number of records
returned is not guaranteed to be <= limit. You still need to apply the
same batching to the results. Since the len() of the results will no
longer be the actual result count, you can use the
"actual_result_count" attribute of the lazy result object instead to
determine the size of the full result set.
merge -- Return merged, lazy results (like searchResults) or raw
results for later merging. This can be used to perform multiple
queries (even across catalogs) and merge and sort the combined results.
"""
def
refreshCatalog
(
clear
=
0
,
pghandler
=
None
):
"""Reindex every object we can find, removing the unreachable
ones from the index.
clear -- values: 1|0 clear the catalog before reindexing
pghandler -- optional Progresshandler as defined in ProgressHandler.py
(see also README.txt)
"""
def
reindexIndex
(
name
,
REQUEST
,
pghandler
=
None
):
"""Reindex a single index.
name -- id of index
REQUEST -- REQUEST object
pghandler -- optional Progresshandler as defined in ProgressHandler.py
(see also README.txt)
"""
__doc__
=
IZCatalog
.
__doc__
+
__doc__
lib/python/Products/ZCatalog/ProgressHandler.py
View file @
a21ac356
...
@@ -7,12 +7,11 @@
...
@@ -7,12 +7,11 @@
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
# FOR A PARTICULAR PURPOSE
.
#
#
##############################################################################
##############################################################################
"""
"""
$Id
: ZCatalog.py 25050 2004-05-27 15:06:40Z chrisw
$
$Id$
"""
"""
import
time
,
sys
import
time
,
sys
...
@@ -95,6 +94,7 @@ class ZLogHandler(StdoutHandler):
...
@@ -95,6 +94,7 @@ class ZLogHandler(StdoutHandler):
def
output
(
self
,
text
):
def
output
(
self
,
text
):
LOG
(
self
.
_ident
,
INFO
,
text
)
LOG
(
self
.
_ident
,
INFO
,
text
)
class
FilelogHandler
(
StdoutHandler
):
class
FilelogHandler
(
StdoutHandler
):
""" Use a custom file for logging """
""" Use a custom file for logging """
...
@@ -106,6 +106,3 @@ class FilelogHandler(StdoutHandler):
...
@@ -106,6 +106,3 @@ class FilelogHandler(StdoutHandler):
def
output
(
self
,
text
):
def
output
(
self
,
text
):
open
(
self
.
filename
,
'a'
).
write
(
text
+
'
\
n
'
)
open
(
self
.
filename
,
'a'
).
write
(
text
+
'
\
n
'
)
lib/python/Products/ZCatalog/ZCatalogIndexes.py
View file @
a21ac356
...
@@ -7,33 +7,37 @@
...
@@ -7,33 +7,37 @@
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
# FOR A PARTICULAR PURPOSE
.
#
#
##############################################################################
##############################################################################
"""Virtual container for ZCatalog indexes.
"""
$Id$
$Id$
"""
"""
from
Acquisition
import
Implicit
from
Acquisition
import
Implicit
from
Persistence
import
Persistent
from
Persistence
import
Persistent
from
Globals
import
DTMLFile
,
InitializeClass
from
Globals
import
DTMLFile
,
InitializeClass
from
AccessControl.SecurityInfo
import
ClassSecurityInfo
from
AccessControl.SecurityInfo
import
ClassSecurityInfo
from
AccessControl.Permissions
import
manage_zcatalog_indexes
from
AccessControl.Permissions
import
manage_zcatalog_indexes
from
OFS.Folder
import
Folder
from
OFS.Folder
import
Folder
from
OFS.SimpleItem
import
SimpleItem
from
OFS.ObjectManager
import
IFAwareObjectManager
from
OFS.ObjectManager
import
IFAwareObjectManager
from
OFS.SimpleItem
import
SimpleItem
from
Products.PluginIndexes.common.PluggableIndex
\
import
PluggableIndexInterface
from
Products.PluginIndexes.interfaces
import
IPluggableIndex
from
Products.PluginIndexes.common.PluggableIndex
import
PluggableIndexInterface
_marker
=
[]
_marker
=
[]
class
ZCatalogIndexes
(
IFAwareObjectManager
,
Folder
,
Persistent
,
Implicit
):
class
ZCatalogIndexes
(
IFAwareObjectManager
,
Folder
,
Persistent
,
Implicit
):
"""A mapping object, responding to getattr requests by looking up
"""A mapping object, responding to getattr requests by looking up
the requested indexes in an object manager."""
the requested indexes in an object manager."""
# The interfaces we want to show up in our object manager
# The interfaces we want to show up in our object manager
_product_interfaces
=
(
PluggableIndexInterface
,
)
_product_interfaces
=
(
PluggableIndexInterface
,
IPluggableIndex
)
meta_type
=
"ZCatalogIndex"
meta_type
=
"ZCatalogIndex"
manage_options
=
()
manage_options
=
()
...
@@ -113,6 +117,7 @@ class ZCatalogIndexes (IFAwareObjectManager, Folder, Persistent, Implicit):
...
@@ -113,6 +117,7 @@ class ZCatalogIndexes (IFAwareObjectManager, Folder, Persistent, Implicit):
InitializeClass
(
ZCatalogIndexes
)
InitializeClass
(
ZCatalogIndexes
)
class
OldCatalogWrapperObject
(
SimpleItem
,
Implicit
):
class
OldCatalogWrapperObject
(
SimpleItem
,
Implicit
):
manage_options
=
(
manage_options
=
(
...
...
lib/python/Products/ZCatalog/interfaces.py
View file @
a21ac356
...
@@ -18,8 +18,6 @@ $Id$
...
@@ -18,8 +18,6 @@ $Id$
from
zope.interface
import
Interface
from
zope.interface
import
Interface
# XXX: copied from IZCatalog.IZCatalog;
# should be bridged
class
IZCatalog
(
Interface
):
class
IZCatalog
(
Interface
):
"""ZCatalog object
"""ZCatalog object
...
@@ -66,7 +64,6 @@ class IZCatalog(Interface):
...
@@ -66,7 +64,6 @@ class IZCatalog(Interface):
object. In Zope, this unique identifier is the object's relative
object. In Zope, this unique identifier is the object's relative
path to the ZCatalog (since two Zope objects cannot have the same
path to the ZCatalog (since two Zope objects cannot have the same
URL, this is an excellent unique qualifier in Zope).
URL, this is an excellent unique qualifier in Zope).
"""
"""
def
catalog_object
(
obj
,
uid
,
idxs
=
None
,
update_metadata
=
1
):
def
catalog_object
(
obj
,
uid
,
idxs
=
None
,
update_metadata
=
1
):
...
@@ -111,7 +108,6 @@ class IZCatalog(Interface):
...
@@ -111,7 +108,6 @@ class IZCatalog(Interface):
Returns a sequence of names that correspond to columns in the
Returns a sequence of names that correspond to columns in the
meta-data table.
meta-data table.
"""
"""
def
indexes
():
def
indexes
():
...
@@ -198,7 +194,6 @@ class IZCatalog(Interface):
...
@@ -198,7 +194,6 @@ class IZCatalog(Interface):
able to provide more advanced search parameters that can
able to provide more advanced search parameters that can
specify range searches or wildcards. These features are
specify range searches or wildcards. These features are
documented in The Zope Book.
documented in The Zope Book.
"""
"""
def
__call__
(
REQUEST
=
None
,
**
kw
):
def
__call__
(
REQUEST
=
None
,
**
kw
):
...
...
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