Creating Content Types That Are Buyable, Shippable or Donations

by Michael Dunstan last modified Feb 23, 2009 09:30 PM
In addition to making existing content types buyable, donatable or shippable via the GetPaid setup screens and manually setting that on your content objects, content types can be programmatically set to be buyable. This HowTo provides information for developers to make their content type buyable by default.

Purpose

This document is intended for developers who are working with a particular content type that they want to integrate with GetPaid. For example, if you have a "Product" content type and want it to automatically be buyable in the site wherever it appears.

Prerequisities

You need to have GetPaid installed in your Plone instance where you are developing your content type.

Step by step

In addition to making existing content types buyable, donatable or shippable via the GetPaid setup screens (see creating-buyable-content.txt), content types can be specifically created to be of these types. The following example shows how to do this:

from Products.Archetypes.public import BaseContent,registerType
from Products.PloneGetPaid.interfaces import IBuyableMarker
from Products.PloneGetPaid.interfaces import IDonatableMarker
from Products.PloneGetPaid.interfaces import IShippableMarker
from zope.interface import implements

class MyBuyable(BaseContent):
   implements(IBuyableMarker)
registerType(MyBuyable)

class MyDonatable(BaseContent):
   implements(IBuyableMarker)
registerType(MyDonatable)

class MyShippable(BaseContent):
   implements(IBuyableMarker)
registerType(MyShippable)

Basic integration of a custom content type

A regular custom archetypes content type for books. There are a couple of fields of interest here - content/book.py::

    BookSchema = ...
        StringField(
            'ISBN',
            searchable=True,
            required=True,
            ),

        FloatField(
            'price',
            required=True,
            widget = DecimalWidget(
                label = u'Price',
                description = u'Book listing price in pounds',
                size = 8,
                ),
            ),
        ...


Now to wire this up with the getpaid core we need a bit of ZCML - getpaid/configure.zcml::

    <configure
       xmlns="http://namespaces.zope.org/zope"
       xmlns:five="http://namespaces.zope.org/five"
       >

      <five:implements
         class="..content.book.Book"
         interface="Products.PloneGetPaid.interfaces.IBuyableMarker"
         />

      <adapter
         for="..content.interfaces.IBook"
         provides="getpaid.core.interfaces.IBuyableContent"
         factory=".content.BuyableContentAdapter"
         />
    </configure>

The ``<five:implements>`` entry marks our custom content with the ``IBuyableMarker`` interface so that get paid core knows that books are buyable.

And the ``<adapter>`` entry registers an adaptor that getpaid core can use to extract relevant data from a book. Here is the implementation of that adaptor - getpaid/content.py::

    from zope.interface import implements
    from getpaid.core.interfaces import IBuyableContent

    class BuyableContentAdapter(object):

        implements(IBuyableContent)

        def __init__(self, context):
            self.context = context
            self.price = context.getPrice()
            self.product_code = context.getISBN()

 

Further information

In Products.PloneGetPaid see docs/developer for more documents.