plonewars.com

July 17th, 2007

Plone Conference 2007 Registration Opens

Registration is now open for Plone Conference 2007, to be held in Naples, Italy from 10th to 12th October.

Plone Conference 2007 Registration Opens

Originally from Most recent posts on plone – Quality Blog Search – Strategicboard by Plone News


from Yoda http://plonewars.com/2007/07/17/plone-conference-2007-registration-opens/







July 17th, 2007

Plone & Salesforce.com: Using Salesforce.com as a Content Catalog

For those craving a bit more of a hands on update than my earlier background post on making Plone play well with Salesforce.com provided, hopefully this takes a step in the right direction. I’m going to be demoing the display of Salesforce.com content within the portlet of a Plone site. Credit to Jesse for helping me realize how dirt simple this is. Writing the code to do this took less than 10 minutes and that included asking a colleague a few questions about how exactly Salesforce.com works :)

The Use Case

Recently, the Executive Director of ONE/Northwest, Gideon, sent an email to staff emphasizing the use of quotes as a way to increase our credibility by allowing partners to tell our story in new potential partner circles. Being a nonprofit, think of a trusted grants manager quoted in a proposal to a new foundation or a donor quoted in our annual report. This also includes a quote about a completed web project appearing in our technology solutions section or a scope of work.

Even though we’ve had a Quote content type in our oft-internally-used, but not widely publicized Pigeonhole product, I thought I’d try an alternate implementation, which I see as very much complimentary, rather than competitive. For us, it makes sense to have our quotes coupled with Salesforce.com contacts. In other cases the ease and speed of doing Plone catalog lookups for related Quotes based on keywords is superior, especially as implemented in Pigeonhole as a lightweight content relation engine.

So, my colleague Steve had done some behind the scenes Salesforce.com fiddling allowing for the addition of a quote that’s tied to a contact. I just added a new quote to my own contact record. See image below:

SF New Quote

But, how would we display this and other quotes in a portlet on a local copy of onenw.org

Beatbox Setup

If you’re reading this post, I’m assuming you’ve got a working Plone 2.5.x instance lying around, which means you’ve got Python 2.4 as well. You may even have EasyInstall. If not, start here. Once you’ve met the basic requirements,
you can install beatbox from the CheeseShop with:

easy_install-2.4 beatbox

Just to prove this is working, fire up the interactive Python used by your Plone instance and type:

>>> import beatbox

Salesforce Base Connector Setup

Next you need to get salesforcebaseconnector
from the Plone Collective (hopefully we’ll have a 1.0 alpha 1 release in the Plone Software Center
soon). Execute the following from your Zope instance’s Products folder:

svn co https://svn.plone.org/svn/collective/salesforcebaseconnector/trunk/ ./salesforcebaseconnector

Upon restarting Zope, head to the ZMI and the Plone site where you’d like to talk to the Salesforce.com API.

Add a Salesforce Base Connector:

Add Salesforce Base Connector

Select the radio button and hit “Add”

Add Salesforce Base Connector, Step 2

Click on your newly added portal_salesforcebaseconnector

Configure Salesforce Base Connector

Enter information for a valid Salesforce.com account. This could be a free developer account.

Configure Salesforce Base Connector, Step 2

The Code

I chose to do this in a Zope 3 view within the DIYPloneStyle-generated product,
ONENWSkin, we use at onenw.org, but as mentioned in the previous post, an explicit goal for salesforcebaseconnector was to enable
integrators to easily do the same in ZPT or a Python skin script that’s not necessarily filesystem-based.

After the obligatory ZCML wiring, I created a file, browser.py, at the root of my product. The following import statements and the
“RandomQuotePortletView” class were all that was necessary:

from Products import Fivefrom Products.CMFCore import utils as cmf_utilsimport random

class RandomQuotePortletView(Five.BrowserView):    """Find recent job listings for portlet display    """    def __init__(self, context, request):        Five.BrowserView.__init__(self, context, request)        self.sfbase = cmf_utils.getToolByName(self.context, 'portal_salesforcebaseconnector')

    def getRandomQuote(self):        """Returns a random quote from Salesforce.com in a dictionary        """        res = self.sfbase.query(['Name','Quote_Text__c'],'Quote__c',"Usage_Guidelines__c!='Need to get permission'")

        # res looks like a dictionary with a 'records' key        return random.choice(res['records'])

Of note, is the “query” method on our “portal_salesforcebaseconnector” object created at the site root in the setup above.
We pass the query method a list of which fields (’Name’ and ‘Quote_Text__c’ — The ‘__c’ convention signifies a custom field/object) we’d
like to retrieve. The second parameter is our desired SObject, the custom Quote object, and finally we have an additional where clause
which is based on our internal business rules of never showing any quotes where we don’t yet have permission.

