Hi All,
As per:
http://www.plonegetpaid.com/updates/archive/2008/09/02/exciting-incoming-addition-to-getpaid-credits/view
I have been busy implementing a slightly different sort of use-case on top
of GetPaid for the last couple of weeks. The scenario is based around a site
where the site owner would like to charge the general public to run, eg,
user-submitted advertisements for a fixed period of time. Think 'classified
ads' or similar. The user is put in complete control of publishing their
content according to a policy (eg, the first one implemented is for
week-by-week publishing). The user pays for a 'week' of credit, and can then
consume those in publishing their own content for that period of time. Also
on the cards is month-by-month group membership, which could then give them
access to special roles etc for 'all you can eat publishing'.
The overall framework is a relatively big, semi-independent component/app in
its own right, but the payment portion of it is tied quite closely to
GetPaid, and the rest seems to me to tie in nicely to GetPaid as a whole, so
I've attached it in name and spirit to GetPaid for the moment ;)
There are three pieces that I have uploaded code for currently, all of them
relatively divorced from the nitty-gritty implementation details and
specifics of the use-case that birthed them:
1. getpaid.purchasablecredits -- This is just a very simple content type
with Title, Description, and Price that acts as a sort of 'meta-product'.
Its only purpose is to be a buyable type that you can put any details in
that you want.
2. getpaid.creditregistry -- This is a very basic registry tool to store
'credits'. The interface could very easily be implemented with
collective.lead in an RDBMS, but the package contains a simple
implementation of getpaid.creditregistry.interfaces.ICreditRegistry which
uses a Persistent utility in the ZODB and BTrees to store the purchased
credits and allow them to be added/removed.
3. getpaid.creditpublish -- This is where all the action is. A number of
different pieces all collaborate inside here to make everything hang
together:
1. Event handler that watches for purchases of content items providing
IOneWeekPublishedCredit and increments the counters in the
ICreditRegistry
utility appropriately
2. Portlet providing the mechanism for purchasing 'One Week
Publishing' credits. It gets the price and description of this from any
content item that implements IBuyableContent - when the portlet
is created
it asks for the UID of an item to use for Title/Description/Price - the
'representative object'
3. Adapter from the IOrder, ILineItem, and 'representative object' to
be able to add credit records into the ICreditRegistry utility
4. Portlet to allow users to publish/depublish
IOneWeekCreditPublishedContent content items (marked with ZCML).
5. schema extender for items marked with
IOneWeekCreditPublishedContent to provide some utility fields
(weeksLeftPublished, republishedReminderSent)
6. Event handler subscribed to
Products.TickingMachine.ITickEvent.ITickEvent: this handler provides the
de-publish/re-publish logic that drives the time-based
publishing. It runs
however often you have your ticking machine set, and runs a
catalog search
for IOneWeekCreditPublishedContent items that have expired or
are about to
expire and performs various policy logics on them (eg, re-publish for
another week if the user has requested that, de-publish if they
are out of
credit, etc)
The various portlets and subscribers are geared currently to the
IOneWeekCreditPublishedContent policy, but there is no reason other policies
can not be added and patterned off the existing one. In fact I intend to do
this for group membership.
Several dependencies are introduced by getpaid.creditpublish:
1. archetypes.schemaextender (self explanatory I hope)
2. cornerstone.browser (this is a great utility package for BrowserViews
and portlet Renderers to make form/session/cookie handling much nicer and
more standard)
3. TickingMachine (this one could be made redundant with a persistent
utility in the site root and then cron or ClockServer configured to just
call the method on the utility, but frankly, that is really just duplicating
what TickingMachine already does, and z3 style events are nice)
Of those three, cornerstone.browser is not yet egg-ified (I think) so it's
an svn checkout, and TickingMachine is an old-style product available via
tarball. I have these two both being fetched with my custom buildout and can
supply buildout steps if anyone needs help.
Known Issues:
1. There's no tests yet (that's why it's in the sandbox currently ;)
2. Probably there's cruft in various places in the packages as I have
spent the last week refactoring it all out to make it more generally usable
3. It's complicated and I haven't documented it yet, except in this email
:)
Good Stuff:
1. It works. A user can sign up to your site, purchase some credit,
create an IOneWeekCreditPublishedContent item, and get a portlet offering to
let them publish it for however many weeks they want. The only thing you
need to do is add a <five:implements ... /> statement to your ZCML marking
your content with
getpaid.creditpublish.interfaces.IOneWeekCreditPublishedContent, and tell
the Credit Publishing portlet which content item contains the price that
should be charged for 'one week of publishing'
2. It's egg-ified already (no pypi yet)
3. I intend to keep working on it as it is for a live and motivated
client
So that's it. The code is currently available at:
https://getpaid.googlecode.com/svn/sandbox/dixond/
I'd love any feedback, constructive criticism, svn commits ;), and most
importantly some sort of consensus as to whether this is something that
would be nice to have in the main GetPaid repository as a plugin.
many regards,
Darryl Dixon
Winterhouse Consulting Ltd
http://www.winterhouseconsulting.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"getpaid-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/getpaid-dev?hl=en
-~----------~----~----~----~------~----~------~--~---