Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5-Boxiang
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Hamza
erp5-Boxiang
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