That’s it! It’s basically 2 lines of code (that could be collapsed into 1) within the contents of the “getRandomQuote” method
and we’re able to retrieve any and everything we might ever want from our Salesforce.com account.

Finally, we setup the following portlet, which defines the view, calls “getRandomQuote” on the view, and then displays the quote text
for our randomly collected quote:

<html xmlns:tal="http://xml.zope.org/namespaces/tal"      xmlns:metal="http://xml.zope.org/namespaces/metal"      i18n:domain="plone"><body><div metal:define-macro="portlet"     tal:define="view context/@@random_quote_portlet;                 qDict view/getRandomQuote">

    <dl class="portlet" id="portlet-quote">

        <dt class="portletHeader">            <span class="portletTopLeft"></span>            Random Quote            <span class="portletTopRight"></span>        </dt>

        <dd class="portletItem odd">            <span tal:replace="qDict/Quote_Text__c" />        </dd>

        <dd class="portletFooter">            <a href=""               tal:attributes="href string:$portal_url/all-quotes"               >              More quotes&hellip;            </a>            <span class="portletBottomLeft"></span>            <span class="portletBottomRight"></span>        </dd>    </dl>

</div></body></html>

And after a few page reloads, to bypass the other quotes in our Salesforce.com instance, we see the following:

ONE/Northwest with Random Quote

Conclusion

While I only demoed the use of the “query” call to the Salesforce.com API, you can skim the methods of the SalesforceBaseConnector class or read up on the API via Salesforce.com’s APEX developer wiki for a better picture of what’s possible.  Note: Beatbox currently talks to the 7.0 version of the Salesforce.com API (several major version behind), so everything described in the docs may not be supported.

For my money, this piece of the Plone and Salesforce.com integration landscape is probably the most ready for prime-time right now, due to the relative feature-completeness of Salesforce Base Connector.  That is, if you ignore the lack of an official release :)

In the next few days, I plan to show off some work done to make PloneFormGen post directly to a Salesforce.com instance.
 

Plone & Salesforce.com: Using Salesforce.com as a Content Catalog

Originally from The Plone Blog by Andrew Burkhalter


from Yoda http://plonewars.com/2007/07/17/plone-salesforcecom-using-salesforcecom-as-a-content-catalog/







July 17th, 2007

Asheville Website Design and Development Totsie.com Studio

Asheville Website Design and Development Totsie.com Studio

Originally from del.icio.us/tag/plone by lauramaker


from Yoda http://plonewars.com/2007/07/17/asheville-website-design-and-development-totsiecom-studio/







July 17th, 2007

The Plone Blog: Plone & Salesforce.com: Using Salesforce.com as a Content Catalog

For those craving a bit more of a hands on update than my earlier background post on making Plone play well with Salesforce.com provided, hopefully this takes a step in the right direction. I’m going to be demoing the display of Salesforce.com content within the portlet of a Plone site. Credit to Jesse for helping me realize how dirt simple this is. Writing the code to do this took less than 10 minutes and that included asking a colleague a few questions about how exactly Salesforce.com works :)

The Use Case

Recently, the Executive Director of ONE/Northwest, Gideon, sent an email to staff emphasizing the use of quotes as a way to increase our credibility by allowing partners to tell our story in new potential partner circles. Being a nonprofit, think of a trusted grants manager quoted in a proposal to a new foundation or a donor quoted in our annual report. This also includes a quote about a completed web project appearing in our technology solutions section or a scope of work.

Even though we’ve had a Quote content type in our oft-internally-used, but not widely publicized Pigeonhole product, I thought I’d try an alternate implementation, which I see as very much complimentary, rather than competitive. For us, it makes sense to have our quotes coupled with Salesforce.com contacts. In other cases the ease and speed of doing Plone catalog lookups for related Quotes based on keywords is superior, especially as implemented in Pigeonhole as a lightweight content relation engine.

So, my colleague Steve had done some behind the scenes Salesforce.com fiddling allowing for the addition of a quote that’s tied to a contact. I just added a new quote to my own contact record. See image below:

SF New Quote

But, how would we display this and other quotes in a portlet on a local copy of onenw.org

Beatbox Setup

If you’re reading this post, I’m assuming you’ve got a working Plone 2.5.x instance lying around, which means you’ve got Python 2.4 as well. You may even have EasyInstall. If not, start here. Once you’ve met the basic requirements,
you can install beatbox from the CheeseShop with:

easy_install-2.4 beatbox

Just to prove this is working, fire up the interactive Python used by your Plone instance and type:

>>> import beatbox

Salesforce Base Connector Setup

