[Testbot] Plone 5.0 - Python 2.7 - Build # 1605 - Still failing! - 1 failure(s)

jenkins at plone.org jenkins at plone.org
Mon Feb 17 17:46:20 UTC 2014


-------------------------------------------------------------------------------
Plone 5.0 - Python 2.7 - Build # 1605 - Still Failing!
-------------------------------------------------------------------------------

http://jenkins.plone.org/job/plone-5.0-python-2.7/1605/


-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------

Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T06:03:45-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/259097ddd271308ca76ea87ac4150977f130d34f

Initial implementation of sendto z3c form

Files changed:
A Products/CMFPlone/browser/sendto.py
A Products/CMFPlone/browser/templates/sendto_template.pt
M Products/CMFPlone/browser/configure.zcml
M Products/CMFPlone/browser/interfaces.py

diff --git a/Products/CMFPlone/browser/configure.zcml b/Products/CMFPlone/browser/configure.zcml
index 259e02f..0c0143d 100644
--- a/Products/CMFPlone/browser/configure.zcml
+++ b/Products/CMFPlone/browser/configure.zcml
@@ -12,6 +12,17 @@
       <allow interface="plone.app.layout.navigation.interfaces.INavigationQueryBuilder" />
   </class>
 
+  <permission
+    id="Products.CMFPlone.AllowSendto"
+    title="Allow sendto" />
+
+  <browser:page
+      for="*"
+      name="sendto"
+      class=".sendto.SendToForm"
+      permission="Products.CMFPlone.AllowSendto"
+      />
+
   <browser:page
       for="*"
       name="breadcrumbs_view"
diff --git a/Products/CMFPlone/browser/interfaces.py b/Products/CMFPlone/browser/interfaces.py
index b003206..7b3442f 100644
--- a/Products/CMFPlone/browser/interfaces.py
+++ b/Products/CMFPlone/browser/interfaces.py
@@ -1,7 +1,11 @@
+from zope import schema
 from zope.interface import Interface
 
 import zope.deferredimport
 
