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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Tristan Cavelier
erp5
Commits
015af31a
Commit
015af31a
authored
Jul 06, 2017
by
Julien Muchembled
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MailTemplates: fix newlines in BaseMailTemplate.py (LF, no trailing space)
parent
cd4ae3d6
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1538 additions
and
1540 deletions
+1538
-1540
product/MailTemplates/BaseMailTemplate.py
product/MailTemplates/BaseMailTemplate.py
+161
-163
product/MailTemplates/FSMailTemplate.py
product/MailTemplates/FSMailTemplate.py
+104
-104
product/MailTemplates/MailTemplate.py
product/MailTemplates/MailTemplate.py
+105
-105
product/MailTemplates/__init__.py
product/MailTemplates/__init__.py
+85
-85
product/MailTemplates/tests/__init__.py
product/MailTemplates/tests/__init__.py
+6
-6
product/MailTemplates/tests/example1.mt
product/MailTemplates/tests/example1.mt
+14
-14
product/MailTemplates/tests/example3.mt
product/MailTemplates/tests/example3.mt
+10
-10
product/MailTemplates/tests/example4.mt
product/MailTemplates/tests/example4.mt
+10
-10
product/MailTemplates/tests/test_FSMailTemplate.py
product/MailTemplates/tests/test_FSMailTemplate.py
+167
-167
product/MailTemplates/tests/test_MailTemplate.py
product/MailTemplates/tests/test_MailTemplate.py
+876
-876
No files found.
product/MailTemplates/BaseMailTemplate.py
View file @
015af31a
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
import
rfc822
from
AccessControl
import
ClassSecurityInfo
from
DateTime
import
DateTime
from
email.MIMEMultipart
import
MIMEMultipart
from
email.MIMEText
import
MIMEText
from
App.class_init
import
default__class_init__
as
InitializeClass
from
App.Common
import
package_home
from
MTMultipart
import
MTMultipart
from
Products.PageTemplates.ZopePageTemplate
import
ZopePageTemplate
from
Products.PageTemplates.PageTemplateFile
import
PageTemplateFile
from
ZPublisher
import
HTTPResponse
# Configured using zope.conf in Zope 2.7.8, Zope 2.8.2, and above
default_encoding
=
getattr
(
HTTPResponse
,
'default_encoding'
,
'iso-8859-15'
)
class
BaseMailTemplate
:
security
=
ClassSecurityInfo
()
_properties
=
()
ZScriptHTML_tryForm
=
None
content_type
=
'text/plain'
mailhost
=
None
security
.
declarePrivate
(
'_process'
)
def
_process
(
self
,
kw
):
# sort out what encoding we're going to use
encoding
=
kw
.
get
(
'encoding'
,
self
.
getProperty
(
'encoding'
,
default_encoding
))
text
=
self
.
__class__
.
__bases__
[
1
].
__call__
(
self
,
**
kw
)
if
not
self
.
html
():
text
=
text
.
encode
(
encoding
,
'replace'
)
# now turn the result into a MIMEText object
msg
=
MIMEText
(
text
.
replace
(
'
\
r
'
,
''
),
self
.
content_type
.
split
(
'/'
)[
1
],
encoding
)
# sort out what headers and addresses we're going to use
headers
=
{}
values
=
{}
# headers from the headers property
for
header
in
getattr
(
self
,
'headers'
,()):
name
,
value
=
header
.
split
(
':'
,
1
)
headers
[
name
]
=
value
# headers from the headers parameter
headers_param
=
kw
.
get
(
'headers'
,{})
headers
.
update
(
headers_param
)
# values and some specific headers
for
key
,
header
in
((
'mfrom'
,
'From'
),
(
'mto'
,
'To'
),
(
'mcc'
,
'Cc'
),
(
'mbcc'
,
'Bcc'
),
(
'subject'
,
'Subject'
)):
value
=
kw
.
get
(
key
,
headers_param
.
get
(
header
,
getattr
(
self
,
key
,
headers
.
get
(
header
))))
if
value
is
not
None
:
values
[
key
]
=
value
# turn some sequences in coma-seperated strings
if
isinstance
(
value
,
tuple
)
or
isinstance
(
value
,
list
):
value
=
', '
.
join
(
value
)
# make sure we have no unicode headers
if
isinstance
(
value
,
unicode
):
value
=
value
.
encode
(
encoding
)
headers
[
header
]
=
value
# check required values have been supplied
errors
=
[]
for
param
in
(
'mfrom'
,
'mto'
,
'subject'
):
if
not
values
.
get
(
param
):
errors
.
append
(
param
)
if
errors
:
raise
TypeError
(
'The following parameters were required by not specified: '
+
(
', '
.
join
(
errors
)
))
# add date header
headers
[
'Date'
]
=
DateTime
().
rfc822
()
# turn headers into an ordered list for predictable header order
keys
=
headers
.
keys
()
keys
.
sort
()
return
msg
,
values
,[(
key
,
headers
[
key
])
for
key
in
keys
]
security
.
declarePrivate
(
'_send'
)
def
_send
(
self
,
mfrom
,
mto
,
msg
):
mailhost
=
self
.
restrictedTraverse
(
self
.
mailhost
,
None
)
if
not
getattr
(
mailhost
,
'meta_type'
,
None
)
in
(
'Mail Host'
,
'Maildrop Host'
):
raise
RuntimeError
(
'Could not traverse to MailHost %r'
%
self
.
mailhost
)
mailhost
.
_send
(
mfrom
,
mto
,
msg
.
as_string
())
security
.
declareProtected
(
'View'
,
'send'
)
def
send
(
self
,
**
kw
):
msg
,
values
,
headers
=
self
.
_process
(
kw
)
for
header
,
value
in
headers
:
msg
[
header
]
=
value
to_addrs
=
()
for
key
in
(
'mto'
,
'mcc'
,
'mbcc'
):
v
=
values
.
get
(
key
)
if
v
:
if
isinstance
(
v
,
basestring
):
v
=
[
rfc822
.
dump_address_pair
(
addr
)
for
addr
\
in
rfc822
.
AddressList
(
v
)]
to_addrs
+=
tuple
(
v
)
self
.
_send
(
values
[
'mfrom'
],
to_addrs
,
msg
)
security
.
declareProtected
(
'View'
,
'__call__'
)
__call__
=
send
security
.
declareProtected
(
'View'
,
'as_message'
)
def
as_message
(
self
,
**
kw
):
msg
,
values
,
headers
=
self
.
_process
(
kw
)
multipart_kw
=
{}
#subtype = kw.get('subtype')
#if subtype:
# multipart_kw['_subtype'] = subtype
#boundary = kw.get('boundary')
#if boundary:
# multipart_kw['boundary'] = boundary
multipart
=
MTMultipart
(
self
,
values
[
'mfrom'
],
values
[
'mto'
],
**
multipart_kw
)
# set the encoding for the container
#multipart.set_charset(msg.get_charset())
for
header
,
value
in
headers
:
multipart
[
header
]
=
value
multipart
.
attach
(
msg
)
return
multipart
InitializeClass
(
BaseMailTemplate
)
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
import
rfc822
from
AccessControl
import
ClassSecurityInfo
from
DateTime
import
DateTime
from
email.MIMEMultipart
import
MIMEMultipart
from
email.MIMEText
import
MIMEText
from
App.class_init
import
default__class_init__
as
InitializeClass
from
App.Common
import
package_home
from
MTMultipart
import
MTMultipart
from
Products.PageTemplates.ZopePageTemplate
import
ZopePageTemplate
from
Products.PageTemplates.PageTemplateFile
import
PageTemplateFile
from
ZPublisher
import
HTTPResponse
# Configured using zope.conf in Zope 2.7.8, Zope 2.8.2, and above
default_encoding
=
getattr
(
HTTPResponse
,
'default_encoding'
,
'iso-8859-15'
)
class
BaseMailTemplate
:
security
=
ClassSecurityInfo
()
_properties
=
()
ZScriptHTML_tryForm
=
None
content_type
=
'text/plain'
mailhost
=
None
security
.
declarePrivate
(
'_process'
)
def
_process
(
self
,
kw
):
# sort out what encoding we're going to use
encoding
=
kw
.
get
(
'encoding'
,
self
.
getProperty
(
'encoding'
,
default_encoding
))
text
=
self
.
__class__
.
__bases__
[
1
].
__call__
(
self
,
**
kw
)
if
not
self
.
html
():
text
=
text
.
encode
(
encoding
,
'replace'
)
# now turn the result into a MIMEText object
msg
=
MIMEText
(
text
.
replace
(
'
\
r
'
,
''
),
self
.
content_type
.
split
(
'/'
)[
1
],
encoding
)
# sort out what headers and addresses we're going to use
headers
=
{}
values
=
{}
# headers from the headers property
for
header
in
getattr
(
self
,
'headers'
,()):
name
,
value
=
header
.
split
(
':'
,
1
)
headers
[
name
]
=
value
# headers from the headers parameter
headers_param
=
kw
.
get
(
'headers'
,{})
headers
.
update
(
headers_param
)
# values and some specific headers
for
key
,
header
in
((
'mfrom'
,
'From'
),
(
'mto'
,
'To'
),
(
'mcc'
,
'Cc'
),
(
'mbcc'
,
'Bcc'
),
(
'subject'
,
'Subject'
)):
value
=
kw
.
get
(
key
,
headers_param
.
get
(
header
,
getattr
(
self
,
key
,
headers
.
get
(
header
))))
if
value
is
not
None
:
values
[
key
]
=
value
# turn some sequences in coma-seperated strings
if
isinstance
(
value
,
tuple
)
or
isinstance
(
value
,
list
):
value
=
', '
.
join
(
value
)
# make sure we have no unicode headers
if
isinstance
(
value
,
unicode
):
value
=
value
.
encode
(
encoding
)
headers
[
header
]
=
value
# check required values have been supplied
errors
=
[]
for
param
in
(
'mfrom'
,
'mto'
,
'subject'
):
if
not
values
.
get
(
param
):
errors
.
append
(
param
)
if
errors
:
raise
TypeError
(
'The following parameters were required by not specified: '
+
(
', '
.
join
(
errors
)
))
# add date header
headers
[
'Date'
]
=
DateTime
().
rfc822
()
# turn headers into an ordered list for predictable header order
keys
=
headers
.
keys
()
keys
.
sort
()
return
msg
,
values
,[(
key
,
headers
[
key
])
for
key
in
keys
]
security
.
declarePrivate
(
'_send'
)
def
_send
(
self
,
mfrom
,
mto
,
msg
):
mailhost
=
self
.
restrictedTraverse
(
self
.
mailhost
,
None
)
if
not
getattr
(
mailhost
,
'meta_type'
,
None
)
in
(
'Mail Host'
,
'Maildrop Host'
):
raise
RuntimeError
(
'Could not traverse to MailHost %r'
%
self
.
mailhost
)
mailhost
.
_send
(
mfrom
,
mto
,
msg
.
as_string
())
security
.
declareProtected
(
'View'
,
'send'
)
def
send
(
self
,
**
kw
):
msg
,
values
,
headers
=
self
.
_process
(
kw
)
for
header
,
value
in
headers
:
msg
[
header
]
=
value
to_addrs
=
()
for
key
in
(
'mto'
,
'mcc'
,
'mbcc'
):
v
=
values
.
get
(
key
)
if
v
:
if
isinstance
(
v
,
basestring
):
v
=
[
rfc822
.
dump_address_pair
(
addr
)
for
addr
\
in
rfc822
.
AddressList
(
v
)]
to_addrs
+=
tuple
(
v
)
self
.
_send
(
values
[
'mfrom'
],
to_addrs
,
msg
)
security
.
declareProtected
(
'View'
,
'__call__'
)
__call__
=
send
security
.
declareProtected
(
'View'
,
'as_message'
)
def
as_message
(
self
,
**
kw
):
msg
,
values
,
headers
=
self
.
_process
(
kw
)
multipart_kw
=
{}
#subtype = kw.get('subtype')
#if subtype:
# multipart_kw['_subtype'] = subtype
#boundary = kw.get('boundary')
#if boundary:
# multipart_kw['boundary'] = boundary
multipart
=
MTMultipart
(
self
,
values
[
'mfrom'
],
values
[
'mto'
],
**
multipart_kw
)
# set the encoding for the container
#multipart.set_charset(msg.get_charset())
for
header
,
value
in
headers
:
multipart
[
header
]
=
value
multipart
.
attach
(
msg
)
return
multipart
InitializeClass
(
BaseMailTemplate
)
product/MailTemplates/FSMailTemplate.py
View file @
015af31a
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
getSecurityManager
from
App.class_init
import
default__class_init__
as
InitializeClass
from
Products.CMFCore.FSPageTemplate
import
FSPageTemplate
from
Products.CMFCore.DirectoryView
import
registerFileExtension
from
Products.CMFCore.DirectoryView
import
registerMetaType
from
BaseMailTemplate
import
BaseMailTemplate
from
MailTemplate
import
MailTemplate
class
FSMailTemplate
(
BaseMailTemplate
,
FSPageTemplate
):
"Wrapper for Mail Template"
security
=
ClassSecurityInfo
()
meta_type
=
'Filesystem Mail Template'
def
__init__
(
self
,
id
,
filepath
,
fullname
=
None
,
properties
=
None
):
FSPageTemplate
.
__init__
(
self
,
id
,
filepath
,
fullname
,
properties
)
self
.
_properties
=
properties
security
.
declarePrivate
(
'_createZODBClone'
)
def
_createZODBClone
(
self
):
"""Create a ZODB (editable) equivalent of this object."""
obj
=
MailTemplate
(
self
.
getId
(),
self
.
_text
,
self
.
content_type
)
obj
.
expand
=
0
obj
.
write
(
self
.
read
())
obj
.
_setPropValue
(
'mailhost'
,
self
.
mailhost
)
obj
.
content_type
=
self
.
content_type
if
self
.
_properties
:
keys
=
self
.
_properties
.
keys
()
keys
.
sort
()
for
id
in
keys
:
if
id
not
in
(
'mailhost'
,
'content_type'
):
obj
.
manage_addProperty
(
id
,
self
.
_properties
[
id
],
'string'
)
return
obj
security
.
declarePrivate
(
'_readFile'
)
def
_readFile
(
self
,
reparse
):
fp
=
self
.
_filepath
file
=
open
(
fp
,
'r'
)
# not 'rb', as this is a text file!
try
:
data
=
file
.
read
()
finally
:
file
.
close
()
if
reparse
:
self
.
write
(
data
)
def
_exec
(
self
,
bound_names
,
args
,
kw
):
"""Call a FSPageTemplate"""
try
:
response
=
self
.
REQUEST
.
RESPONSE
except
AttributeError
:
response
=
None
# Read file first to get a correct content_type default value.
self
.
_updateFromFS
()
if
not
kw
.
has_key
(
'args'
):
kw
[
'args'
]
=
args
bound_names
[
'options'
]
=
kw
security
=
getSecurityManager
()
bound_names
[
'user'
]
=
security
.
getUser
().
getIdOrUserName
()
# Retrieve the value from the cache.
keyset
=
None
if
self
.
ZCacheable_isCachingEnabled
():
# Prepare a cache key.
keyset
=
{
# Why oh why?
# All this code is cut and paste
# here to make sure that we
# dont call _getContext and hence can't cache
# Annoying huh?
'here'
:
self
.
aq_parent
.
getPhysicalPath
(),
'bound_names'
:
bound_names
}
result
=
self
.
ZCacheable_get
(
keywords
=
keyset
)
if
result
is
not
None
:
# Got a cached value.
return
result
# Execute the template in a new security context.
security
.
addContext
(
self
)
try
:
result
=
self
.
pt_render
(
extra_context
=
bound_names
)
if
keyset
is
not
None
:
# Store the result in the cache.
self
.
ZCacheable_set
(
result
,
keywords
=
keyset
)
return
result
finally
:
security
.
removeContext
(
self
)
return
result
InitializeClass
(
FSMailTemplate
)
registerFileExtension
(
'mt'
,
FSMailTemplate
)
registerMetaType
(
'Mail Template'
,
FSMailTemplate
)
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
getSecurityManager
from
App.class_init
import
default__class_init__
as
InitializeClass
from
Products.CMFCore.FSPageTemplate
import
FSPageTemplate
from
Products.CMFCore.DirectoryView
import
registerFileExtension
from
Products.CMFCore.DirectoryView
import
registerMetaType
from
BaseMailTemplate
import
BaseMailTemplate
from
MailTemplate
import
MailTemplate
class
FSMailTemplate
(
BaseMailTemplate
,
FSPageTemplate
):
"Wrapper for Mail Template"
security
=
ClassSecurityInfo
()
meta_type
=
'Filesystem Mail Template'
def
__init__
(
self
,
id
,
filepath
,
fullname
=
None
,
properties
=
None
):
FSPageTemplate
.
__init__
(
self
,
id
,
filepath
,
fullname
,
properties
)
self
.
_properties
=
properties
security
.
declarePrivate
(
'_createZODBClone'
)
def
_createZODBClone
(
self
):
"""Create a ZODB (editable) equivalent of this object."""
obj
=
MailTemplate
(
self
.
getId
(),
self
.
_text
,
self
.
content_type
)
obj
.
expand
=
0
obj
.
write
(
self
.
read
())
obj
.
_setPropValue
(
'mailhost'
,
self
.
mailhost
)
obj
.
content_type
=
self
.
content_type
if
self
.
_properties
:
keys
=
self
.
_properties
.
keys
()
keys
.
sort
()
for
id
in
keys
:
if
id
not
in
(
'mailhost'
,
'content_type'
):
obj
.
manage_addProperty
(
id
,
self
.
_properties
[
id
],
'string'
)
return
obj
security
.
declarePrivate
(
'_readFile'
)
def
_readFile
(
self
,
reparse
):
fp
=
self
.
_filepath
file
=
open
(
fp
,
'r'
)
# not 'rb', as this is a text file!
try
:
data
=
file
.
read
()
finally
:
file
.
close
()
if
reparse
:
self
.
write
(
data
)
def
_exec
(
self
,
bound_names
,
args
,
kw
):
"""Call a FSPageTemplate"""
try
:
response
=
self
.
REQUEST
.
RESPONSE
except
AttributeError
:
response
=
None
# Read file first to get a correct content_type default value.
self
.
_updateFromFS
()
if
not
kw
.
has_key
(
'args'
):
kw
[
'args'
]
=
args
bound_names
[
'options'
]
=
kw
security
=
getSecurityManager
()
bound_names
[
'user'
]
=
security
.
getUser
().
getIdOrUserName
()
# Retrieve the value from the cache.
keyset
=
None
if
self
.
ZCacheable_isCachingEnabled
():
# Prepare a cache key.
keyset
=
{
# Why oh why?
# All this code is cut and paste
# here to make sure that we
# dont call _getContext and hence can't cache
# Annoying huh?
'here'
:
self
.
aq_parent
.
getPhysicalPath
(),
'bound_names'
:
bound_names
}
result
=
self
.
ZCacheable_get
(
keywords
=
keyset
)
if
result
is
not
None
:
# Got a cached value.
return
result
# Execute the template in a new security context.
security
.
addContext
(
self
)
try
:
result
=
self
.
pt_render
(
extra_context
=
bound_names
)
if
keyset
is
not
None
:
# Store the result in the cache.
self
.
ZCacheable_set
(
result
,
keywords
=
keyset
)
return
result
finally
:
security
.
removeContext
(
self
)
return
result
InitializeClass
(
FSMailTemplate
)
registerFileExtension
(
'mt'
,
FSMailTemplate
)
registerMetaType
(
'Mail Template'
,
FSMailTemplate
)
product/MailTemplates/MailTemplate.py
View file @
015af31a
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
getSecurityManager
from
App.class_init
import
default__class_init__
as
InitializeClass
from
App.Common
import
package_home
from
Products.PageTemplates.ZopePageTemplate
import
ZopePageTemplate
from
Products.PageTemplates.PageTemplate
import
PageTemplate
from
Products.PageTemplates.PageTemplateFile
import
PageTemplateFile
from
BaseMailTemplate
import
BaseMailTemplate
class
MailTemplate
(
BaseMailTemplate
,
ZopePageTemplate
):
"A ZPT-like template for sending mails"
security
=
ClassSecurityInfo
()
meta_type
=
'Mail Template'
_properties
=
()
manage_options
=
ZopePageTemplate
.
manage_options
[
0
:
1
]
+
\
ZopePageTemplate
.
manage_options
[
2
:]
_default_content_fn
=
os
.
path
.
join
(
package_home
(
globals
()),
'www'
,
'default.txt'
)
security
.
declareProtected
(
'View management screens'
,
'pt_editForm'
)
pt_editForm
=
PageTemplateFile
(
'www/mtEdit'
,
globals
(),
__name__
=
'pt_editForm'
)
manage
=
manage_main
=
pt_editForm
security
.
declareProtected
(
'Change Page Templates'
,
'pt_editAction'
)
def
pt_editAction
(
self
,
REQUEST
,
mailhost
,
text
,
content_type
,
expand
):
"""Change the mailhost and document."""
if
self
.
wl_isLocked
():
raise
ResourceLockedError
,
"File is locked via WebDAV"
self
.
expand
=
expand
self
.
_setPropValue
(
'mailhost'
,
mailhost
)
self
.
pt_edit
(
text
,
content_type
)
REQUEST
.
set
(
'text'
,
self
.
read
())
# May not equal 'text'!
message
=
"Saved changes."
if
getattr
(
self
,
'_v_warnings'
,
None
):
message
=
(
"<strong>Warning:</strong> <i>%s</i>"
%
'<br>'
.
join
(
self
.
_v_warnings
))
return
self
.
pt_editForm
(
manage_tabs_message
=
message
)
def
om_icons
(
self
):
"""Return a list of icon URLs to be displayed by an ObjectManager"""
icons
=
({
'path'
:
'misc_/MailTemplates/mt.gif'
,
'alt'
:
self
.
meta_type
,
'title'
:
self
.
meta_type
},)
if
not
self
.
_v_cooked
:
self
.
_cook
()
if
self
.
_v_errors
:
icons
=
icons
+
({
'path'
:
'misc_/PageTemplates/exclamation.gif'
,
'alt'
:
'Error'
,
'title'
:
'This template has an error'
},)
return
icons
def
_exec
(
self
,
bound_names
,
args
,
kw
):
"""Call a Page Template"""
if
not
kw
.
has_key
(
'args'
):
kw
[
'args'
]
=
args
bound_names
[
'options'
]
=
kw
security
=
getSecurityManager
()
bound_names
[
'user'
]
=
security
.
getUser
().
getIdOrUserName
()
# Retrieve the value from the cache.
keyset
=
None
if
self
.
ZCacheable_isCachingEnabled
():
# Prepare a cache key.
keyset
=
{
'here'
:
self
.
_getContext
(),
'bound_names'
:
bound_names
}
result
=
self
.
ZCacheable_get
(
keywords
=
keyset
)
if
result
is
not
None
:
# Got a cached value.
return
result
# Execute the template in a new security context.
security
.
addContext
(
self
)
try
:
result
=
self
.
pt_render
(
extra_context
=
bound_names
)
if
keyset
is
not
None
:
# Store the result in the cache.
self
.
ZCacheable_set
(
result
,
keywords
=
keyset
)
return
result
finally
:
security
.
removeContext
(
self
)
def
pt_render
(
self
,
source
=
False
,
extra_context
=
{}):
# Override to support empty strings
result
=
PageTemplate
.
pt_render
(
self
,
source
,
extra_context
)
or
u''
assert
isinstance
(
result
,
unicode
)
return
result
InitializeClass
(
MailTemplate
)
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
getSecurityManager
from
App.class_init
import
default__class_init__
as
InitializeClass
from
App.Common
import
package_home
from
Products.PageTemplates.ZopePageTemplate
import
ZopePageTemplate
from
Products.PageTemplates.PageTemplate
import
PageTemplate
from
Products.PageTemplates.PageTemplateFile
import
PageTemplateFile
from
BaseMailTemplate
import
BaseMailTemplate
class
MailTemplate
(
BaseMailTemplate
,
ZopePageTemplate
):
"A ZPT-like template for sending mails"
security
=
ClassSecurityInfo
()
meta_type
=
'Mail Template'
_properties
=
()
manage_options
=
ZopePageTemplate
.
manage_options
[
0
:
1
]
+
\
ZopePageTemplate
.
manage_options
[
2
:]
_default_content_fn
=
os
.
path
.
join
(
package_home
(
globals
()),
'www'
,
'default.txt'
)
security
.
declareProtected
(
'View management screens'
,
'pt_editForm'
)
pt_editForm
=
PageTemplateFile
(
'www/mtEdit'
,
globals
(),
__name__
=
'pt_editForm'
)
manage
=
manage_main
=
pt_editForm
security
.
declareProtected
(
'Change Page Templates'
,
'pt_editAction'
)
def
pt_editAction
(
self
,
REQUEST
,
mailhost
,
text
,
content_type
,
expand
):
"""Change the mailhost and document."""
if
self
.
wl_isLocked
():
raise
ResourceLockedError
,
"File is locked via WebDAV"
self
.
expand
=
expand
self
.
_setPropValue
(
'mailhost'
,
mailhost
)
self
.
pt_edit
(
text
,
content_type
)
REQUEST
.
set
(
'text'
,
self
.
read
())
# May not equal 'text'!
message
=
"Saved changes."
if
getattr
(
self
,
'_v_warnings'
,
None
):
message
=
(
"<strong>Warning:</strong> <i>%s</i>"
%
'<br>'
.
join
(
self
.
_v_warnings
))
return
self
.
pt_editForm
(
manage_tabs_message
=
message
)
def
om_icons
(
self
):
"""Return a list of icon URLs to be displayed by an ObjectManager"""
icons
=
({
'path'
:
'misc_/MailTemplates/mt.gif'
,
'alt'
:
self
.
meta_type
,
'title'
:
self
.
meta_type
},)
if
not
self
.
_v_cooked
:
self
.
_cook
()
if
self
.
_v_errors
:
icons
=
icons
+
({
'path'
:
'misc_/PageTemplates/exclamation.gif'
,
'alt'
:
'Error'
,
'title'
:
'This template has an error'
},)
return
icons
def
_exec
(
self
,
bound_names
,
args
,
kw
):
"""Call a Page Template"""
if
not
kw
.
has_key
(
'args'
):
kw
[
'args'
]
=
args
bound_names
[
'options'
]
=
kw
security
=
getSecurityManager
()
bound_names
[
'user'
]
=
security
.
getUser
().
getIdOrUserName
()
# Retrieve the value from the cache.
keyset
=
None
if
self
.
ZCacheable_isCachingEnabled
():
# Prepare a cache key.
keyset
=
{
'here'
:
self
.
_getContext
(),
'bound_names'
:
bound_names
}
result
=
self
.
ZCacheable_get
(
keywords
=
keyset
)
if
result
is
not
None
:
# Got a cached value.
return
result
# Execute the template in a new security context.
security
.
addContext
(
self
)
try
:
result
=
self
.
pt_render
(
extra_context
=
bound_names
)
if
keyset
is
not
None
:
# Store the result in the cache.
self
.
ZCacheable_set
(
result
,
keywords
=
keyset
)
return
result
finally
:
security
.
removeContext
(
self
)
def
pt_render
(
self
,
source
=
False
,
extra_context
=
{}):
# Override to support empty strings
result
=
PageTemplate
.
pt_render
(
self
,
source
,
extra_context
)
or
u''
assert
isinstance
(
result
,
unicode
)
return
result
InitializeClass
(
MailTemplate
)
product/MailTemplates/__init__.py
View file @
015af31a
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
from
AccessControl
import
allow_module
,
allow_class
from
Products.PageTemplates.PageTemplateFile
import
PageTemplateFile
from
MailTemplate
import
MailTemplate
from
types
import
ClassType
from
urllib
import
quote
try
:
import
Products.CMFCore
except
ImportError
:
pass
else
:
import
FSMailTemplate
import
Products.CMFCore.utils
Products
.
CMFCore
.
utils
.
registerIcon
(
FSMailTemplate
.
FSMailTemplate
,
'www/fsmt.gif'
,
globals
())
def
initialize
(
context
):
context
.
registerClass
(
MailTemplate
,
# we use the same permission as page templates
# in order to keep things simple.
permission
=
'Add Page Templates'
,
constructors
=
(
addMailTemplateForm
,
addMailTemplate
),
icon
=
'www/mt.gif'
,
)
addMailTemplateForm
=
PageTemplateFile
(
'www/mtAdd'
,
globals
(),
__name__
=
'addMailTemplateForm'
)
def
addMailTemplate
(
self
,
id
,
mailhost
=
None
,
text
=
None
,
REQUEST
=
None
,
submit
=
None
):
"Add a Mail Template with optional file content."
id
=
str
(
id
)
if
REQUEST
is
None
:
self
.
_setObject
(
id
,
MailTemplate
(
id
,
text
))
ob
=
getattr
(
self
,
id
)
if
mailhost
:
ob
.
_setPropValue
(
'mailhost'
,
mailhost
)
return
ob
else
:
file
=
REQUEST
.
form
.
get
(
'file'
)
headers
=
getattr
(
file
,
'headers'
,
None
)
if
headers
is
None
or
not
file
.
filename
:
mt
=
MailTemplate
(
id
,
text
)
else
:
mt
=
MailTemplate
(
id
,
file
,
headers
.
get
(
'content_type'
))
self
.
_setObject
(
id
,
mt
)
ob
=
getattr
(
self
,
id
)
if
mailhost
:
ob
.
_setPropValue
(
'mailhost'
,
mailhost
)
if
submit
==
" Add and Edit "
:
u
=
ob
.
absolute_url
()
else
:
u
=
ob
.
aq_parent
.
absolute_url
()
REQUEST
.
RESPONSE
.
redirect
(
u
+
'/manage_main'
)
# allow all the email module's public bits
import
email
for
name
in
email
.
__all__
:
path
=
'email.'
+
name
allow_module
(
path
)
try
:
mod
=
__import__
(
path
)
except
ImportError
:
pass
else
:
mod
=
getattr
(
mod
,
name
)
for
mod_name
in
dir
(
mod
):
obj
=
getattr
(
mod
,
mod_name
)
if
isinstance
(
obj
,
ClassType
):
allow_class
(
obj
)
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
from
AccessControl
import
allow_module
,
allow_class
from
Products.PageTemplates.PageTemplateFile
import
PageTemplateFile
from
MailTemplate
import
MailTemplate
from
types
import
ClassType
from
urllib
import
quote
try
:
import
Products.CMFCore
except
ImportError
:
pass
else
:
import
FSMailTemplate
import
Products.CMFCore.utils
Products
.
CMFCore
.
utils
.
registerIcon
(
FSMailTemplate
.
FSMailTemplate
,
'www/fsmt.gif'
,
globals
())
def
initialize
(
context
):
context
.
registerClass
(
MailTemplate
,
# we use the same permission as page templates
# in order to keep things simple.
permission
=
'Add Page Templates'
,
constructors
=
(
addMailTemplateForm
,
addMailTemplate
),
icon
=
'www/mt.gif'
,
)
addMailTemplateForm
=
PageTemplateFile
(
'www/mtAdd'
,
globals
(),
__name__
=
'addMailTemplateForm'
)
def
addMailTemplate
(
self
,
id
,
mailhost
=
None
,
text
=
None
,
REQUEST
=
None
,
submit
=
None
):
"Add a Mail Template with optional file content."
id
=
str
(
id
)
if
REQUEST
is
None
:
self
.
_setObject
(
id
,
MailTemplate
(
id
,
text
))
ob
=
getattr
(
self
,
id
)
if
mailhost
:
ob
.
_setPropValue
(
'mailhost'
,
mailhost
)
return
ob
else
:
file
=
REQUEST
.
form
.
get
(
'file'
)
headers
=
getattr
(
file
,
'headers'
,
None
)
if
headers
is
None
or
not
file
.
filename
:
mt
=
MailTemplate
(
id
,
text
)
else
:
mt
=
MailTemplate
(
id
,
file
,
headers
.
get
(
'content_type'
))
self
.
_setObject
(
id
,
mt
)
ob
=
getattr
(
self
,
id
)
if
mailhost
:
ob
.
_setPropValue
(
'mailhost'
,
mailhost
)
if
submit
==
" Add and Edit "
:
u
=
ob
.
absolute_url
()
else
:
u
=
ob
.
aq_parent
.
absolute_url
()
REQUEST
.
RESPONSE
.
redirect
(
u
+
'/manage_main'
)
# allow all the email module's public bits
import
email
for
name
in
email
.
__all__
:
path
=
'email.'
+
name
allow_module
(
path
)
try
:
mod
=
__import__
(
path
)
except
ImportError
:
pass
else
:
mod
=
getattr
(
mod
,
name
)
for
mod_name
in
dir
(
mod
):
obj
=
getattr
(
mod
,
mod_name
)
if
isinstance
(
obj
,
ClassType
):
allow_class
(
obj
)
product/MailTemplates/tests/__init__.py
View file @
015af31a
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
product/MailTemplates/tests/example1.mt
View file @
015af31a
<tal:body xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
>Dear <tal:x replace="options/mto"/>,
<tal:x replace="user/getId"/> would like to thank you for
your interest in:
<tal:x replace="root/absolute_url"/>
<tal:x replace="options/message"/>
cheers,
The Web Team
</tal:body>
<tal:body xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
>Dear <tal:x replace="options/mto"/>,
<tal:x replace="user/getId"/> would like to thank you for
your interest in:
<tal:x replace="root/absolute_url"/>
<tal:x replace="options/message"/>
cheers,
The Web Team
</tal:body>
product/MailTemplates/tests/example3.mt
View file @
015af31a
<tal:body xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
>Dear <tal:x replace="options/mto"/>,
Please find attached the file you requested.
cheers,
The Web Team
</tal:body>
<tal:body xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
>Dear <tal:x replace="options/mto"/>,
Please find attached the file you requested.
cheers,
The Web Team
</tal:body>
product/MailTemplates/tests/example4.mt
View file @
015af31a
<tal:body xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
>Dear <tal:x replace="options/mto"/>,
Welcome to our site!
cheers,
The Web Team
</tal:body>
<tal:body xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
>Dear <tal:x replace="options/mto"/>,
Welcome to our site!
cheers,
The Web Team
</tal:body>
product/MailTemplates/tests/test_FSMailTemplate.py
View file @
015af31a
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
from
AccessControl.SecurityManagement
import
newSecurityManager
from
AccessControl.SecurityManagement
import
noSecurityManager
from
AccessControl.User
import
system
as
SystemUser
,
SimpleUser
from
OFS.Folder
import
Folder
from
test_MailTemplate
import
DummyMailHost
,
Zope
,
get_transaction
from
Testing.makerequest
import
makerequest
from
unittest
import
TestCase
,
TestSuite
,
makeSuite
,
main
try
:
import
Products.CMFCore
except
ImportError
:
# no CMF, no use ;-)
class
TestFSMailTemplate
(
TestCase
):
pass
else
:
from
Products.CMFCore.DirectoryView
import
addDirectoryViews
from
Products.CMFCore.tests.base.testcase
import
FSDVTest
from
AccessControl
import
ClassSecurityInfo
from
App.class_init
import
default__class_init__
as
InitializeClass
class
DummyMember
:
security
=
ClassSecurityInfo
()
security
.
declareObjectPublic
()
security
.
setDefaultAccess
(
'allow'
)
security
.
declarePublic
(
'getUserName'
)
def
getUserName
(
self
):
return
'Test Member'
security
.
declarePublic
(
'getProperty'
)
def
getProperty
(
self
,
name
):
return
'member@example.com'
InitializeClass
(
DummyMember
)
class
DummyMembershipTool
:
security
=
ClassSecurityInfo
()
security
.
declareObjectPublic
()
security
.
setDefaultAccess
(
'allow'
)
security
.
declarePublic
(
'listMembers'
)
def
listMembers
(
self
):
return
(
DummyMember
(),)
InitializeClass
(
DummyMembershipTool
)
class
TestFSMailTemplate
(
FSDVTest
):
_sourceprefix
=
os
.
path
.
dirname
(
__file__
)
def
setUp
(
self
):
FSDVTest
.
setUp
(
self
)
self
.
app
=
makerequest
(
Zope
.
app
())
self
.
_registerDirectory
()
ob
=
self
.
ob
=
self
.
app
addDirectoryViews
(
ob
,
self
.
_skinname
,
self
.
tempname
)
self
.
r
=
self
.
app
.
REQUEST
self
.
r
.
other
[
'URL1'
]
=
'http://foo/test_mt'
self
.
_add
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
self
.
folder
=
Folder
(
'folder'
)
if
getattr
(
self
.
app
,
'test_mt'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'test_mt'
])
if
getattr
(
self
.
app
,
'MailHost'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
self
.
MailHost
=
self
.
app
.
MailHost
=
DummyMailHost
()
newSecurityManager
(
None
,
SystemUser
)
def
tearDown
(
self
):
noSecurityManager
()
get_transaction
().
abort
()
self
.
app
.
_p_jar
.
close
()
try
:
FSDVTest
.
tearDown
(
self
)
except
OSError
:
# waggh, on windows, files in .svn get locked for some reason :-(
pass
def
test_render
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
filename
=
'mail_FSSendSimple.txt'
)
self
.
ob
.
fake_skin
.
test
.
send
(
subject
=
self
.
ob
.
fake_skin
.
test
.
subject
%
'out'
,
mcc
=
(
'cc@example.com'
,),
mbcc
=
(
'bcc@example.com'
,),
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
})
self
.
MailHost
.
checkSent
()
# check we're not setting a content type
self
.
assertFalse
(
self
.
r
.
RESPONSE
.
headers
.
get
(
'content-type'
),
self
.
r
.
RESPONSE
.
headers
)
def
test_properties
(
self
):
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
subject
,
'Hello %s there'
)
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
mfrom
,
'from@example.com'
)
def
test_zodbclone
(
self
):
from
Products.MailTemplates.MailTemplate
import
MailTemplate
clone
=
self
.
ob
.
fake_skin
.
test
.
_createZODBClone
()
self
.
assertTrue
(
isinstance
(
clone
,
MailTemplate
),
'Clone not a MailTemplate!'
)
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
read
(),
clone
.
read
())
self
.
assertEqual
(
clone
.
getProperty
(
'mailhost'
),
None
)
self
.
assertEqual
(
clone
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
clone
.
getProperty
(
'subject'
),
'Hello %s there'
)
self
.
assertEqual
(
clone
.
getProperty
(
'mfrom'
),
'from@example.com'
)
self
.
assertEqual
(
clone
.
content_type
,
'text/notplain'
)
def
test_view_manage_workspace
(
self
):
from
zExceptions
import
Redirect
try
:
self
.
assertRaises
(
self
.
ob
.
fake_skin
.
test
.
manage_workspace
(
self
.
r
))
except
Redirect
,
r
:
# this may appear to be incorrect, but http://foo/test_mt
# is what we set as REQUEST['URL1']
self
.
assertEqual
(
r
.
args
,(
'http://foo/test_mt/manage_main'
,))
self
.
ob
.
fake_skin
.
test
.
manage_main
()
# ugh, okay, so we can't really test for security, but lets
# test for the missing docstring that was causing problems!
self
.
assertTrue
(
self
.
ob
.
fake_skin
.
test
.
__doc__
)
def
test_example2
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
app
.
portal_membership
=
DummyMembershipTool
()
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'webmaster@example.com'
,
mto
=
'member@example.com'
,
filename
=
'example2.txt'
)
# test
self
.
ob
.
fake_skin
.
send_mails
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_suite
():
return
TestSuite
((
makeSuite
(
TestFSMailTemplate
),
))
if
__name__
==
'__main__'
:
main
(
defaultTest
=
'test_suite'
)
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
from
AccessControl.SecurityManagement
import
newSecurityManager
from
AccessControl.SecurityManagement
import
noSecurityManager
from
AccessControl.User
import
system
as
SystemUser
,
SimpleUser
from
OFS.Folder
import
Folder
from
test_MailTemplate
import
DummyMailHost
,
Zope
,
get_transaction
from
Testing.makerequest
import
makerequest
from
unittest
import
TestCase
,
TestSuite
,
makeSuite
,
main
try
:
import
Products.CMFCore
except
ImportError
:
# no CMF, no use ;-)
class
TestFSMailTemplate
(
TestCase
):
pass
else
:
from
Products.CMFCore.DirectoryView
import
addDirectoryViews
from
Products.CMFCore.tests.base.testcase
import
FSDVTest
from
AccessControl
import
ClassSecurityInfo
from
App.class_init
import
default__class_init__
as
InitializeClass
class
DummyMember
:
security
=
ClassSecurityInfo
()
security
.
declareObjectPublic
()
security
.
setDefaultAccess
(
'allow'
)
security
.
declarePublic
(
'getUserName'
)
def
getUserName
(
self
):
return
'Test Member'
security
.
declarePublic
(
'getProperty'
)
def
getProperty
(
self
,
name
):
return
'member@example.com'
InitializeClass
(
DummyMember
)
class
DummyMembershipTool
:
security
=
ClassSecurityInfo
()
security
.
declareObjectPublic
()
security
.
setDefaultAccess
(
'allow'
)
security
.
declarePublic
(
'listMembers'
)
def
listMembers
(
self
):
return
(
DummyMember
(),)
InitializeClass
(
DummyMembershipTool
)
class
TestFSMailTemplate
(
FSDVTest
):
_sourceprefix
=
os
.
path
.
dirname
(
__file__
)
def
setUp
(
self
):
FSDVTest
.
setUp
(
self
)
self
.
app
=
makerequest
(
Zope
.
app
())
self
.
_registerDirectory
()
ob
=
self
.
ob
=
self
.
app
addDirectoryViews
(
ob
,
self
.
_skinname
,
self
.
tempname
)
self
.
r
=
self
.
app
.
REQUEST
self
.
r
.
other
[
'URL1'
]
=
'http://foo/test_mt'
self
.
_add
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
self
.
folder
=
Folder
(
'folder'
)
if
getattr
(
self
.
app
,
'test_mt'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'test_mt'
])
if
getattr
(
self
.
app
,
'MailHost'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
self
.
MailHost
=
self
.
app
.
MailHost
=
DummyMailHost
()
newSecurityManager
(
None
,
SystemUser
)
def
tearDown
(
self
):
noSecurityManager
()
get_transaction
().
abort
()
self
.
app
.
_p_jar
.
close
()
try
:
FSDVTest
.
tearDown
(
self
)
except
OSError
:
# waggh, on windows, files in .svn get locked for some reason :-(
pass
def
test_render
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
filename
=
'mail_FSSendSimple.txt'
)
self
.
ob
.
fake_skin
.
test
.
send
(
subject
=
self
.
ob
.
fake_skin
.
test
.
subject
%
'out'
,
mcc
=
(
'cc@example.com'
,),
mbcc
=
(
'bcc@example.com'
,),
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
})
self
.
MailHost
.
checkSent
()
# check we're not setting a content type
self
.
assertFalse
(
self
.
r
.
RESPONSE
.
headers
.
get
(
'content-type'
),
self
.
r
.
RESPONSE
.
headers
)
def
test_properties
(
self
):
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
subject
,
'Hello %s there'
)
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
mfrom
,
'from@example.com'
)
def
test_zodbclone
(
self
):
from
Products.MailTemplates.MailTemplate
import
MailTemplate
clone
=
self
.
ob
.
fake_skin
.
test
.
_createZODBClone
()
self
.
assertTrue
(
isinstance
(
clone
,
MailTemplate
),
'Clone not a MailTemplate!'
)
self
.
assertEqual
(
self
.
ob
.
fake_skin
.
test
.
read
(),
clone
.
read
())
self
.
assertEqual
(
clone
.
getProperty
(
'mailhost'
),
None
)
self
.
assertEqual
(
clone
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
clone
.
getProperty
(
'subject'
),
'Hello %s there'
)
self
.
assertEqual
(
clone
.
getProperty
(
'mfrom'
),
'from@example.com'
)
self
.
assertEqual
(
clone
.
content_type
,
'text/notplain'
)
def
test_view_manage_workspace
(
self
):
from
zExceptions
import
Redirect
try
:
self
.
assertRaises
(
self
.
ob
.
fake_skin
.
test
.
manage_workspace
(
self
.
r
))
except
Redirect
,
r
:
# this may appear to be incorrect, but http://foo/test_mt
# is what we set as REQUEST['URL1']
self
.
assertEqual
(
r
.
args
,(
'http://foo/test_mt/manage_main'
,))
self
.
ob
.
fake_skin
.
test
.
manage_main
()
# ugh, okay, so we can't really test for security, but lets
# test for the missing docstring that was causing problems!
self
.
assertTrue
(
self
.
ob
.
fake_skin
.
test
.
__doc__
)
def
test_example2
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
app
.
portal_membership
=
DummyMembershipTool
()
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'webmaster@example.com'
,
mto
=
'member@example.com'
,
filename
=
'example2.txt'
)
# test
self
.
ob
.
fake_skin
.
send_mails
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_suite
():
return
TestSuite
((
makeSuite
(
TestFSMailTemplate
),
))
if
__name__
==
'__main__'
:
main
(
defaultTest
=
'test_suite'
)
product/MailTemplates/tests/test_MailTemplate.py
View file @
015af31a
# -*- coding: latin-1 -*-
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
try
:
import
Zope2
as
Zope
except
ImportError
:
import
Zope
from
AccessControl.SecurityManagement
import
newSecurityManager
from
AccessControl.SecurityManagement
import
noSecurityManager
from
AccessControl.User
import
system
as
SystemUser
,
SimpleUser
from
cStringIO
import
StringIO
from
difflib
import
unified_diff
from
Products.MailHost.MailHost
import
MailHost
from
Testing.makerequest
import
makerequest
from
unittest
import
TestCase
,
TestSuite
,
makeSuite
,
main
try
:
# Zope 2.8 only
from
transaction
import
get
as
get_transaction
except
ImportError
:
# Zope 2.7 only, allows get_transaction
# to be imported from test_FSMailTemplate.
get_transaction
=
get_transaction
test_folder
=
os
.
path
.
dirname
(
__file__
)
class
DummyFieldStorage
:
def
__init__
(
self
,
filename
,
value
):
self
.
filename
=
filename
self
.
value
=
value
self
.
file
=
StringIO
(
value
)
self
.
content_type
=
None
self
.
headers
=
{}
class
DummyMailHost
(
MailHost
):
sent
=
False
def
setExpected
(
self
,
mfrom
,
mto
,
filename
):
self
.
mfrom
=
mfrom
self
.
mto
=
mto
self
.
messageText
=
open
(
os
.
path
.
join
(
test_folder
,
filename
)
).
read
().
replace
(
'
\
r
'
,
''
)
self
.
filename
=
filename
def
getId
(
self
):
return
'MailHost'
def
title_and_id
(
self
):
return
'MHTID'
def
assertEqual
(
self
,
x
,
y
,
message
=
None
,
field
=
None
):
if
x
!=
y
:
if
message
:
raise
AssertionError
(
message
)
error
=
'%r!=%r'
%
(
x
,
y
)
if
field
:
error
=
field
+
':'
+
error
raise
AssertionError
(
error
)
def
_send
(
self
,
mfrom
,
mto
,
messageText
):
self
.
assertEqual
(
self
.
mfrom
,
mfrom
,
field
=
'mfrom'
)
self
.
assertEqual
(
self
.
mto
,
mto
,
field
=
'mto'
)
expected_data
=
self
.
messageText
.
strip
().
split
(
'
\
n
'
)
actual_data
=
messageText
.
strip
().
split
(
'
\
n
'
)
# ignore dates
for
i
in
range
(
len
(
actual_data
)):
if
actual_data
[
i
].
startswith
(
'Date:'
):
actual_data
[
i
]
=
'Date:'
diff
=
tuple
(
unified_diff
(
expected_data
,
actual_data
,
self
.
filename
,
'Test results'
,
))
if
diff
:
raise
AssertionError
(
'Mail sent was not as expected:
\
n
\
n
'
+
'
\
n
'
.
join
(
diff
)
)
self
.
sent
=
True
def
checkSent
(
self
,
value
=
True
):
if
value
:
error
=
"Mail not sent"
else
:
error
=
"Mail sent when it shouldn't have been"
self
.
assertEqual
(
self
.
sent
,
value
,
error
)
class
DummyMailDropHost
(
DummyMailHost
):
meta_type
=
'Maildrop Host'
class
TestMailTemplate
(
TestCase
):
def
setUp
(
self
):
self
.
app
=
makerequest
(
Zope
.
app
())
self
.
r
=
self
.
app
.
REQUEST
self
.
r
.
other
[
'URL1'
]
=
'http://foo/test_mt'
self
.
_add
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
if
getattr
(
self
.
app
,
'test_mt'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'test_mt'
])
if
getattr
(
self
.
app
,
'MailHost'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
self
.
MailHost
=
self
.
app
.
MailHost
=
DummyMailHost
()
o
=
list
(
self
.
app
.
_objects
)
o
.
append
({
'meta_type'
:
'Mail Host'
,
'id'
:
'MailHost'
})
self
.
app
.
_objects
=
tuple
(
o
)
newSecurityManager
(
None
,
SystemUser
)
def
tearDown
(
self
):
noSecurityManager
()
get_transaction
().
abort
()
self
.
app
.
_p_jar
.
close
()
def
makeFileUpload
(
self
,
filename
=
'test.txt'
,
value
=
'test text'
,
diskname
=
''
):
if
diskname
:
filename
=
diskname
value
=
open
(
os
.
path
.
join
(
test_folder
,
diskname
)
).
read
().
replace
(
'
\
r
'
,
''
).
strip
()
from
ZPublisher.HTTPRequest
import
FileUpload
return
FileUpload
(
DummyFieldStorage
(
filename
,
value
))
def
checkContent
(
self
,
text
=
'test text'
):
if
text
is
None
:
text
=
open
(
os
.
path
.
join
(
test_folder
,
'..'
,
'www'
,
'default.txt'
)).
read
()
self
.
assertEqual
(
self
.
app
.
test_mt
.
document_src
({
'raw'
:
1
}),
text
)
# Test Adding
def
test_addAddForm
(
self
):
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
def
test_addAddFormNoMailHosts
(
self
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
res
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
self
.
assertTrue
(
res
.
find
(
'<option value="MailHost">MHTID</option>'
)
==-
1
)
def
test_addAddFormMailHost
(
self
):
self
.
app
.
_objects
=
({
'meta_type'
:
'Mail Host'
,
'id'
:
'MailHost'
},)
res
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
self
.
assertFalse
(
res
.
find
(
'<option value="MailHost">MHTID</option>'
)
==-
1
)
def
test_addAddFormMailDropHost
(
self
):
if
getattr
(
self
.
app
,
'MailHost'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
self
.
MailHost
=
self
.
app
.
MailHost
=
DummyMailDropHost
()
self
.
app
.
_objects
=
({
'meta_type'
:
'Maildrop Host'
,
'id'
:
'MailHost'
},)
res
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
self
.
assertFalse
(
res
.
find
(
'<option value="MailHost">MHTID</option>'
)
==-
1
)
def
test_addNoREQUEST
(
self
):
self
.
_add
(
'test_mt'
,
'MailHost'
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
(
None
)
def
test_addNoMailHostSelected
(
self
):
self
.
_add
(
'test_mt'
,
REQUEST
=
self
.
r
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
None
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
(
None
)
# check the error we get when we try to send
self
.
assertRaises
(
RuntimeError
,
self
.
app
.
test_mt
,
mfrom
=
'from@example.com'
,
mto
=
'to@example.com'
,
subject
=
'Test Subject'
,
)
# no put a mogus mailhost in and check we get the same error
self
.
app
.
test_mt
.
mailhost
=
'bogus'
self
.
assertRaises
(
RuntimeError
,
self
.
app
.
test_mt
,
mfrom
=
'from@example.com'
,
mto
=
'to@example.com'
,
subject
=
'Test Subject'
,
)
def
test_add
(
self
,
body
=
None
):
text
=
open
(
os
.
path
.
join
(
test_folder
,
'..'
,
'www'
,
'default.txt'
)).
read
()
if
body
is
not
None
:
text
=
text
[:
-
12
]
+
body
+
text
[
-
11
:]
self
.
_add
(
'test_mt'
,
'MailHost'
,
text
=
text
,
REQUEST
=
self
.
r
)
else
:
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
assertEqual
(
self
.
r
.
RESPONSE
.
headers
,
{
'status'
:
'302 Moved Temporarily'
,
'location'
:
'http://foo/manage_main'
}
)
self
.
mt
=
self
.
app
.
test_mt
# check settings
self
.
assertEqual
(
self
.
mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
mt
.
content_type
,
'text/plain'
)
# check default content
self
.
assertEqual
(
self
.
app
.
test_mt
.
read
(),
text
)
# check default content type is text/plain
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
def
test_addFile
(
self
):
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
()
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
()
def
test_addEdit
(
self
):
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
,
submit
=
' Add and Edit '
)
self
.
assertEqual
(
self
.
r
.
RESPONSE
.
headers
,
{
'status'
:
'302 Moved Temporarily'
,
'location'
:
'http://foo/test_mt/manage_main'
}
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
(
None
)
def
test_addEditFile
(
self
):
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
()
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
,
submit
=
' Add and Edit '
)
self
.
assertEqual
(
self
.
r
.
RESPONSE
.
headers
,
{
'status'
:
'302 Moved Temporarily'
,
'location'
:
'http://foo/test_mt/manage_main'
}
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
()
# Test Properties Tab
# Not much here, as we assume PropertyManager does its job ;-)
def
test_PropertiesForm
(
self
):
self
.
test_add
()
self
.
mt
.
manage_propertiesForm
()
def
test_PropertiesStartsEmpty
(
self
):
self
.
test_add
()
self
.
assertFalse
(
self
.
mt
.
propertyMap
())
# Test Test tab, well, actually, make sure it's not there ;-)
def
test_NoTestTab
(
self
):
from
Products.MailTemplates.MailTemplate
import
MailTemplate
for
option
in
MailTemplate
.
manage_options
:
if
option
[
'label'
]
==
'Test'
:
self
.
fail
(
'Test label found'
)
self
.
assertFalse
(
MailTemplate
.
ZScriptHTML_tryForm
,
'try form not None'
)
# Test Editing
def
test_editForm
(
self
):
self
.
test_add
()
self
.
mt
.
pt_editForm
()
def
test_editFormMailHostGone
(
self
):
self
.
test_add
()
self
.
app
.
manage_delObjects
(
'MailHost'
)
r
=
self
.
mt
.
pt_editForm
()
self
.
assertFalse
(
r
.
find
(
"""<option selected="selected" value="MailHost">'MailHost' is no longer valid!</option>"""
)
==-
1
,
'No warning for MailHost being invalid found in:
\
n
'
+
r
)
def
test_editAction
(
self
):
self
.
test_add
()
self
.
mt
.
pt_editAction
(
REQUEST
=
self
.
r
,
mailhost
=
'MH2'
,
text
=
'new text'
,
content_type
=
'text/fish'
,
expand
=
1
)
self
.
assertEqual
(
self
.
mt
.
expand
,
1
)
self
.
assertEqual
(
self
.
mt
.
mailhost
,
'MH2'
)
self
.
assertEqual
(
self
.
mt
.
content_type
,
'text/fish'
)
self
.
checkContent
(
'new text'
)
def
test_view_manage_workspace
(
self
):
self
.
test_add
()
from
zExceptions
import
Redirect
try
:
self
.
assertRaises
(
self
.
mt
.
manage_workspace
(
self
.
r
))
except
Redirect
,
r
:
# this may appear to be incorrect, but http://foo/test_mt
# is what we set as REQUEST['URL1']
self
.
assertEqual
(
r
.
args
,(
'http://foo/test_mt/pt_editForm'
,))
# ugh, okay, so we can't really test for security, but lets
# test for the missing docstring that was causing problems!
self
.
assertTrue
(
self
.
mt
.
__doc__
)
def
test_view_manage_main
(
self
):
self
.
test_add
()
# for some bizare reason the output differs by a newline the first time these are called :-(
self
.
mt
.
manage_main
()
self
.
mt
.
pt_editForm
()
self
.
assertEqual
(
self
.
mt
.
manage_main
(),
self
.
mt
.
pt_editForm
())
# Test Sending
def
testSendSimple
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
self
.
mt
.
send
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
mcc
=
(
'cc@example.com'
,),
mbcc
=
(
'bcc@example.com'
,),
subject
=
'Hello out there'
,
)
self
.
MailHost
.
checkSent
()
# check we're not setting a content type
self
.
assertFalse
(
self
.
r
.
RESPONSE
.
headers
.
get
(
'content-type'
),
self
.
r
.
RESPONSE
.
headers
)
def
testMailHostNotAMailHost
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
app
.
MailHost
=
'Hahaha, not a MailHost'
self
.
assertRaises
(
RuntimeError
,
self
.
mt
.
send
,
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
mcc
=
(
'cc@example.com'
,),
mbcc
=
(
'bcc@example.com'
,),
subject
=
'Hello out there'
,
)
def
_shouldFail
(
self
,
error
,
**
params
):
self
.
test_add
(
'Test Body'
)
try
:
self
.
mt
.
send
(
**
params
)
except
TypeError
,
e
:
self
.
assertEqual
(
e
.
args
[
0
],
error
)
else
:
self
.
fail
(
'Mail sent even though params missing'
)
self
.
MailHost
.
checkSent
(
False
)
def
testSendMissingParams1
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: subject'
,
mto
=
'to@example.com'
,
mfrom
=
'from@example.com'
)
def
testSendMissingParams2
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: mfrom'
,
mto
=
'to@example.com'
,
subject
=
'Test Subject'
)
def
testSendMissingParams3
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: mto'
,
mfrom
=
'from@example.com'
,
subject
=
'Test Subject'
)
def
testSendMissingParamsAll
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: mfrom, mto, subject'
,
)
def
testSendProperties
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'to@example.com, to2@example.com'
),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello out there'
),
(
'headers'
,
'lines'
,
(
'Cc:cc@example.com'
,)),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
()
self
.
MailHost
.
checkSent
()
def
testSendHeadersDict
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendHeaders.txt'
)
self
.
mt
.
send
(
headers
=
{
'From'
:
'from@example.com'
,
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Cc'
:(
'cc@example.com'
,),
'Bcc'
:(
'bcc@example.com'
,),
'Subject'
:
'Hello out there'
,
'X-Mailer'
:
'MailTemplates'
,
}
)
self
.
MailHost
.
checkSent
()
def
testSendParametersOverrideHeadersDictOverridesProperties
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendHeaders2.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
(
'headers'
,
'lines'
,(
'X-Mailer: MailTemplates'
,
'X-Mailer2: MailTemplatesBad'
,
))
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
'X-Mailer2'
:
'MailTemplates'
,
})
self
.
MailHost
.
checkSent
()
def
testSendParametersGoToOptions
(
self
):
self
.
test_add
(
'Test <tal:x replace="options/body"/>'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
},
body
=
'Body'
)
self
.
MailHost
.
checkSent
()
def
testPropertiesParametersAndSubstitution
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'to@example.com, to2@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
(
subject
=
self
.
mt
.
subject
%
'out'
)
self
.
MailHost
.
checkSent
()
def
testGetMessage
(
self
):
from
email.MIMEMultipart
import
MIMEMultipart
from
email.MIMEText
import
MIMEText
self
.
test_add
(
'Test <tal:x replace="options/body"/>'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
filename
=
'mail_SendAttachment.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
msg
=
self
.
mt
.
as_message
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
},
body
=
'Body'
,
boundary
=
'111'
,
subtype
=
'alternative'
)
self
.
assertTrue
(
isinstance
(
msg
,
MIMEMultipart
))
attachment
=
MIMEText
(
'A Test Attachment'
,
_subtype
=
'plain'
)
attachment
.
add_header
(
'Content-Disposition'
,
'attachment'
,
filename
=
'test.txt'
)
msg
.
attach
(
attachment
)
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
_addFileSetup
(
self
):
from
email.MIMEMultipart
import
MIMEMultipart
self
.
test_add
(
'Test <tal:x replace="options/body"/>'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
filename
=
'mail_SendFile.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
msg
=
self
.
mt
.
as_message
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
},
body
=
'Body'
,
boundary
=
'111'
,
subtype
=
'alternative'
)
self
.
assertTrue
(
isinstance
(
msg
,
MIMEMultipart
))
return
msg
def
testZopeFileObject
(
self
):
self
.
app
.
manage_addFile
(
'test.txt'
,
'A Test Attachment'
)
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
self
.
app
[
'test.txt'
])
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testPythonFileObject
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
))
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testFileUploadObject
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
self
.
makeFileUpload
(
value
=
'A Test Attachment'
))
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testStringWithContentType
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
filename
=
'test.txt'
,
content_type
=
'text/plain'
)
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testStringWithoutContentType
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
filename
=
'test.txt'
)
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testTooManyParameters
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
,
self
.
makeFileUpload
(
value
=
'A Test Attachment'
),
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
filename
=
'test.txt'
,
content_type
=
'text/plain'
)
def
testTooFewParameters
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
)
def
testDataWithoutFilename
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
,
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
content_type
=
'text/plain'
)
def
testFilenameWithoutData
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
,
filename
=
'test.txt'
,
content_type
=
'text/plain'
)
def
testCallAliasesSend
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_SendSimpleSomeHeaders.txt'
)
self
.
mt
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
)
self
.
MailHost
.
checkSent
()
def
test_encoded_not_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode.txt'
)
self
.
test_add
(
'Test <tal:x replace="options/unicode"/>'
)
# we get a unicode error here because we're trying to
# use an encoded string in a non-html-mode page template.
# It should have been decoded first.
self
.
assertRaises
(
UnicodeDecodeError
,
self
.
mt
,
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
.
encode
(
'utf-8'
),
encoding
=
'utf-8'
)
def
test_encoded_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode2.txt'
)
self
.
test_add
(
''
)
self
.
mt
.
pt_edit
(
'Test <tal:x replace="options/unicode"/>'
,
'text/html'
)
self
.
mt
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
.
encode
(
'utf-8'
),
encoding
=
'utf-8'
)
def
test_unicode_not_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode.txt'
)
self
.
test_add
(
'Test <tal:x replace="options/unicode"/>'
)
self
.
mt
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
,
encoding
=
'utf-8'
)
def
test_unicode_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode2.txt'
)
self
.
test_add
(
''
)
self
.
mt
.
pt_edit
(
'Test <tal:x replace="options/unicode"/>'
,
'text/html'
)
# We get a unicode error here because we're trying to
# insert a unicode into an html-mode template.
# It should have been encoded first.
self
.
assertRaises
(
UnicodeEncodeError
,
self
.
mt
,
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
,
encoding
=
'utf-8'
)
def
test_example1
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example1.mt'
)
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
(
id
=
'my_mt'
,
mailhost
=
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example1.py'
)
self
.
app
.
manage_addProduct
[
'PythonScripts'
].
manage_addPythonScript
(
id
=
'test_mt'
,
REQUEST
=
self
.
r
)
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'webmaster@example.com'
,
mto
=
(
'user@example.com'
,),
filename
=
'example1.txt'
)
# test
self
.
assertEqual
(
self
.
app
.
test_mt
(),
'Mail Sent!'
)
self
.
MailHost
.
checkSent
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_example3
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example3.mt'
)
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
(
id
=
'my_mt'
,
mailhost
=
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
app
.
manage_addFile
(
id
=
'myfile.bin'
,
file
=
self
.
makeFileUpload
(
diskname
=
'example3.bin'
)
)
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example3.py'
)
self
.
app
.
manage_addProduct
[
'PythonScripts'
].
manage_addPythonScript
(
id
=
'send_mail'
,
REQUEST
=
self
.
r
)
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
'to1@example.com'
,
filename
=
'example3.txt'
)
# test
self
.
assertEqual
(
self
.
app
.
send_mail
(),
'Mail Sent!'
)
self
.
MailHost
.
checkSent
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_example4
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example4.mt'
)
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
(
id
=
'my_mt'
,
mailhost
=
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
app
.
my_mt
.
manage_addProperty
(
'subject'
,
'Welcome to %s'
,
'string'
)
self
.
app
.
my_mt
.
manage_addProperty
(
'mfrom'
,
'webmaster@example.com'
,
'string'
)
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example4.py'
)
self
.
app
.
manage_addProduct
[
'PythonScripts'
].
manage_addPythonScript
(
id
=
'send_mail'
,
REQUEST
=
self
.
r
)
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'webmaster@example.com'
,
mto
=
(
'user@example.com'
,),
filename
=
'example4.txt'
)
# test
self
.
assertEqual
(
self
.
app
.
send_mail
(),
'Mail Sent!'
)
self
.
MailHost
.
checkSent
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_suite
():
return
TestSuite
((
makeSuite
(
TestMailTemplate
),
))
if
__name__
==
'__main__'
:
main
(
defaultTest
=
'test_suite'
)
# -*- coding: latin-1 -*-
# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
import
os
try
:
import
Zope2
as
Zope
except
ImportError
:
import
Zope
from
AccessControl.SecurityManagement
import
newSecurityManager
from
AccessControl.SecurityManagement
import
noSecurityManager
from
AccessControl.User
import
system
as
SystemUser
,
SimpleUser
from
cStringIO
import
StringIO
from
difflib
import
unified_diff
from
Products.MailHost.MailHost
import
MailHost
from
Testing.makerequest
import
makerequest
from
unittest
import
TestCase
,
TestSuite
,
makeSuite
,
main
try
:
# Zope 2.8 only
from
transaction
import
get
as
get_transaction
except
ImportError
:
# Zope 2.7 only, allows get_transaction
# to be imported from test_FSMailTemplate.
get_transaction
=
get_transaction
test_folder
=
os
.
path
.
dirname
(
__file__
)
class
DummyFieldStorage
:
def
__init__
(
self
,
filename
,
value
):
self
.
filename
=
filename
self
.
value
=
value
self
.
file
=
StringIO
(
value
)
self
.
content_type
=
None
self
.
headers
=
{}
class
DummyMailHost
(
MailHost
):
sent
=
False
def
setExpected
(
self
,
mfrom
,
mto
,
filename
):
self
.
mfrom
=
mfrom
self
.
mto
=
mto
self
.
messageText
=
open
(
os
.
path
.
join
(
test_folder
,
filename
)
).
read
().
replace
(
'
\
r
'
,
''
)
self
.
filename
=
filename
def
getId
(
self
):
return
'MailHost'
def
title_and_id
(
self
):
return
'MHTID'
def
assertEqual
(
self
,
x
,
y
,
message
=
None
,
field
=
None
):
if
x
!=
y
:
if
message
:
raise
AssertionError
(
message
)
error
=
'%r!=%r'
%
(
x
,
y
)
if
field
:
error
=
field
+
':'
+
error
raise
AssertionError
(
error
)
def
_send
(
self
,
mfrom
,
mto
,
messageText
):
self
.
assertEqual
(
self
.
mfrom
,
mfrom
,
field
=
'mfrom'
)
self
.
assertEqual
(
self
.
mto
,
mto
,
field
=
'mto'
)
expected_data
=
self
.
messageText
.
strip
().
split
(
'
\
n
'
)
actual_data
=
messageText
.
strip
().
split
(
'
\
n
'
)
# ignore dates
for
i
in
range
(
len
(
actual_data
)):
if
actual_data
[
i
].
startswith
(
'Date:'
):
actual_data
[
i
]
=
'Date:'
diff
=
tuple
(
unified_diff
(
expected_data
,
actual_data
,
self
.
filename
,
'Test results'
,
))
if
diff
:
raise
AssertionError
(
'Mail sent was not as expected:
\
n
\
n
'
+
'
\
n
'
.
join
(
diff
)
)
self
.
sent
=
True
def
checkSent
(
self
,
value
=
True
):
if
value
:
error
=
"Mail not sent"
else
:
error
=
"Mail sent when it shouldn't have been"
self
.
assertEqual
(
self
.
sent
,
value
,
error
)
class
DummyMailDropHost
(
DummyMailHost
):
meta_type
=
'Maildrop Host'
class
TestMailTemplate
(
TestCase
):
def
setUp
(
self
):
self
.
app
=
makerequest
(
Zope
.
app
())
self
.
r
=
self
.
app
.
REQUEST
self
.
r
.
other
[
'URL1'
]
=
'http://foo/test_mt'
self
.
_add
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
if
getattr
(
self
.
app
,
'test_mt'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'test_mt'
])
if
getattr
(
self
.
app
,
'MailHost'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
self
.
MailHost
=
self
.
app
.
MailHost
=
DummyMailHost
()
o
=
list
(
self
.
app
.
_objects
)
o
.
append
({
'meta_type'
:
'Mail Host'
,
'id'
:
'MailHost'
})
self
.
app
.
_objects
=
tuple
(
o
)
newSecurityManager
(
None
,
SystemUser
)
def
tearDown
(
self
):
noSecurityManager
()
get_transaction
().
abort
()
self
.
app
.
_p_jar
.
close
()
def
makeFileUpload
(
self
,
filename
=
'test.txt'
,
value
=
'test text'
,
diskname
=
''
):
if
diskname
:
filename
=
diskname
value
=
open
(
os
.
path
.
join
(
test_folder
,
diskname
)
).
read
().
replace
(
'
\
r
'
,
''
).
strip
()
from
ZPublisher.HTTPRequest
import
FileUpload
return
FileUpload
(
DummyFieldStorage
(
filename
,
value
))
def
checkContent
(
self
,
text
=
'test text'
):
if
text
is
None
:
text
=
open
(
os
.
path
.
join
(
test_folder
,
'..'
,
'www'
,
'default.txt'
)).
read
()
self
.
assertEqual
(
self
.
app
.
test_mt
.
document_src
({
'raw'
:
1
}),
text
)
# Test Adding
def
test_addAddForm
(
self
):
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
def
test_addAddFormNoMailHosts
(
self
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
res
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
self
.
assertTrue
(
res
.
find
(
'<option value="MailHost">MHTID</option>'
)
==-
1
)
def
test_addAddFormMailHost
(
self
):
self
.
app
.
_objects
=
({
'meta_type'
:
'Mail Host'
,
'id'
:
'MailHost'
},)
res
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
self
.
assertFalse
(
res
.
find
(
'<option value="MailHost">MHTID</option>'
)
==-
1
)
def
test_addAddFormMailDropHost
(
self
):
if
getattr
(
self
.
app
,
'MailHost'
,
None
):
self
.
app
.
manage_delObjects
(
ids
=
[
'MailHost'
])
self
.
MailHost
=
self
.
app
.
MailHost
=
DummyMailDropHost
()
self
.
app
.
_objects
=
({
'meta_type'
:
'Maildrop Host'
,
'id'
:
'MailHost'
},)
res
=
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplateForm
()
self
.
assertFalse
(
res
.
find
(
'<option value="MailHost">MHTID</option>'
)
==-
1
)
def
test_addNoREQUEST
(
self
):
self
.
_add
(
'test_mt'
,
'MailHost'
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
(
None
)
def
test_addNoMailHostSelected
(
self
):
self
.
_add
(
'test_mt'
,
REQUEST
=
self
.
r
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
None
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
(
None
)
# check the error we get when we try to send
self
.
assertRaises
(
RuntimeError
,
self
.
app
.
test_mt
,
mfrom
=
'from@example.com'
,
mto
=
'to@example.com'
,
subject
=
'Test Subject'
,
)
# no put a mogus mailhost in and check we get the same error
self
.
app
.
test_mt
.
mailhost
=
'bogus'
self
.
assertRaises
(
RuntimeError
,
self
.
app
.
test_mt
,
mfrom
=
'from@example.com'
,
mto
=
'to@example.com'
,
subject
=
'Test Subject'
,
)
def
test_add
(
self
,
body
=
None
):
text
=
open
(
os
.
path
.
join
(
test_folder
,
'..'
,
'www'
,
'default.txt'
)).
read
()
if
body
is
not
None
:
text
=
text
[:
-
12
]
+
body
+
text
[
-
11
:]
self
.
_add
(
'test_mt'
,
'MailHost'
,
text
=
text
,
REQUEST
=
self
.
r
)
else
:
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
assertEqual
(
self
.
r
.
RESPONSE
.
headers
,
{
'status'
:
'302 Moved Temporarily'
,
'location'
:
'http://foo/manage_main'
}
)
self
.
mt
=
self
.
app
.
test_mt
# check settings
self
.
assertEqual
(
self
.
mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
mt
.
content_type
,
'text/plain'
)
# check default content
self
.
assertEqual
(
self
.
app
.
test_mt
.
read
(),
text
)
# check default content type is text/plain
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
def
test_addFile
(
self
):
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
()
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
()
def
test_addEdit
(
self
):
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
,
submit
=
' Add and Edit '
)
self
.
assertEqual
(
self
.
r
.
RESPONSE
.
headers
,
{
'status'
:
'302 Moved Temporarily'
,
'location'
:
'http://foo/test_mt/manage_main'
}
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
(
None
)
def
test_addEditFile
(
self
):
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
()
self
.
_add
(
'test_mt'
,
'MailHost'
,
REQUEST
=
self
.
r
,
submit
=
' Add and Edit '
)
self
.
assertEqual
(
self
.
r
.
RESPONSE
.
headers
,
{
'status'
:
'302 Moved Temporarily'
,
'location'
:
'http://foo/test_mt/manage_main'
}
)
# check settings
self
.
assertEqual
(
self
.
app
.
test_mt
.
expand
,
0
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
mailhost
,
'MailHost'
)
self
.
assertEqual
(
self
.
app
.
test_mt
.
content_type
,
'text/plain'
)
# check default content
self
.
checkContent
()
# Test Properties Tab
# Not much here, as we assume PropertyManager does its job ;-)
def
test_PropertiesForm
(
self
):
self
.
test_add
()
self
.
mt
.
manage_propertiesForm
()
def
test_PropertiesStartsEmpty
(
self
):
self
.
test_add
()
self
.
assertFalse
(
self
.
mt
.
propertyMap
())
# Test Test tab, well, actually, make sure it's not there ;-)
def
test_NoTestTab
(
self
):
from
Products.MailTemplates.MailTemplate
import
MailTemplate
for
option
in
MailTemplate
.
manage_options
:
if
option
[
'label'
]
==
'Test'
:
self
.
fail
(
'Test label found'
)
self
.
assertFalse
(
MailTemplate
.
ZScriptHTML_tryForm
,
'try form not None'
)
# Test Editing
def
test_editForm
(
self
):
self
.
test_add
()
self
.
mt
.
pt_editForm
()
def
test_editFormMailHostGone
(
self
):
self
.
test_add
()
self
.
app
.
manage_delObjects
(
'MailHost'
)
r
=
self
.
mt
.
pt_editForm
()
self
.
assertFalse
(
r
.
find
(
"""<option selected="selected" value="MailHost">'MailHost' is no longer valid!</option>"""
)
==-
1
,
'No warning for MailHost being invalid found in:
\
n
'
+
r
)
def
test_editAction
(
self
):
self
.
test_add
()
self
.
mt
.
pt_editAction
(
REQUEST
=
self
.
r
,
mailhost
=
'MH2'
,
text
=
'new text'
,
content_type
=
'text/fish'
,
expand
=
1
)
self
.
assertEqual
(
self
.
mt
.
expand
,
1
)
self
.
assertEqual
(
self
.
mt
.
mailhost
,
'MH2'
)
self
.
assertEqual
(
self
.
mt
.
content_type
,
'text/fish'
)
self
.
checkContent
(
'new text'
)
def
test_view_manage_workspace
(
self
):
self
.
test_add
()
from
zExceptions
import
Redirect
try
:
self
.
assertRaises
(
self
.
mt
.
manage_workspace
(
self
.
r
))
except
Redirect
,
r
:
# this may appear to be incorrect, but http://foo/test_mt
# is what we set as REQUEST['URL1']
self
.
assertEqual
(
r
.
args
,(
'http://foo/test_mt/pt_editForm'
,))
# ugh, okay, so we can't really test for security, but lets
# test for the missing docstring that was causing problems!
self
.
assertTrue
(
self
.
mt
.
__doc__
)
def
test_view_manage_main
(
self
):
self
.
test_add
()
# for some bizare reason the output differs by a newline the first time these are called :-(
self
.
mt
.
manage_main
()
self
.
mt
.
pt_editForm
()
self
.
assertEqual
(
self
.
mt
.
manage_main
(),
self
.
mt
.
pt_editForm
())
# Test Sending
def
testSendSimple
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
self
.
mt
.
send
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
mcc
=
(
'cc@example.com'
,),
mbcc
=
(
'bcc@example.com'
,),
subject
=
'Hello out there'
,
)
self
.
MailHost
.
checkSent
()
# check we're not setting a content type
self
.
assertFalse
(
self
.
r
.
RESPONSE
.
headers
.
get
(
'content-type'
),
self
.
r
.
RESPONSE
.
headers
)
def
testMailHostNotAMailHost
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
app
.
MailHost
=
'Hahaha, not a MailHost'
self
.
assertRaises
(
RuntimeError
,
self
.
mt
.
send
,
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
mcc
=
(
'cc@example.com'
,),
mbcc
=
(
'bcc@example.com'
,),
subject
=
'Hello out there'
,
)
def
_shouldFail
(
self
,
error
,
**
params
):
self
.
test_add
(
'Test Body'
)
try
:
self
.
mt
.
send
(
**
params
)
except
TypeError
,
e
:
self
.
assertEqual
(
e
.
args
[
0
],
error
)
else
:
self
.
fail
(
'Mail sent even though params missing'
)
self
.
MailHost
.
checkSent
(
False
)
def
testSendMissingParams1
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: subject'
,
mto
=
'to@example.com'
,
mfrom
=
'from@example.com'
)
def
testSendMissingParams2
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: mfrom'
,
mto
=
'to@example.com'
,
subject
=
'Test Subject'
)
def
testSendMissingParams3
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: mto'
,
mfrom
=
'from@example.com'
,
subject
=
'Test Subject'
)
def
testSendMissingParamsAll
(
self
):
self
.
_shouldFail
(
'The following parameters were required by not specified: mfrom, mto, subject'
,
)
def
testSendProperties
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'to@example.com, to2@example.com'
),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello out there'
),
(
'headers'
,
'lines'
,
(
'Cc:cc@example.com'
,)),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
()
self
.
MailHost
.
checkSent
()
def
testSendHeadersDict
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendHeaders.txt'
)
self
.
mt
.
send
(
headers
=
{
'From'
:
'from@example.com'
,
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Cc'
:(
'cc@example.com'
,),
'Bcc'
:(
'bcc@example.com'
,),
'Subject'
:
'Hello out there'
,
'X-Mailer'
:
'MailTemplates'
,
}
)
self
.
MailHost
.
checkSent
()
def
testSendParametersOverrideHeadersDictOverridesProperties
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendHeaders2.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
(
'headers'
,
'lines'
,(
'X-Mailer: MailTemplates'
,
'X-Mailer2: MailTemplatesBad'
,
))
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
'X-Mailer2'
:
'MailTemplates'
,
})
self
.
MailHost
.
checkSent
()
def
testSendParametersGoToOptions
(
self
):
self
.
test_add
(
'Test <tal:x replace="options/body"/>'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
},
body
=
'Body'
)
self
.
MailHost
.
checkSent
()
def
testPropertiesParametersAndSubstitution
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
,
'cc@example.com'
,
'bcc@example.com'
),
filename
=
'mail_SendSimple.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'to@example.com, to2@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
self
.
mt
.
send
(
subject
=
self
.
mt
.
subject
%
'out'
)
self
.
MailHost
.
checkSent
()
def
testGetMessage
(
self
):
from
email.MIMEMultipart
import
MIMEMultipart
from
email.MIMEText
import
MIMEText
self
.
test_add
(
'Test <tal:x replace="options/body"/>'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
filename
=
'mail_SendAttachment.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
msg
=
self
.
mt
.
as_message
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
},
body
=
'Body'
,
boundary
=
'111'
,
subtype
=
'alternative'
)
self
.
assertTrue
(
isinstance
(
msg
,
MIMEMultipart
))
attachment
=
MIMEText
(
'A Test Attachment'
,
_subtype
=
'plain'
)
attachment
.
add_header
(
'Content-Disposition'
,
'attachment'
,
filename
=
'test.txt'
)
msg
.
attach
(
attachment
)
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
_addFileSetup
(
self
):
from
email.MIMEMultipart
import
MIMEMultipart
self
.
test_add
(
'Test <tal:x replace="options/body"/>'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,
'to2@example.com'
),
filename
=
'mail_SendFile.txt'
)
for
name
,
type
,
value
in
(
(
'mfrom'
,
'string'
,
'from@example.com'
),
(
'mto'
,
'string'
,
'frog@example.com'
),
(
'mcc'
,
'lines'
,(
'cc@example.com'
,)),
(
'mbcc'
,
'lines'
,(
'bcc@example.com'
,)),
(
'subject'
,
'string'
,
'Hello %s there'
),
):
self
.
mt
.
manage_addProperty
(
name
,
value
,
type
)
msg
=
self
.
mt
.
as_message
(
subject
=
self
.
mt
.
subject
%
'out'
,
headers
=
{
'To'
:(
'to@example.com'
,
'to2@example.com'
),
'Subject'
:
'cheese'
,
},
body
=
'Body'
,
boundary
=
'111'
,
subtype
=
'alternative'
)
self
.
assertTrue
(
isinstance
(
msg
,
MIMEMultipart
))
return
msg
def
testZopeFileObject
(
self
):
self
.
app
.
manage_addFile
(
'test.txt'
,
'A Test Attachment'
)
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
self
.
app
[
'test.txt'
])
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testPythonFileObject
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
))
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testFileUploadObject
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
self
.
makeFileUpload
(
value
=
'A Test Attachment'
))
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testStringWithContentType
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
filename
=
'test.txt'
,
content_type
=
'text/plain'
)
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testStringWithoutContentType
(
self
):
msg
=
self
.
_addFileSetup
()
msg
.
add_file
(
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
filename
=
'test.txt'
)
msg
.
send
()
self
.
MailHost
.
checkSent
()
def
testTooManyParameters
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
,
self
.
makeFileUpload
(
value
=
'A Test Attachment'
),
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
filename
=
'test.txt'
,
content_type
=
'text/plain'
)
def
testTooFewParameters
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
)
def
testDataWithoutFilename
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
,
data
=
open
(
os
.
path
.
join
(
test_folder
,
'test.txt'
)
).
read
(),
content_type
=
'text/plain'
)
def
testFilenameWithoutData
(
self
):
msg
=
self
.
_addFileSetup
()
self
.
assertRaises
(
TypeError
,
msg
.
add_file
,
filename
=
'test.txt'
,
content_type
=
'text/plain'
)
def
testCallAliasesSend
(
self
):
self
.
test_add
(
'Test Body'
)
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_SendSimpleSomeHeaders.txt'
)
self
.
mt
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
)
self
.
MailHost
.
checkSent
()
def
test_encoded_not_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode.txt'
)
self
.
test_add
(
'Test <tal:x replace="options/unicode"/>'
)
# we get a unicode error here because we're trying to
# use an encoded string in a non-html-mode page template.
# It should have been decoded first.
self
.
assertRaises
(
UnicodeDecodeError
,
self
.
mt
,
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
.
encode
(
'utf-8'
),
encoding
=
'utf-8'
)
def
test_encoded_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode2.txt'
)
self
.
test_add
(
''
)
self
.
mt
.
pt_edit
(
'Test <tal:x replace="options/unicode"/>'
,
'text/html'
)
self
.
mt
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
.
encode
(
'utf-8'
),
encoding
=
'utf-8'
)
def
test_unicode_not_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode.txt'
)
self
.
test_add
(
'Test <tal:x replace="options/unicode"/>'
)
self
.
mt
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
,
encoding
=
'utf-8'
)
def
test_unicode_html_mode
(
self
):
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
filename
=
'mail_unicode2.txt'
)
self
.
test_add
(
''
)
self
.
mt
.
pt_edit
(
'Test <tal:x replace="options/unicode"/>'
,
'text/html'
)
# We get a unicode error here because we're trying to
# insert a unicode into an html-mode template.
# It should have been encoded first.
self
.
assertRaises
(
UnicodeEncodeError
,
self
.
mt
,
mfrom
=
'from@example.com'
,
mto
=
(
'to@example.com'
,),
subject
=
'Test Subject'
,
unicode
=
u''
,
encoding
=
'utf-8'
)
def
test_example1
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example1.mt'
)
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
(
id
=
'my_mt'
,
mailhost
=
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example1.py'
)
self
.
app
.
manage_addProduct
[
'PythonScripts'
].
manage_addPythonScript
(
id
=
'test_mt'
,
REQUEST
=
self
.
r
)
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'webmaster@example.com'
,
mto
=
(
'user@example.com'
,),
filename
=
'example1.txt'
)
# test
self
.
assertEqual
(
self
.
app
.
test_mt
(),
'Mail Sent!'
)
self
.
MailHost
.
checkSent
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_example3
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example3.mt'
)
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
(
id
=
'my_mt'
,
mailhost
=
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
app
.
manage_addFile
(
id
=
'myfile.bin'
,
file
=
self
.
makeFileUpload
(
diskname
=
'example3.bin'
)
)
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example3.py'
)
self
.
app
.
manage_addProduct
[
'PythonScripts'
].
manage_addPythonScript
(
id
=
'send_mail'
,
REQUEST
=
self
.
r
)
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'from@example.com'
,
mto
=
'to1@example.com'
,
filename
=
'example3.txt'
)
# test
self
.
assertEqual
(
self
.
app
.
send_mail
(),
'Mail Sent!'
)
self
.
MailHost
.
checkSent
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_example4
(
self
):
# login
noSecurityManager
()
self
.
app
.
aq_chain
[
-
1
].
id
=
'testing'
newSecurityManager
(
None
,
SimpleUser
(
'Test User'
,
''
,(
'Manager'
,),[]).
__of__
(
self
.
app
)
)
try
:
# setup
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example4.mt'
)
self
.
app
.
manage_addProduct
[
'MailTemplates'
].
addMailTemplate
(
id
=
'my_mt'
,
mailhost
=
'MailHost'
,
REQUEST
=
self
.
r
)
self
.
app
.
my_mt
.
manage_addProperty
(
'subject'
,
'Welcome to %s'
,
'string'
)
self
.
app
.
my_mt
.
manage_addProperty
(
'mfrom'
,
'webmaster@example.com'
,
'string'
)
self
.
r
.
form
[
'file'
]
=
self
.
makeFileUpload
(
diskname
=
'example4.py'
)
self
.
app
.
manage_addProduct
[
'PythonScripts'
].
manage_addPythonScript
(
id
=
'send_mail'
,
REQUEST
=
self
.
r
)
# set expected
self
.
MailHost
.
setExpected
(
mfrom
=
'webmaster@example.com'
,
mto
=
(
'user@example.com'
,),
filename
=
'example4.txt'
)
# test
self
.
assertEqual
(
self
.
app
.
send_mail
(),
'Mail Sent!'
)
self
.
MailHost
.
checkSent
()
finally
:
# logout
noSecurityManager
()
newSecurityManager
(
None
,
SystemUser
)
def
test_suite
():
return
TestSuite
((
makeSuite
(
TestMailTemplate
),
))
if
__name__
==
'__main__'
:
main
(
defaultTest
=
'test_suite'
)
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