Next you need to get salesforcebaseconnector
from the Plone Collective (hopefully we’ll have a 1.0 alpha 1 release in the Plone Software Center
soon). Execute the following from your Zope instance’s Products folder:

svn co https://svn.plone.org/svn/collective/salesforcebaseconnector/trunk/ ./salesforcebaseconnector

Upon restarting Zope, head to the ZMI and the Plone site where you’d like to talk to the Salesforce.com API.

Add a Salesforce Base Connector:

Add Salesforce Base Connector

Select the radio button and hit “Add”

Add Salesforce Base Connector, Step 2

Click on your newly added portal_salesforcebaseconnector

Configure Salesforce Base Connector

Enter information for a valid Salesforce.com account. This could be a free developer account.

Configure Salesforce Base Connector, Step 2

The Code

I chose to do this in a Zope 3 view within the DIYPloneStyle-generated product,
ONENWSkin, we use at onenw.org, but as mentioned in the previous post, an explicit goal for salesforcebaseconnector was to enable
integrators to easily do the same in ZPT or a Python skin script that’s not necessarily filesystem-based.

After the obligatory ZCML wiring, I created a file, browser.py, at the root of my product. The following import statements and the
“RandomQuotePortletView” class were all that was necessary:

from Products import Fivefrom Products.CMFCore import utils as cmf_utilsimport random

class RandomQuotePortletView(Five.BrowserView):    """Find recent job listings for portlet display    """    def __init__(self, context, request):        Five.BrowserView.__init__(self, context, request)        self.sfbase = cmf_utils.getToolByName(self.context, 'portal_salesforcebaseconnector')

    def getRandomQuote(self):        """Returns a random quote from Salesforce.com in a dictionary        """        res = self.sfbase.query(['Name','Quote_Text__c'],'Quote__c',"Usage_Guidelines__c!='Need to get permission'")

        # res looks like a dictionary with a 'records' key        return random.choice(res['records'])

Of note, is the “query” method on our “portal_salesforcebaseconnector” object created at the site root in the setup above.
We pass the query method a list of which fields (’Name’ and ‘Quote_Text__c’ — The ‘__c’ convention signifies a custom field/object) we’d
like to retrieve. The second parameter is our desired SObject, the custom Quote object, and finally we have an additional where clause
which is based on our internal business rules of never showing any quotes where we don’t yet have permission.

That’s it! It’s basically 2 lines of code (that could be collapsed into 1) within the contents of the “getRandomQuote” method
and we’re able to retrieve any and everything we might ever want from our Salesforce.com account.

Finally, we setup the following portlet, which defines the view, calls “getRandomQuote” on the view, and then displays the quote text
for our randomly collected quote:

<html xmlns:tal="http://xml.zope.org/namespaces/tal"      xmlns:metal="http://xml.zope.org/namespaces/metal"      i18n:domain="plone"><body><div metal:define-macro="portlet"     tal:define="view context/@@random_quote_portlet;                 qDict view/getRandomQuote">

    <dl class="portlet" id="portlet-quote">

        <dt class="portletHeader">            <span class="portletTopLeft"></span>            Random Quote            <span class="portletTopRight"></span>        </dt>

        <dd class="portletItem odd">            <span tal:replace="qDict/Quote_Text__c" />        </dd>

        <dd class="portletFooter">            <a href=""               tal:attributes="href string:$portal_url/all-quotes"               >              More quotes&hellip;            </a>            <span class="portletBottomLeft"></span>            <span class="portletBottomRight"></span>        </dd>    </dl>

</div></body></html>

And after a few page reloads, to bypass the other quotes in our Salesforce.com instance, we see the following:

ONE/Northwest with Random Quote

Conclusion

While I only demoed the use of the “query” call to the Salesforce.com API, you can skim the methods of the SalesforceBaseConnector class or read up on the API via Salesforce.com’s APEX developer wiki for a better picture of what’s possible.  Note: Beatbox currently talks to the 7.0 version of the Salesforce.com API (several major version behind), so everything described in the docs may not be supported.

For my money, this piece of the Plone and Salesforce.com integration landscape is probably the most ready for prime-time right now, due to the relative feature-completeness of Salesforce Base Connector.  That is, if you ignore the lack of an official release :)

In the next few days, I plan to show off some work done to make PloneFormGen post directly to a Salesforce.com instance.
 

The Plone Blog: Plone & Salesforce.com: Using Salesforce.com as a Content Catalog

Originally from Planet Plone by Andrew Burkhalter


from Yoda http://plonewars.com/2007/07/17/the-plone-blog-plone-salesforcecom-using-salesforcecom-as-a-content-catalog/







July 17th, 2007

Plone, Zope, Python Track at South American Regional Free Software conference

