**Creating Content Types That Are Buyable, Shippable or Donations** 

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.

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()