+from Products.CMFPlone import PloneMessageFactory as _
+
+
 # This is used as a persistent marker interface, we need to provide an upgrade
 # step to update the class reference before removing it.
 zope.deferredimport.deprecated(
@@ -308,3 +312,31 @@ def bodyClass(template, view):
         """ returns template or view name to mark body tag with
             template-${template_id} CSS class
         """
+
+
+class ISendToForm(Interface):
+    """ Interface for describing the 'sendto' form """
+
+    send_to_address = schema.TextLine(
+        title=_(u'label_send_to_mail',
+                default=u'Send to'),
+        description=_(u'help_send_to_mail',
+                      default=u'The e-mail address to send this link to.'),
+        required=True
+    )
+
+    send_from_address = schema.TextLine(
+        title=_(u'label_send_from',
+                default=u'From'),
+        description=_(u'help_send_from',
+                      default=u'Your email address.'),
+        required=True
+    )
+
+    comment = schema.Text(
+        title=_(u'label_comment',
+                default=u'Comment'),
+        description=_(u'help_comment_to_link',
+                      default=u'A comment about this link.'),
+        required=False
+    )
diff --git a/Products/CMFPlone/browser/sendto.py b/Products/CMFPlone/browser/sendto.py
new file mode 100644
index 0000000..3f02e2e
--- /dev/null
+++ b/Products/CMFPlone/browser/sendto.py
@@ -0,0 +1,111 @@
+from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import pretty_title_or_id
+from Products.CMFPlone.utils import transaction_note
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from Products.MailHost.interfaces import IMailHost
+from Products.statusmessages.interfaces import IStatusMessage
+
+from ZODB.POSException import ConflictError
+
+from plone.z3cform import layout
+
+from zope.component import getMultiAdapter
+from zope.component import getUtility
+
+from z3c.form import form
+from z3c.form import field
+from z3c.form import button
+
+from interfaces import ISendToForm
+
+
+class SendToForm(form.Form):
+    label = _(u'heading_send_page_to',
+              default=u'Send this page to someone')
+
+    description = _(u'description_send_page_url_to',
+                    default=u'Fill in the email address of your '
+                    u'friend, and we will send an email '
+                    u'that contains a link to this page.')
+
+    fields = field.Fields(ISendToForm)
+    ignoreContext = True
+
+    mail_template = ViewPageTemplateFile('templates/sendto_template.pt')
+
+    # XXX: Add validation, but the plan is the fields should be
+    # changed to the Email field that is to be provided by
+    # plone schema
+
+    @button.buttonAndHandler(_(u'label_send', default='Send'),
+                             name='send')
+    def handle_send(self, action):
+        portal_state = getMultiAdapter(
+            (self.context, self.request),
+            name=u'plone_portal_state'
+        )
+        site = portal_state.portal()
+
+        context_state = getMultiAdapter(
+            (self.context, self.request),
+            "plone_context_state"
+        )
+        url = context_state.view_url()
+
+        send_from_address = self.request.get('send_from_address')
+        send_to_address = self.request.get('send_to_address')
+        subject = pretty_title_or_id(self.context)
+        title = pretty_title_or_id(self.context)
+        description = self.context.Description()
+        comment = self.request.get('comment', None)
+        envelope_from = site.getProperty('email_from_address', None)
+
+        try:
+            # Sends a link of a page to someone.
+            host = getUtility(IMailHost)
+            encoding = site.getProperty('email_charset')
+
+            if not envelope_from:
+                envelope_from = send_from_address
+
+            # Cook from template
+            message = self.template(
+                self,
+                send_to_address=send_to_address,
+                send_from_address=send_from_address,
+                comment=comment,
+                subject=subject,
+                title=title,
+                description=description
+            )
+
+            message = message.encode(encoding)
+
+            host.send(
+                message,
+                mto=send_to_address,
+                mfrom=envelope_from,
+                subject=subject,
+                charset='utf-8'
+            )
+
+        except ConflictError:
+            raise
+        except:
+            # TODO To many things could possibly go wrong. So we catch all.
+            IStatusMessage(self.request).addStatusMessage(
+                _(u'Unable to send mail.'),
+                type=u'error'
+            )
+            return
+
+        transaction_note(
+            'Sent page %s to %s' % (url, send_to_address)
+        )
+
+        IStatusMessage(self.request).addPortalMessage(
+            _(u'Mail sent.'),
+            type=u'info'
+        )
+
+send_to_form = layout.wrap_form(SendToForm)
diff --git a/Products/CMFPlone/browser/templates/sendto_template.pt b/Products/CMFPlone/browser/templates/sendto_template.pt
new file mode 100644
index 0000000..a83e4d2
--- /dev/null
+++ b/Products/CMFPlone/browser/templates/sendto_template.pt
@@ -0,0 +1,30 @@
+<div xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+     xmlns:tal="http://xml.zope.org/namespaces/tal"
+     xmlns:metal="http://xml.zope.org/namespaces/metal"
+     xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+     i18n:domain="plone"
+     tal:omit-tag=""
+     tal:define="utool nocall:context/portal_url;
+                 charset context/email_charset|string:utf-8;
+                 dummy python:request.RESPONSE.setHeader('Content-Type', 'text/html;;charset=%s' % charset)"
+><div i18n:translate="sendto_mailtemplate_body" tal:omit-tag="">
+This link is sent to you from <span i18n:name="portal_url" tal:omit-tag="" tal:replace="structure utool" />
+
+You are receiving this mail because someone read a page at
+<span i18n:name="portal_title" tal:omit-tag="" tal:replace="structure utool/Title" />
+and thought it might interest you.
+
+It is sent by <span i18n:name="from_address" tal:omit-tag="" tal:replace="structure options/send_from_address"
+/> with the following comment:
+"<span i18n:name="comment" tal:omit-tag="" tal:replace="structure options/comment | nothing" />"
+
+<span i18n:name="document_title" tal:omit-tag="" tal:replace="structure options/title | context/Title" />
+
+<span i18n:name="document_description" tal:omit-tag="" tal:replace="structure options/description | context/Description" />
+
+<span i18n:name="document_url" tal:omit-tag="" tal:replace="structure options/url | context/absolute_url" />
+</div>
+--
+<span tal:replace="structure context/email_from_name" />
+
+</div>


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T06:03:58-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/7a8a8aa6dc515b4988afecd1280f79058b23ad7b

Misc bugfixes.

Files changed:
M Products/CMFPlone/browser/sendto.py

diff --git a/Products/CMFPlone/browser/sendto.py b/Products/CMFPlone/browser/sendto.py
index 3f02e2e..48e750c 100644
--- a/Products/CMFPlone/browser/sendto.py
+++ b/Products/CMFPlone/browser/sendto.py
@@ -18,6 +18,10 @@
 
 from interfaces import ISendToForm
 
+import logging
+
+logger = logging.getLogger("Plone")
+
 
 class SendToForm(form.Form):
     label = _(u'heading_send_page_to',
@@ -40,6 +44,14 @@ class SendToForm(form.Form):
     @button.buttonAndHandler(_(u'label_send', default='Send'),
                              name='send')
     def handle_send(self, action):
+        data, errors = self.extractData()
+        if errors:
+            IStatusMessage(self.request).addStatusMessage(
+                self.formErrorsMessage,
+                type=u'error'
+            )
+            return
+
         portal_state = getMultiAdapter(
             (self.context, self.request),
             name=u'plone_portal_state'
@@ -48,16 +60,16 @@ def handle_send(self, action):
 
         context_state = getMultiAdapter(
             (self.context, self.request),
-            "plone_context_state"
+            name=u'plone_context_state'
         )
         url = context_state.view_url()
 
-        send_from_address = self.request.get('send_from_address')
-        send_to_address = self.request.get('send_to_address')
-        subject = pretty_title_or_id(self.context)
-        title = pretty_title_or_id(self.context)
+        send_from_address = data.get('send_from_address')
+        send_to_address = data.get('send_to_address')
+        subject = pretty_title_or_id(self, self.context)
+        title = pretty_title_or_id(self, self.context)
         description = self.context.Description()
-        comment = self.request.get('comment', None)
+        comment = data.get('comment', None)
         envelope_from = site.getProperty('email_from_address', None)
 
         try:
@@ -69,7 +81,7 @@ def handle_send(self, action):
                 envelope_from = send_from_address
 
             # Cook from template
-            message = self.template(
+            message = self.mail_template(
                 self,
                 send_to_address=send_to_address,
                 send_from_address=send_from_address,
@@ -91,8 +103,9 @@ def handle_send(self, action):
 
         except ConflictError:
             raise
-        except:
+        except Exception as e:
             # TODO To many things could possibly go wrong. So we catch all.
+            logger.info("Unable to send mail: " + str(e))
             IStatusMessage(self.request).addStatusMessage(
                 _(u'Unable to send mail.'),
                 type=u'error'
@@ -103,7 +116,7 @@ def handle_send(self, action):
             'Sent page %s to %s' % (url, send_to_address)
         )
 
-        IStatusMessage(self.request).addPortalMessage(
+        IStatusMessage(self.request).addStatusMessage(
             _(u'Mail sent.'),
             type=u'info'
         )


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T06:04:09-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/72394b0affba5387983d81513fa8a6f9f36ad703

Removed old sendto cpt/cpy/vpy implementation

Files changed:
D Products/CMFPlone/skins/plone_form_scripts/sendto.cpy
D Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata
D Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy
D Products/CMFPlone/skins/plone_forms/sendto_form.cpt
D Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata
D Products/CMFPlone/skins/plone_templates/sendto_template.pt

diff --git a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy b/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy
deleted file mode 100644
index 7b8ae19..0000000
--- a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy
+++ /dev/null
@@ -1,58 +0,0 @@
-## Controller Python Script "sendto"
-##bind container=container
-##bind context=context
-##bind namespace=
-##bind script=script
-##bind state=state
-##bind subpath=traverse_subpath
-##parameters=
-##title=Send an URL to a friend
-
-REQUEST = context.REQUEST
-
-from Products.CMFPlone.utils import transaction_note
-from Products.CMFPlone.PloneTool import AllowSendto
-from Products.CMFCore.utils import getToolByName
-from Products.CMFPlone import PloneMessageFactory as _
-from ZODB.POSException import ConflictError
-
-plone_utils = getToolByName(context, 'plone_utils')
-mtool = getToolByName(context, 'portal_membership')
-site = getToolByName(context, 'portal_url').getPortalObject()
-pretty_title_or_id = plone_utils.pretty_title_or_id
-
-if not mtool.checkPermission(AllowSendto, context):
-    plone_utils.addPortalMessage(_(u'You are not allowed to send this link.'),
-                                 'error')
-    return state.set(status='failure')
-
-# Find the view action.
-context_state = context.restrictedTraverse("@@plone_context_state")
-url = context_state.view_url()
-
-variables = {'send_from_address' : REQUEST.send_from_address,
-             'send_to_address'   : REQUEST.send_to_address,
-             'subject'           : pretty_title_or_id(context),
-             'url'               : url,
-             'title'             : pretty_title_or_id(context),
-             'description'       : context.Description(),
-             'comment'           : REQUEST.get('comment', None),
-             'envelope_from'     : site.getProperty('email_from_address'),
-             }
-
-try:
-    plone_utils.sendto(**variables)
-except ConflictError:
-    raise
-except:  # TODO To many things could possibly go wrong. So we catch all.
-    exception = plone_utils.exceptionString()
-    message = _(u'Unable to send mail: ${exception}',
-                mapping={u'exception': exception})
-    plone_utils.addPortalMessage(message, 'error')
-    return state.set(status='failure')
-
-tmsg = 'Sent page %s to %s' % (url, REQUEST.send_to_address)
-transaction_note(tmsg)
-
-plone_utils.addPortalMessage(_(u'Mail sent.'))
-return state
diff --git a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata b/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata
deleted file mode 100644
index 80bb542..0000000
--- a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata
+++ /dev/null
@@ -1,6 +0,0 @@
-[validators]
-validators=validate_sendto
-
-[actions]
-action.success = redirect_to_action:string:view
-action.failure = redirect_to_action:string:view
diff --git a/Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy b/Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy
deleted file mode 100644
index f2f1fa0..0000000
--- a/Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy
+++ /dev/null
@@ -1,39 +0,0 @@
-## Controller Script Python "validate_sendto"
-##bind container=container
-##bind context=context
-##bind namespace=
-##bind script=script
-##bind state=state
-##bind subpath=traverse_subpath
-##parameters=send_to_address='',send_from_address=''
-##title=validates the email adresses
-
-from Products.CMFPlone import PloneMessageFactory as _
-plone_utils=context.plone_utils
-
-if not send_to_address:
-    state.setError('send_to_address',
-                   _(u'Please submit an email address.'),
-                   'email_required')
-
-if not plone_utils.validateEmailAddresses(send_to_address):
-    state.setError('send_to_address',
-                   _(u'Please submit a valid email address.'),
-                   'email_required')
-
-if not send_from_address:
-    state.setError('send_from_address',
-                   _(u'Please submit an email address.'),
-                   'email_required')
-
-if not plone_utils.validateSingleEmailAddress(send_from_address):
-    state.setError('send_from_address',
-                   _(u'Please submit a valid email address.'),
-                   'email_required')
-
-if state.getErrors():
-    context.plone_utils.addPortalMessage(
-        _(u'Please correct the indicated errors.'), 'error')
-    return state.set(status='failure')
-else:
-    return state
diff --git a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt b/Products/CMFPlone/skins/plone_forms/sendto_form.cpt
deleted file mode 100644
index f4140eb..0000000
--- a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt
+++ /dev/null
@@ -1,126 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
-      xmlns:tal="http://xml.zope.org/namespaces/tal"
-      xmlns:metal="http://xml.zope.org/namespaces/metal"
-      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-      metal:use-macro="context/main_template/macros/master"
-      i18n:domain="plone">
-
-<metal:block fill-slot="top_slot"
-             tal:define="dummy python:request.set('disable_border',1)" />
-
-  <metal:head fill-slot="head_slot">
-    <meta name="robots" content="noindex,follow" />
-  </metal:head>
-
-  <body>
-
-    <metal:main fill-slot="main"
-         tal:define="errors options/state/getErrors;">
-
-      <h1 class="documentFirstHeading"
-          i18n:translate="heading_send_page_to">Send this page to someone</h1>
-
-      <div class="documentDescription"
-         i18n:translate="description_send_page_url_to">
-        Fill in the email address of your friend, and we will send an email
-        that contains a link to this page.
-      </div>
-
-      <div id="content-core">
-          <form name="sendto_form"
-                class="enableAutoFocus"
-                action="sendto_form"
-                method="post"
-                enctype="multipart/form-data"
-                tal:attributes="action string:${context/@@plone_context_state/object_url}/${template/getId}">
-
-            <fieldset>
-
-              <legend i18n:translate="legend_address_info">Address info</legend>
-
-              <div class="field"
-                   tal:define="error errors/send_to_address|nothing;"
-                   tal:attributes="class python:test(error, 'field error', 'field')">
-
-                <label for="send_to_address" i18n:translate="label_send_to_mail">Send to</label>
-
-                <span class="fieldRequired" title="Required"
-                      i18n:attributes="title title_required;"
-                      i18n:translate="label_required">(Required)</span>
-
-                      <div class="formHelp" i18n:translate="help_send_to_mail">
-                        The e-mail address to send this link to.
-                      </div>
-
-                      <div tal:content="error">Validation error output</div>
-
-                      <input type="text"
-                             id="send_to_address"
-                             name="send_to_address"
-                             size="25"
-                             tal:attributes="value request/send_to_address | nothing;"
-                             />
-              </div>
-
-              <div class="field"
-                   tal:define="error errors/send_from_address|nothing;"
-                   tal:attributes="class python:test(error, 'field error', 'field')">
-
-                <label for="send_from_address" i18n:translate="label_send_from">From</label>
-
-                <span class="fieldRequired" title="Required"
-                      i18n:attributes="title title_required;"
-                      i18n:translate="label_required">(Required)</span>
-
-                      <div class="formHelp" i18n:translate="help_send_from">
-                        Your email address.
-                      </div>
-
-                      <div tal:content="error">Validation error output</div>
-
-                      <input type="text"
-                             id="send_from_address"
-                             name="send_from_address"
-                             size="25"
-                             tal:define="member context/@@plone_portal_state/member;"
-                             tal:attributes="value python: request.get('send_from_address', member.getProperty('email',''));"
-                             />
-              </div>
-
-              <div class="field">
-                <label for="comment" i18n:translate="label_comment">Comment</label>
-
-                <div class="formHelp" i18n:translate="help_comment_to_link">
-                  A comment about this link.
-                </div>
-
-                <textarea cols="80"
-                          rows="5"
-                          id="comment"
-                          name="comment"
-                          tal:content="request/comment | nothing"
-                          >
-                  Comment
-                </textarea>
-              </div>
-
-              <div class="formControls">
-                <input class="context"
-                       type="submit"
-                       name="form.button.Send"
-                       value="Send"
-                       i18n:attributes="value label_send;"
-                       />
-              </div>
-
-              <input type="hidden" name="form.submitted" value="1" />
-
-            </fieldset>
-
-          </form>
-      </div>
-
-    </metal:main>
-
-  </body>
-</html>
diff --git a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata b/Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata
deleted file mode 100644
index 96d0516..0000000
--- a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata
+++ /dev/null
@@ -1,9 +0,0 @@
-[default]
-title=Send this page to somebody
-
-[validators]
-validators=validate_sendto
-
-[actions]
-action.success=traverse_to:string:sendto
-action.failure=traverse_to:string:sendto_form
diff --git a/Products/CMFPlone/skins/plone_templates/sendto_template.pt b/Products/CMFPlone/skins/plone_templates/sendto_template.pt
deleted file mode 100644
index a83e4d2..0000000
--- a/Products/CMFPlone/skins/plone_templates/sendto_template.pt
+++ /dev/null
@@ -1,30 +0,0 @@
-<div xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
-     xmlns:tal="http://xml.zope.org/namespaces/tal"
-     xmlns:metal="http://xml.zope.org/namespaces/metal"
-     xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-     i18n:domain="plone"
-     tal:omit-tag=""
-     tal:define="utool nocall:context/portal_url;
-                 charset context/email_charset|string:utf-8;
-                 dummy python:request.RESPONSE.setHeader('Content-Type', 'text/html;;charset=%s' % charset)"
-><div i18n:translate="sendto_mailtemplate_body" tal:omit-tag="">
-This link is sent to you from <span i18n:name="portal_url" tal:omit-tag="" tal:replace="structure utool" />
-
-You are receiving this mail because someone read a page at
-<span i18n:name="portal_title" tal:omit-tag="" tal:replace="structure utool/Title" />
-and thought it might interest you.
-
-It is sent by <span i18n:name="from_address" tal:omit-tag="" tal:replace="structure options/send_from_address"
-/> with the following comment:
-"<span i18n:name="comment" tal:omit-tag="" tal:replace="structure options/comment | nothing" />"
-
-<span i18n:name="document_title" tal:omit-tag="" tal:replace="structure options/title | context/Title" />
-
-<span i18n:name="document_description" tal:omit-tag="" tal:replace="structure options/description | context/Description" />
-
-<span i18n:name="document_url" tal:omit-tag="" tal:replace="structure options/url | context/absolute_url" />
-</div>
---
-<span tal:replace="structure context/email_from_name" />
-
-</div>


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T06:04:19-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/0d7aca7619a0f4314be31bc18f3c2723265842cd

Browserview called sendto_form to maintain compatibility

Files changed:
M Products/CMFPlone/browser/configure.zcml

diff --git a/Products/CMFPlone/browser/configure.zcml b/Products/CMFPlone/browser/configure.zcml
index 0c0143d..bf36f23 100644
--- a/Products/CMFPlone/browser/configure.zcml
+++ b/Products/CMFPlone/browser/configure.zcml
@@ -18,7 +18,7 @@
 
   <browser:page
       for="*"
-      name="sendto"
+      name="sendto_form"
       class=".sendto.SendToForm"
       permission="Products.CMFPlone.AllowSendto"
       />


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T06:12:57-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/53c0458c60a0d542b91ec6535a3e85d721e538b3

Expect it is safe to remove sendto, and permissions are moved to configure.zcml

Files changed:
M Products/CMFPlone/PloneTool.py

diff --git a/Products/CMFPlone/PloneTool.py b/Products/CMFPlone/PloneTool.py
index e9071dc..cc769f2 100644
--- a/Products/CMFPlone/PloneTool.py
+++ b/Products/CMFPlone/PloneTool.py
@@ -49,9 +49,6 @@
     import LinkIntegrityNotificationException
 
 
-AllowSendto = 'Allow sendto'
-permissions.setDefaultRoles(AllowSendto, ('Anonymous', 'Manager', ))
-
 _marker = utils._marker
 _icons = {}
 
@@ -163,27 +160,6 @@ def getMailHost(self):
         """
         return getattr(aq_parent(self), 'MailHost')
 
-    security.declareProtected(AllowSendto, 'sendto')
-    def sendto(self, send_to_address, send_from_address, comment,
-               subject='Plone', **kwargs):
-        # Sends a link of a page to someone.
-        host = self.getMailHost()
-        template = getattr(self, 'sendto_template')
-        portal = getToolByName(self, 'portal_url').getPortalObject()
-        encoding = portal.getProperty('email_charset')
-        if 'envelope_from' in kwargs:
-            envelope_from = kwargs['envelope_from']
-        else:
-            envelope_from = send_from_address
-        # Cook from template
-        message = template(self, send_to_address=send_to_address,
-                           send_from_address=send_from_address,
-                           comment=comment, subject=subject, **kwargs)
-        message = message.encode(encoding)
-        host.send(message, mto=send_to_address,
-                  mfrom=envelope_from, subject=subject,
-                  charset='utf-8')
-
     security.declarePublic('validateSingleNormalizedEmailAddress')
     def validateSingleNormalizedEmailAddress(self, address):
         """Lower-level function to validate a single normalized email address,


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T06:48:37-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/517ff6bb8346aa4c1fa695d139be1d3ab7f2b895

Removed transaction_note

Files changed:
M Products/CMFPlone/browser/sendto.py

diff --git a/Products/CMFPlone/browser/sendto.py b/Products/CMFPlone/browser/sendto.py
index 48e750c..aa97cf3 100644
--- a/Products/CMFPlone/browser/sendto.py
+++ b/Products/CMFPlone/browser/sendto.py
@@ -1,6 +1,5 @@
 from Products.CMFPlone import PloneMessageFactory as _
 from Products.CMFPlone.utils import pretty_title_or_id
-from Products.CMFPlone.utils import transaction_note
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from Products.MailHost.interfaces import IMailHost
 from Products.statusmessages.interfaces import IStatusMessage
@@ -112,10 +111,6 @@ def handle_send(self, action):
             )
             return
 
-        transaction_note(
-            'Sent page %s to %s' % (url, send_to_address)
-        )
-
         IStatusMessage(self.request).addStatusMessage(
             _(u'Mail sent.'),
             type=u'info'


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-13T07:22:05-08:00
Author: Bo Simonsen (bosim) <bo at geekworld.dk>
Commit: https://github.com/plone/Products.CMFPlone/commit/13f645c87087ac9caba932973ed3688895047a8d

Removed possibility for anonymous to use the sendto form

Files changed:
M Products/CMFPlone/profiles/default/rolemap.xml

diff --git a/Products/CMFPlone/profiles/default/rolemap.xml b/Products/CMFPlone/profiles/default/rolemap.xml
index ecde4b9..de9a084 100644
--- a/Products/CMFPlone/profiles/default/rolemap.xml
+++ b/Products/CMFPlone/profiles/default/rolemap.xml
@@ -38,7 +38,6 @@
       <role name="Contributor"/>
     </permission>
     <permission name="Allow sendto" acquire="True">
-      <role name="Anonymous"/>
       <role name="Manager"/>
       <role name="Site Administrator"/>
       <role name="Member"/>


Repository: Products.CMFPlone
Branch: refs/heads/master
Date: 2014-02-17T09:01:53-08:00
Author: Elizabeth Leddy (eleddy) <eleddy at eastofeaton.com>
Commit: https://github.com/plone/Products.CMFPlone/commit/ae4a51caee497b62fb2e9f8c8534158ae26be51b

Merge pull request #179 from plone/remove_sendto_cleanedup

Remove sendto

Files changed:
A Products/CMFPlone/browser/sendto.py
A Products/CMFPlone/browser/templates/sendto_template.pt
M Products/CMFPlone/PloneTool.py
M Products/CMFPlone/browser/configure.zcml
M Products/CMFPlone/browser/interfaces.py
M Products/CMFPlone/profiles/default/rolemap.xml
D Products/CMFPlone/skins/plone_templates/sendto_template.pt
D Products/CMFPlone/skins/plone_form_scripts/sendto.cpy
D Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata
D Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy
D Products/CMFPlone/skins/plone_forms/sendto_form.cpt
D Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata

diff --git a/Products/CMFPlone/PloneTool.py b/Products/CMFPlone/PloneTool.py
index e9071dc..cc769f2 100644
--- a/Products/CMFPlone/PloneTool.py
+++ b/Products/CMFPlone/PloneTool.py
@@ -49,9 +49,6 @@
     import LinkIntegrityNotificationException
 
 
-AllowSendto = 'Allow sendto'
-permissions.setDefaultRoles(AllowSendto, ('Anonymous', 'Manager', ))
-
 _marker = utils._marker
 _icons = {}
 
@@ -163,27 +160,6 @@ def getMailHost(self):
         """
         return getattr(aq_parent(self), 'MailHost')
 
-    security.declareProtected(AllowSendto, 'sendto')
-    def sendto(self, send_to_address, send_from_address, comment,
-               subject='Plone', **kwargs):
-        # Sends a link of a page to someone.
-        host = self.getMailHost()
-        template = getattr(self, 'sendto_template')
-        portal = getToolByName(self, 'portal_url').getPortalObject()
-        encoding = portal.getProperty('email_charset')
-        if 'envelope_from' in kwargs:
-            envelope_from = kwargs['envelope_from']
-        else:
-            envelope_from = send_from_address
-        # Cook from template
-        message = template(self, send_to_address=send_to_address,
-                           send_from_address=send_from_address,
-                           comment=comment, subject=subject, **kwargs)
-        message = message.encode(encoding)
-        host.send(message, mto=send_to_address,
-                  mfrom=envelope_from, subject=subject,
-                  charset='utf-8')
-
     security.declarePublic('validateSingleNormalizedEmailAddress')
     def validateSingleNormalizedEmailAddress(self, address):
         """Lower-level function to validate a single normalized email address,
diff --git a/Products/CMFPlone/browser/configure.zcml b/Products/CMFPlone/browser/configure.zcml
index 259e02f..bf36f23 100644
--- a/Products/CMFPlone/browser/configure.zcml
+++ b/Products/CMFPlone/browser/configure.zcml
@@ -12,6 +12,17 @@
       <allow interface="plone.app.layout.navigation.interfaces.INavigationQueryBuilder" />
   </class>
 
+  <permission
+    id="Products.CMFPlone.AllowSendto"
+    title="Allow sendto" />
+
+  <browser:page
+      for="*"
+      name="sendto_form"
+      class=".sendto.SendToForm"
+      permission="Products.CMFPlone.AllowSendto"
+      />
+
   <browser:page
       for="*"
       name="breadcrumbs_view"
diff --git a/Products/CMFPlone/browser/interfaces.py b/Products/CMFPlone/browser/interfaces.py
index b003206..7b3442f 100644
--- a/Products/CMFPlone/browser/interfaces.py
+++ b/Products/CMFPlone/browser/interfaces.py
@@ -1,7 +1,11 @@
+from zope import schema
 from zope.interface import Interface
 
 import zope.deferredimport
 
+from Products.CMFPlone import PloneMessageFactory as _
+
+
 # This is used as a persistent marker interface, we need to provide an upgrade
 # step to update the class reference before removing it.
 zope.deferredimport.deprecated(
@@ -308,3 +312,31 @@ def bodyClass(template, view):
         """ returns template or view name to mark body tag with
             template-${template_id} CSS class
         """
+
+
+class ISendToForm(Interface):
+    """ Interface for describing the 'sendto' form """
+
+    send_to_address = schema.TextLine(
+        title=_(u'label_send_to_mail',
+                default=u'Send to'),
+        description=_(u'help_send_to_mail',
+                      default=u'The e-mail address to send this link to.'),
+        required=True
+    )
+
+    send_from_address = schema.TextLine(
+        title=_(u'label_send_from',
+                default=u'From'),
+        description=_(u'help_send_from',
+                      default=u'Your email address.'),
+        required=True
+    )
+
+    comment = schema.Text(
+        title=_(u'label_comment',
+                default=u'Comment'),
+        description=_(u'help_comment_to_link',
+                      default=u'A comment about this link.'),
+        required=False
+    )
diff --git a/Products/CMFPlone/browser/sendto.py b/Products/CMFPlone/browser/sendto.py
new file mode 100644
index 0000000..aa97cf3
--- /dev/null
+++ b/Products/CMFPlone/browser/sendto.py
@@ -0,0 +1,119 @@
+from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import pretty_title_or_id
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from Products.MailHost.interfaces import IMailHost
+from Products.statusmessages.interfaces import IStatusMessage
+
+from ZODB.POSException import ConflictError
+
+from plone.z3cform import layout
+
+from zope.component import getMultiAdapter
+from zope.component import getUtility
+
+from z3c.form import form
+from z3c.form import field
+from z3c.form import button
+
+from interfaces import ISendToForm
+
+import logging
+
+logger = logging.getLogger("Plone")
+
+
+class SendToForm(form.Form):
+    label = _(u'heading_send_page_to',
+              default=u'Send this page to someone')
+
+    description = _(u'description_send_page_url_to',
+                    default=u'Fill in the email address of your '
+                    u'friend, and we will send an email '
+                    u'that contains a link to this page.')
+
+    fields = field.Fields(ISendToForm)
+    ignoreContext = True
+
+    mail_template = ViewPageTemplateFile('templates/sendto_template.pt')
+
+    # XXX: Add validation, but the plan is the fields should be
+    # changed to the Email field that is to be provided by
+    # plone schema
+
+    @button.buttonAndHandler(_(u'label_send', default='Send'),
+                             name='send')
+    def handle_send(self, action):
+        data, errors = self.extractData()
+        if errors:
+            IStatusMessage(self.request).addStatusMessage(
+                self.formErrorsMessage,
+                type=u'error'
+            )
+            return
+
+        portal_state = getMultiAdapter(
+            (self.context, self.request),
+            name=u'plone_portal_state'
+        )
+        site = portal_state.portal()
+
+        context_state = getMultiAdapter(
+            (self.context, self.request),
+            name=u'plone_context_state'
+        )
+        url = context_state.view_url()
+
+        send_from_address = data.get('send_from_address')
+        send_to_address = data.get('send_to_address')
+        subject = pretty_title_or_id(self, self.context)
+        title = pretty_title_or_id(self, self.context)
+        description = self.context.Description()
+        comment = data.get('comment', None)
+        envelope_from = site.getProperty('email_from_address', None)
+
+        try:
+            # Sends a link of a page to someone.
+            host = getUtility(IMailHost)
+            encoding = site.getProperty('email_charset')
+
+            if not envelope_from:
+                envelope_from = send_from_address
+
+            # Cook from template
+            message = self.mail_template(
+                self,
+                send_to_address=send_to_address,
+                send_from_address=send_from_address,
+                comment=comment,
+                subject=subject,
+                title=title,
+                description=description
+            )
+
+            message = message.encode(encoding)
+
+            host.send(
+                message,
+                mto=send_to_address,
+                mfrom=envelope_from,
+                subject=subject,
+                charset='utf-8'
+            )
+
+        except ConflictError:
+            raise
+        except Exception as e:
+            # TODO To many things could possibly go wrong. So we catch all.
+            logger.info("Unable to send mail: " + str(e))
+            IStatusMessage(self.request).addStatusMessage(
+                _(u'Unable to send mail.'),
+                type=u'error'
+            )
+            return
+
+        IStatusMessage(self.request).addStatusMessage(
+            _(u'Mail sent.'),
+            type=u'info'
+        )
+
+send_to_form = layout.wrap_form(SendToForm)
diff --git a/Products/CMFPlone/browser/templates/sendto_template.pt b/Products/CMFPlone/browser/templates/sendto_template.pt
new file mode 100644
index 0000000..a83e4d2
--- /dev/null
+++ b/Products/CMFPlone/browser/templates/sendto_template.pt
@@ -0,0 +1,30 @@
+<div xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+     xmlns:tal="http://xml.zope.org/namespaces/tal"
+     xmlns:metal="http://xml.zope.org/namespaces/metal"
+     xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+     i18n:domain="plone"
+     tal:omit-tag=""
+     tal:define="utool nocall:context/portal_url;
+                 charset context/email_charset|string:utf-8;
+                 dummy python:request.RESPONSE.setHeader('Content-Type', 'text/html;;charset=%s' % charset)"
+><div i18n:translate="sendto_mailtemplate_body" tal:omit-tag="">
+This link is sent to you from <span i18n:name="portal_url" tal:omit-tag="" tal:replace="structure utool" />
+
+You are receiving this mail because someone read a page at
+<span i18n:name="portal_title" tal:omit-tag="" tal:replace="structure utool/Title" />
+and thought it might interest you.
+
+It is sent by <span i18n:name="from_address" tal:omit-tag="" tal:replace="structure options/send_from_address"
+/> with the following comment:
+"<span i18n:name="comment" tal:omit-tag="" tal:replace="structure options/comment | nothing" />"
+
+<span i18n:name="document_title" tal:omit-tag="" tal:replace="structure options/title | context/Title" />
+
+<span i18n:name="document_description" tal:omit-tag="" tal:replace="structure options/description | context/Description" />
+
+<span i18n:name="document_url" tal:omit-tag="" tal:replace="structure options/url | context/absolute_url" />
+</div>
+--
+<span tal:replace="structure context/email_from_name" />
+
+</div>
diff --git a/Products/CMFPlone/profiles/default/rolemap.xml b/Products/CMFPlone/profiles/default/rolemap.xml
index ecde4b9..de9a084 100644
--- a/Products/CMFPlone/profiles/default/rolemap.xml
+++ b/Products/CMFPlone/profiles/default/rolemap.xml
@@ -38,7 +38,6 @@
       <role name="Contributor"/>
     </permission>
     <permission name="Allow sendto" acquire="True">
-      <role name="Anonymous"/>
       <role name="Manager"/>
       <role name="Site Administrator"/>
       <role name="Member"/>
diff --git a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy b/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy
deleted file mode 100644
index 7b8ae19..0000000
--- a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy
+++ /dev/null
@@ -1,58 +0,0 @@
-## Controller Python Script "sendto"
-##bind container=container
-##bind context=context
-##bind namespace=
-##bind script=script
-##bind state=state
-##bind subpath=traverse_subpath
-##parameters=
-##title=Send an URL to a friend
-
-REQUEST = context.REQUEST
-
-from Products.CMFPlone.utils import transaction_note
-from Products.CMFPlone.PloneTool import AllowSendto
-from Products.CMFCore.utils import getToolByName
-from Products.CMFPlone import PloneMessageFactory as _
-from ZODB.POSException import ConflictError
-
-plone_utils = getToolByName(context, 'plone_utils')
-mtool = getToolByName(context, 'portal_membership')
-site = getToolByName(context, 'portal_url').getPortalObject()
-pretty_title_or_id = plone_utils.pretty_title_or_id
-
-if not mtool.checkPermission(AllowSendto, context):
-    plone_utils.addPortalMessage(_(u'You are not allowed to send this link.'),
-                                 'error')
-    return state.set(status='failure')
-
-# Find the view action.
-context_state = context.restrictedTraverse("@@plone_context_state")
-url = context_state.view_url()
-
-variables = {'send_from_address' : REQUEST.send_from_address,
-             'send_to_address'   : REQUEST.send_to_address,
-             'subject'           : pretty_title_or_id(context),
-             'url'               : url,
-             'title'             : pretty_title_or_id(context),
-             'description'       : context.Description(),
-             'comment'           : REQUEST.get('comment', None),
-             'envelope_from'     : site.getProperty('email_from_address'),
-             }
-
-try:
-    plone_utils.sendto(**variables)
-except ConflictError:
-    raise
-except:  # TODO To many things could possibly go wrong. So we catch all.
-    exception = plone_utils.exceptionString()
-    message = _(u'Unable to send mail: ${exception}',
-                mapping={u'exception': exception})
-    plone_utils.addPortalMessage(message, 'error')
-    return state.set(status='failure')
-
-tmsg = 'Sent page %s to %s' % (url, REQUEST.send_to_address)
-transaction_note(tmsg)
-
-plone_utils.addPortalMessage(_(u'Mail sent.'))
-return state
diff --git a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata b/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata
deleted file mode 100644
index 80bb542..0000000
--- a/Products/CMFPlone/skins/plone_form_scripts/sendto.cpy.metadata
+++ /dev/null
@@ -1,6 +0,0 @@
-[validators]
-validators=validate_sendto
-
-[actions]
-action.success = redirect_to_action:string:view
-action.failure = redirect_to_action:string:view
diff --git a/Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy b/Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy
deleted file mode 100644
index f2f1fa0..0000000
--- a/Products/CMFPlone/skins/plone_form_scripts/validate_sendto.vpy
+++ /dev/null
@@ -1,39 +0,0 @@
-## Controller Script Python "validate_sendto"
-##bind container=container
-##bind context=context
-##bind namespace=
-##bind script=script
-##bind state=state
-##bind subpath=traverse_subpath
-##parameters=send_to_address='',send_from_address=''
-##title=validates the email adresses
-
-from Products.CMFPlone import PloneMessageFactory as _
-plone_utils=context.plone_utils
-
-if not send_to_address:
-    state.setError('send_to_address',
-                   _(u'Please submit an email address.'),
-                   'email_required')
-
-if not plone_utils.validateEmailAddresses(send_to_address):
-    state.setError('send_to_address',
-                   _(u'Please submit a valid email address.'),
-                   'email_required')
-
-if not send_from_address:
-    state.setError('send_from_address',
-                   _(u'Please submit an email address.'),
-                   'email_required')
-
-if not plone_utils.validateSingleEmailAddress(send_from_address):
-    state.setError('send_from_address',
-                   _(u'Please submit a valid email address.'),
-                   'email_required')
-
-if state.getErrors():
-    context.plone_utils.addPortalMessage(
-        _(u'Please correct the indicated errors.'), 'error')
-    return state.set(status='failure')
-else:
-    return state
diff --git a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt b/Products/CMFPlone/skins/plone_forms/sendto_form.cpt
deleted file mode 100644
index f4140eb..0000000
--- a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt
+++ /dev/null
@@ -1,126 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
-      xmlns:tal="http://xml.zope.org/namespaces/tal"
-      xmlns:metal="http://xml.zope.org/namespaces/metal"
-      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-      metal:use-macro="context/main_template/macros/master"
-      i18n:domain="plone">
-
-<metal:block fill-slot="top_slot"
-             tal:define="dummy python:request.set('disable_border',1)" />
-
-  <metal:head fill-slot="head_slot">
-    <meta name="robots" content="noindex,follow" />
-  </metal:head>
-
-  <body>
-
-    <metal:main fill-slot="main"
-         tal:define="errors options/state/getErrors;">
-
-      <h1 class="documentFirstHeading"
-          i18n:translate="heading_send_page_to">Send this page to someone</h1>
-
-      <div class="documentDescription"
-         i18n:translate="description_send_page_url_to">
-        Fill in the email address of your friend, and we will send an email
-        that contains a link to this page.
-      </div>
-
-      <div id="content-core">
-          <form name="sendto_form"
-                class="enableAutoFocus"
-                action="sendto_form"
-                method="post"
-                enctype="multipart/form-data"
-                tal:attributes="action string:${context/@@plone_context_state/object_url}/${template/getId}">
-
-            <fieldset>
-
-              <legend i18n:translate="legend_address_info">Address info</legend>
-
-              <div class="field"
-                   tal:define="error errors/send_to_address|nothing;"
-                   tal:attributes="class python:test(error, 'field error', 'field')">
-
-                <label for="send_to_address" i18n:translate="label_send_to_mail">Send to</label>
-
-                <span class="fieldRequired" title="Required"
-                      i18n:attributes="title title_required;"
-                      i18n:translate="label_required">(Required)</span>
-
-                      <div class="formHelp" i18n:translate="help_send_to_mail">
-                        The e-mail address to send this link to.
-                      </div>
-
-                      <div tal:content="error">Validation error output</div>
-
-                      <input type="text"
-                             id="send_to_address"
-                             name="send_to_address"
-                             size="25"
-                             tal:attributes="value request/send_to_address | nothing;"
-                             />
-              </div>
-
-              <div class="field"
-                   tal:define="error errors/send_from_address|nothing;"
-                   tal:attributes="class python:test(error, 'field error', 'field')">
-
-                <label for="send_from_address" i18n:translate="label_send_from">From</label>
-
-                <span class="fieldRequired" title="Required"
-                      i18n:attributes="title title_required;"
-                      i18n:translate="label_required">(Required)</span>
-
-                      <div class="formHelp" i18n:translate="help_send_from">
-                        Your email address.
-                      </div>
-
-                      <div tal:content="error">Validation error output</div>
-
-                      <input type="text"
-                             id="send_from_address"
-                             name="send_from_address"
-                             size="25"
-                             tal:define="member context/@@plone_portal_state/member;"
-                             tal:attributes="value python: request.get('send_from_address', member.getProperty('email',''));"
-                             />
-              </div>
-
-              <div class="field">
-                <label for="comment" i18n:translate="label_comment">Comment</label>
-
-                <div class="formHelp" i18n:translate="help_comment_to_link">
-                  A comment about this link.
-                </div>
-
-                <textarea cols="80"
-                          rows="5"
-                          id="comment"
-                          name="comment"
-                          tal:content="request/comment | nothing"
-                          >
-                  Comment
-                </textarea>
-              </div>
-
-              <div class="formControls">
-                <input class="context"
-                       type="submit"
-                       name="form.button.Send"
-                       value="Send"
-                       i18n:attributes="value label_send;"
-                       />
-              </div>
-
-              <input type="hidden" name="form.submitted" value="1" />
-
-            </fieldset>
-
-          </form>
-      </div>
-
-    </metal:main>
-
-  </body>
-</html>
diff --git a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata b/Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata
deleted file mode 100644
index 96d0516..0000000
--- a/Products/CMFPlone/skins/plone_forms/sendto_form.cpt.metadata
+++ /dev/null
@@ -1,9 +0,0 @@
-[default]
-title=Send this page to somebody
-
-[validators]
-validators=validate_sendto
-
-[actions]
-action.success=traverse_to:string:sendto
-action.failure=traverse_to:string:sendto_form
diff --git a/Products/CMFPlone/skins/plone_templates/sendto_template.pt b/Products/CMFPlone/skins/plone_templates/sendto_template.pt
deleted file mode 100644
index a83e4d2..0000000
--- a/Products/CMFPlone/skins/plone_templates/sendto_template.pt
+++ /dev/null
@@ -1,30 +0,0 @@
-<div xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
-     xmlns:tal="http://xml.zope.org/namespaces/tal"
-     xmlns:metal="http://xml.zope.org/namespaces/metal"
-     xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-     i18n:domain="plone"
-     tal:omit-tag=""
-     tal:define="utool nocall:context/portal_url;
-                 charset context/email_charset|string:utf-8;
-                 dummy python:request.RESPONSE.setHeader('Content-Type', 'text/html;;charset=%s' % charset)"
-><div i18n:translate="sendto_mailtemplate_body" tal:omit-tag="">
-This link is sent to you from <span i18n:name="portal_url" tal:omit-tag="" tal:replace="structure utool" />
-
-You are receiving this mail because someone read a page at
-<span i18n:name="portal_title" tal:omit-tag="" tal:replace="structure utool/Title" />
-and thought it might interest you.
-
-It is sent by <span i18n:name="from_address" tal:omit-tag="" tal:replace="structure options/send_from_address"
-/> with the following comment:
-"<span i18n:name="comment" tal:omit-tag="" tal:replace="structure options/comment | nothing" />"
-
-<span i18n:name="document_title" tal:omit-tag="" tal:replace="structure options/title | context/Title" />
-
-<span i18n:name="document_description" tal:omit-tag="" tal:replace="structure options/description | context/Description" />
-
-<span i18n:name="document_url" tal:omit-tag="" tal:replace="structure options/url | context/absolute_url" />
-</div>
---
-<span tal:replace="structure context/email_from_name" />
-
-</div>




-------------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CHANGES.log
Type: application/octet-stream
Size: 52114 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140217/3eb6456c/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 133051 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20140217/3eb6456c/attachment-0003.obj>


More information about the Testbot mailing list