[silvatheme.renaissance][Emiliano D'Alterio] Added a pop-up cont...

[email protected] Wed, 25 Sep 2013 12:05:06 +0200
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Emiliano D'Alterio
date:      Wed Sep 25 12:04:54 2013 +0200
revision:  355:a3308ed9ace9 in silvatheme.renaissance
branch:    2.4
details:   https://hg.infrae.com/silvatheme.renaissance?cmd=changeset;node=a3308ed9ace9
modified:  src/silvatheme/renaissance/renaissance.py src/silvatheme/renaissance/renaissance_templates/header.cpt src/silvatheme/renaissance/renaissance_templates/layout.cpt src/silvatheme/renaissance/static/contact.css src/silvatheme/renaissance/static/js/contact.js
added:     src/silvatheme/renaissance/static/contact.css src/silvatheme/renaissance/static/js/contact.js
removed:   
log:       Added a pop-up contact form using zeam.form and Jquery.


diffstat:

 src/silvatheme/renaissance/renaissance.py                   |  72 ++++++++++++-
 src/silvatheme/renaissance/renaissance_templates/header.cpt |   3 +
 src/silvatheme/renaissance/renaissance_templates/layout.cpt |   3 +
 src/silvatheme/renaissance/static/contact.css               |  39 +++++++
 src/silvatheme/renaissance/static/js/contact.js             |  22 +++
 5 files changed, 137 insertions(+), 2 deletions(-)

diffs (206 lines):

diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/renaissance.py
--- a/src/silvatheme/renaissance/renaissance.py	Thu Jun 13 18:52:51 2013 +0200
+++ b/src/silvatheme/renaissance/renaissance.py	Wed Sep 25 12:04:54 2013 +0200
@@ -2,12 +2,20 @@
 # Copyright (c) 2002-2010 Infrae. All rights reserved.
 # $Id$
 
+from zeam.form import silva as silvaforms
+
+from zope import interface, schema
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+from z3c.schema.email import RFC822MailAddress
+
 from datetime import datetime
 from dateutil.relativedelta import relativedelta
 from five import grok
 
 from AccessControl import getSecurityManager
 
+from Products.Silva.mail import sendmail
+
 from zope.cachedescriptors.property import Lazy
 from zope.component import getUtility, queryMultiAdapter
 from zope.interface import Interface, alsoProvides
@@ -15,7 +23,7 @@
 
 from silva.core import conf as silvaconf
 from silva.core.interfaces import IContainer, IRoot, IFeedEntryProvider
-from silva.core.interfaces import IGhost
+from silva.core.interfaces import IGhost, IViewableObject
 from silva.core.layout.interfaces import ISilvaSkin
 from silva.core.layout.porto import porto
 from silva.core.layout.porto.interfaces import IPorto
@@ -43,6 +51,8 @@
     silvaconf.resource(jquery)
     silvaconf.resource('renaissance.css')
     silvaconf.resource('content.css')
+    silvaconf.resource('contact.css')
+    silvaconf.resource('js/contact.js')
 
 
 class IRenaissanceSkin(IRenaissance, ISilvaSkin):
@@ -206,7 +216,8 @@
             content = version.get_haunted()
             version = content.get_viewable()
         if version is not None:
-            details = queryMultiAdapter((version, self.request), IDocumentDetails)
+            details = queryMultiAdapter(
+                (version, self.request), IDocumentDetails)
             if details is not None:
                 return details.get_text()
         return None
@@ -302,3 +313,60 @@
     grok.template('favicon')
 
 
+## Choices available for the subject in the contact form
+subjects = SimpleVocabulary([
+    SimpleTerm(value='Support Request', token='support',
+               title=u'Professional Support'),
+    SimpleTerm(value='Training Request', token='training',
+               title=u'Technical Training'),
+    SimpleTerm(value='Question', token='question',
+               title=u'Ask us a question'),
+    SimpleTerm(value='Feedback', token='feedback',
+               title=u'Give us your feedback'), ])
+
+
+class IContactFormFields(interface.Interface):
+    """Fields present in the contact form.
+    """
+    name = schema.TextLine(
+        title=u'Full Name', required=True)
+    company = schema.TextLine(
+        title=u'Company', required=False)
+    email = RFC822MailAddress(
+        title=u'Email', required=True)
+    phone = schema.TextLine(
+        title=u'Phone', required=False)
+    subject = schema.Choice(
+        title=u'Message subject', source=subjects, required=False)
+    message = schema.Text(
+        title=u'Message', required=True)
+
+
+class ContactForm(silvaforms.PublicContentProviderForm):
+    """The contact form.
+    """
+    grok.name('contactform')
+    grok.context(IViewableObject)
+
+    label = u'Contact us'
+    description = u"""You can contact us using this form.
+                      Click outside this box to exit."""
+    fields = silvaforms.Fields(IContactFormFields)
+
+    @silvaforms.action(u"Send", identifier='contact', accesskey='c')
+    def contact(self):
+        data, errors = self.extractData()
+        if errors:
+            self.status = u'There are errors, please check again.'
+            return silvaforms.FAILURE
+
+        msg = u'%s\n\n %s\n %s\n %s\n' % (data['message'], data['name'],
+                                          data['phone'], data['company'])
+
+        sub = u'%s from %s' % (data['subject'], data['name'])
+
+        sendmail(self.context, msg, mto='[email protected]',
+                 mfrom=data['email'], subject=sub)
+
+        self.status = u'Thank you for interest.'
+        return silvaforms.SUCCESS
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/renaissance_templates/header.cpt
--- a/src/silvatheme/renaissance/renaissance_templates/header.cpt	Thu Jun 13 18:52:51 2013 +0200
+++ b/src/silvatheme/renaissance/renaissance_templates/header.cpt	Wed Sep 25 12:04:54 2013 +0200
@@ -23,6 +23,9 @@
         <a href="${layout.root_url}/search" title="Search the site"
            class="icon icon-search" id="searchtrigger">Search</a>
       </li>
+      <li>
+        <a href="#" class="show-contact-form">Contact Us</a>
+      </li>
     </ol>
   </nav>
   <form action="${layout.root_url}/search">
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/renaissance_templates/layout.cpt
--- a/src/silvatheme/renaissance/renaissance_templates/layout.cpt	Thu Jun 13 18:52:51 2013 +0200
+++ b/src/silvatheme/renaissance/renaissance_templates/layout.cpt	Wed Sep 25 12:04:54 2013 +0200
@@ -5,3 +5,6 @@
 <tal:forcenewline>
 </tal:forcenewline>
 <tal:footer tal:replace="structure provider:footer" />
+<tal:contactform>
+  <div id="contact-popup" tal:content="structure provider:contactform" style="display:none"></div>
+</tal:contactform>
\ No newline at end of file
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/static/contact.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/silvatheme/renaissance/static/contact.css	Wed Sep 25 12:04:54 2013 +0200
@@ -0,0 +1,39 @@
+    #masking-layer {
+        background: #000;
+        position: fixed;
+        left: 0;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        opacity: 0.8;
+        z-index: 999;
+        display: none;
+    }
+
+    #contact-popup {
+        color: #fff;
+        background: #333;
+        padding: 10px;
+        border: 2px solid #ddd;
+        float: left;
+        font-size: 1.2em;
+        position: fixed;
+        top: 50%;
+        left: 50%;
+        z-index: 99999;
+        -moz-box-shadow: 0 0 20px #999;
+        -webkit-box-shadow: 0 0 20px #999;
+        box-shadow: 0 0 20px #999;
+        -moz-border-radius: 3px;
+        -webkit-border-radius: 3px;
+        border-radius: 3px;
+        display: none;
+    }
+
+    #contact-popup h3{
+        color: #fff;
+    }
+
+    #contact-popup .field {
+        margin: 2px 0;
+    }
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/static/js/contact.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/silvatheme/renaissance/static/js/contact.js	Wed Sep 25 12:04:54 2013 +0200
@@ -0,0 +1,22 @@
+$(document).ready(function() {
+    var popup_margin_top = ($('#contact-popup').height() + 24) / 2;
+    var popup_margin_left = ($('#contact-popup').width() + 24) / 2;
+
+    $('#contact-popup').css('margin-top', -popup_margin_top);
+    $('#contact-popup').css('margin-left', -popup_margin_left);
+
+    $('a.show-contact-form').click(function(event) {
+        $('body').append('<div id="masking-layer"></div>');
+        $('#masking-layer').fadeIn('slow');
+
+        $('#contact-popup').fadeIn('slow');
+
+        event.preventDefault();
+    });
+
+    $('#masking-layer').live('click', function() {
+        $('#masking-layer, #contact-popup').fadeOut('fast' , function() {
+            $('#masking-layer').remove();
+        });
+    });
+});