The Regional Free Software Conference takes place August 7-11 in Cordoba, Argentina … , as I like to call them :) community for showing such a strong presence of Plone and Zope in the region

Plone, Zope, Python Track at South American Regional Free Software conference

Originally from [Technorati] Tag results for plone


from Yoda http://plonewars.com/2007/07/17/plone-zope-python-track-at-south-american-regional-free-software-conference-3/







July 17th, 2007

The Plone Blog: Plone, Zope, Python Track at South American Regional Free Software conference

The Regional Free Software Conference takes place August 7-11 in Cordoba, Argentina.http://jornadas.grulic.org.ar/7/ The conference themes are Business, Society, and Technology. Plone had a strong showing, and has 12 sessions! Everything from Plone 3, PloneGov, to Plone performance and product development.  Check out the full pJRSL bannerrogram of Plone, Zope, and Python sessions.

Other interesting activities include Plone training (a site admin/content management one AND an intermediary developer training!). Also, a Plone sprint will happen on i18n of GetPaid for Plone.

Other interesting-sounding talks include the “Django vs Zope 3 deathmatch“, an appearance from Grok, and programming for One Laptop Per Child.

Congrats to the Plone Conosur (or Plonosur, as I like to call them :) community for showing such a strong presence of Plone and Zope in the region! I know several of the people involved in organizing the event (and used to live in Cordoba) and really look forward to participating at the event!

The Plone Blog: Plone, Zope, Python Track at South American Regional Free Software conference

Originally from Planet Plone by Christopher Johnson


from Yoda http://plonewars.com/2007/07/17/the-plone-blog-plone-zope-python-track-at-south-american-regional-free-software-conference/







July 17th, 2007

Plone, Zope, Python Track at South American Regional Free Software conference

The Regional Free Software Conference takes place August 7-11 in Cordoba, Argentina.http://jornadas.grulic.org.ar/7/ The conference themes are Business, Society, and Technology. Plone had a strong showing, and has 12 sessions! Everything from Plone 3, PloneGov, to Plone performance and product development.  Check out the full pJRSL bannerrogram of Plone, Zope, and Python sessions.

Other interesting activities include Plone training (a site admin/content management one AND an intermediary developer training!). Also, a Plone sprint will happen on i18n of GetPaid for Plone.

Other interesting-sounding talks include the “Django vs Zope 3 deathmatch“, an appearance from Grok, and programming for One Laptop Per Child.

Congrats to the Plone Conosur (or Plonosur, as I like to call them :) community for showing such a strong presence of Plone and Zope in the region! I know several of the people involved in organizing the event (and used to live in Cordoba) and really look forward to participating at the event!

Plone, Zope, Python Track at South American Regional Free Software conference

Originally from The Plone Blog by Christopher Johnson


from Yoda http://plonewars.com/2007/07/17/plone-zope-python-track-at-south-american-regional-free-software-conference-2/







July 17th, 2007

Plone, Zope, Python Track at South American Regional Free Software conference

The Regional Free Software Conference takes place August 7-11 in Cordoba, Argentina.http://jornadas.grulic.org.ar/7/ The conference themes are Business, Society, and Technology. Plone had a strong showing, and has 12 sessions! Everything from Plone 3, PloneGov, to Plone performance and product development.  Check out the full p[ JRSL banner]

Plone, Zope, Python Track at South American Regional Free Software conference

Originally from [Technorati] Tag results for plone


from Yoda http://plonewars.com/2007/07/17/plone-zope-python-track-at-south-american-regional-free-software-conference/







July 17th, 2007

Digital Web Magazine – IntraBranding: Why Your Intranet Needs Its Own Personality

Digital Web Magazine – IntraBranding: Why Your Intranet Needs Its Own Personality

Originally from del.icio.us/tag/plone by knmurphy


from Yoda http://plonewars.com/2007/07/17/digital-web-magazine-intrabranding-why-your-intranet-needs-its-own-personality/







July 17th, 2007

Varnish Supports Vary

If I understand this and this correctly, it means that Varnish now supports the Vary: header, which means that the last barrier to using this fast, easy-to-configure webserver proxy to front multi-lingual Plone sites should now be gone.

I also found a sample Plone/Zope config file for Varnish, contributed by Stig Sandbeck Mathisen. Cool!

According to Wichert, Plone.org is now using Varnish as its proxy.

Reading the tea leaves, it looks like a new generation of simpler, faster, easier-to-configure caching for Plone has arrived.  Hooray!

If you’ve had experience implementing Varnish for your Plone site, please share your stories.  I’m sure there are lots of folks who’d love to hear more.

Varnish Supports Vary

Originally from The Plone Blog by Jon Stahl


from Yoda http://plonewars.com/2007/07/17/varnish-supports-vary/