<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-27136</id>
	<title>Nabble - GetPaid for Plone</title>
	<updated>2009-11-30T18:56:55Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/GetPaid-for-Plone-f27136.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/GetPaid-for-Plone-f27136.html" />
	<subtitle type="html">&lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;GetPaid&lt;/a&gt;&amp;nbsp;is a flexible framework for payment processing and commerce in &lt;a href=&quot;http://plone.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Plone&lt;/a&gt;. It is made using Zope 3 technologies and is meant to be extensible and flexible for your needs - yet useful out of the box for simple use cases. This product was created by leaders in the Plone community responding to a critical need for easy to use, flexible commerce tools that were appropriate for the tools available in Plone today.</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26585767</id>
	<title>Re: Currency Configuration</title>
	<published>2009-11-30T18:56:55Z</published>
	<updated>2009-11-30T18:56:55Z</updated>
	<author>
		<name>Christopher Johnson-7</name>
	</author>
	<content type="html">Sounds reasonable to me :D&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Mon, Nov 30, 2009 at 1:29 AM, Hannes Calitz &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hannesc@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
Hi Christopher&lt;br&gt;&lt;br&gt;Well, as the original configuration (that was half way written, but not implemented) only allowed for the symbol to be changed, I didn&amp;#39;t really look into multi-currency configurations. As mentioned before, this bit was never intended for currency conversion, but merely to assist in localization by allowing the currency symbol to change and set whether said symbol should be before or after the pricing values.&lt;br&gt;

&lt;br&gt;Hope this answers your questions. :)&lt;br&gt;&lt;br&gt;H&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;2009/11/30 Christopher Johnson &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;cjj.ifpeople@...&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;div&gt;
&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;h5&quot;&gt;&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
Hi Hannes,&lt;br&gt;&lt;br&gt;Great to hear about the simplified interface! Thanks for reporting back the progress.&lt;br&gt;&lt;br&gt;Have you thought about or looked into how the changes enable multi-currency sites to handle translations? Is there some awareness of the currency that the site would have to be able to convert? &lt;br&gt;


&lt;br&gt;Sounds like we are near needing to review and merge a bunch of branch work!&lt;br&gt;&lt;br&gt;-c&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Tue, Nov 24, 2009 at 4:57 AM, Hannes Calitz &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hannesc@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;


&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;Hey guys&lt;br&gt;&lt;br&gt;I have been working on getting the currency configuration working on GetPaid (&lt;a href=&quot;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&lt;/a&gt;). As some of you know (well those of you who were at PloneConf2009 anyway) this has been a thorn in my side for a while now. I am glad to say that I have got a branch going with currency configuration working 100%.&lt;br&gt;



&lt;br&gt;From the discussions at the PloneConf2009 Sprint, I found that there are basically only two options that are truly needed in the configuration. This allowed me to simplify the configuration considerably. I have removed all the options in the original interfaces.py except for the currency symbol. Well, seeing as the currency configuration was never fully implemented, you could say that this option was &amp;#39;added&amp;#39;. Once this was completely working, I added the ability to set whether the currency symbol should appear in front or behind the price. The template code is a bit messy, so if someone feels like cleaning that up, I would appreciate it.&lt;br&gt;



&lt;br&gt;I have tested the workings of it and everything seems to work fine. Because of the fact that I simplified the original interface so much, I don&amp;#39;t know if this should be merged with the trunk. I leave that up to the community.&lt;br&gt;



&lt;br&gt;On a side note, this is not meant to do conversion. It is merely to allow people from different countries to use their local currencies instead of the originally hard-coded $.&lt;br&gt;&lt;br&gt;Anyhow, any feedback will be greatly appreciated.&lt;br&gt;



&lt;br&gt;Thanks&lt;br&gt;Hannes&lt;br&gt;&lt;font color=&quot;#888888&quot;&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;



You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;ifPeople - Innovation for People&lt;br&gt;


&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;&lt;font color=&quot;#888888&quot;&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;


You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;h5&quot;&gt;&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;
ifPeople - Innovation for People&lt;br&gt;&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26585767&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Currency-Configuration-tp26493206p26585767.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26570129</id>
	<title>Re: Currency Configuration</title>
	<published>2009-11-29T22:29:53Z</published>
	<updated>2009-11-29T22:29:53Z</updated>
	<author>
		<name>Hannes Calitz</name>
	</author>
	<content type="html">Hi Christopher&lt;br&gt;&lt;br&gt;Well, as the original configuration (that was half way written, but not implemented) only allowed for the symbol to be changed, I didn&amp;#39;t really look into multi-currency configurations. As mentioned before, this bit was never intended for currency conversion, but merely to assist in localization by allowing the currency symbol to change and set whether said symbol should be before or after the pricing values.&lt;br&gt;
&lt;br&gt;Hope this answers your questions. :)&lt;br&gt;&lt;br&gt;H&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;2009/11/30 Christopher Johnson &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;cjj.ifpeople@...&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
Hi Hannes,&lt;br&gt;&lt;br&gt;Great to hear about the simplified interface! Thanks for reporting back the progress.&lt;br&gt;&lt;br&gt;Have you thought about or looked into how the changes enable multi-currency sites to handle translations? Is there some awareness of the currency that the site would have to be able to convert? &lt;br&gt;

&lt;br&gt;Sounds like we are near needing to review and merge a bunch of branch work!&lt;br&gt;&lt;br&gt;-c&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Tue, Nov 24, 2009 at 4:57 AM, Hannes Calitz &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hannesc@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;

&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;Hey guys&lt;br&gt;&lt;br&gt;I have been working on getting the currency configuration working on GetPaid (&lt;a href=&quot;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&lt;/a&gt;). As some of you know (well those of you who were at PloneConf2009 anyway) this has been a thorn in my side for a while now. I am glad to say that I have got a branch going with currency configuration working 100%.&lt;br&gt;


&lt;br&gt;From the discussions at the PloneConf2009 Sprint, I found that there are basically only two options that are truly needed in the configuration. This allowed me to simplify the configuration considerably. I have removed all the options in the original interfaces.py except for the currency symbol. Well, seeing as the currency configuration was never fully implemented, you could say that this option was &amp;#39;added&amp;#39;. Once this was completely working, I added the ability to set whether the currency symbol should appear in front or behind the price. The template code is a bit messy, so if someone feels like cleaning that up, I would appreciate it.&lt;br&gt;


&lt;br&gt;I have tested the workings of it and everything seems to work fine. Because of the fact that I simplified the original interface so much, I don&amp;#39;t know if this should be merged with the trunk. I leave that up to the community.&lt;br&gt;


&lt;br&gt;On a side note, this is not meant to do conversion. It is merely to allow people from different countries to use their local currencies instead of the originally hard-coded $.&lt;br&gt;&lt;br&gt;Anyhow, any feedback will be greatly appreciated.&lt;br&gt;


&lt;br&gt;Thanks&lt;br&gt;Hannes&lt;br&gt;&lt;font color=&quot;#888888&quot;&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;


You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;ifPeople - Innovation for People&lt;br&gt;

&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;&lt;font color=&quot;#888888&quot;&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26570129&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Currency-Configuration-tp26493206p26570129.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26569347</id>
	<title>Re: Currency Configuration</title>
	<published>2009-11-29T20:05:02Z</published>
	<updated>2009-11-29T20:05:02Z</updated>
	<author>
		<name>Christopher Johnson-7</name>
	</author>
	<content type="html">Hi Hannes,&lt;br&gt;&lt;br&gt;Great to hear about the simplified interface! Thanks for reporting back the progress.&lt;br&gt;&lt;br&gt;Have you thought about or looked into how the changes enable multi-currency sites to handle translations? Is there some awareness of the currency that the site would have to be able to convert? &lt;br&gt;
&lt;br&gt;Sounds like we are near needing to review and merge a bunch of branch work!&lt;br&gt;&lt;br&gt;-c&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Tue, Nov 24, 2009 at 4:57 AM, Hannes Calitz &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569347&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hannesc@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;
&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;Hey guys&lt;br&gt;&lt;br&gt;I have been working on getting the currency configuration working on GetPaid (&lt;a href=&quot;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&lt;/a&gt;). As some of you know (well those of you who were at PloneConf2009 anyway) this has been a thorn in my side for a while now. I am glad to say that I have got a branch going with currency configuration working 100%.&lt;br&gt;

&lt;br&gt;From the discussions at the PloneConf2009 Sprint, I found that there are basically only two options that are truly needed in the configuration. This allowed me to simplify the configuration considerably. I have removed all the options in the original interfaces.py except for the currency symbol. Well, seeing as the currency configuration was never fully implemented, you could say that this option was &amp;#39;added&amp;#39;. Once this was completely working, I added the ability to set whether the currency symbol should appear in front or behind the price. The template code is a bit messy, so if someone feels like cleaning that up, I would appreciate it.&lt;br&gt;

&lt;br&gt;I have tested the workings of it and everything seems to work fine. Because of the fact that I simplified the original interface so much, I don&amp;#39;t know if this should be merged with the trunk. I leave that up to the community.&lt;br&gt;

&lt;br&gt;On a side note, this is not meant to do conversion. It is merely to allow people from different countries to use their local currencies instead of the originally hard-coded $.&lt;br&gt;&lt;br&gt;Anyhow, any feedback will be greatly appreciated.&lt;br&gt;

&lt;br&gt;Thanks&lt;br&gt;Hannes&lt;br&gt;&lt;font color=&quot;#888888&quot;&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569347&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569347&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;ifPeople - Innovation for People&lt;br&gt;
&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569347&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26569347&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Currency-Configuration-tp26493206p26569347.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26562028</id>
	<title>A web ontology for the ecommerce</title>
	<published>2009-11-29T05:24:22Z</published>
	<updated>2009-11-29T05:24:22Z</updated>
	<author>
		<name>Enzo Cesanelli-3</name>
	</author>
	<content type="html">I would like to report &amp;quot;GoodRelations&amp;quot;, a standardized and free
&lt;br&gt;vocabulary/ontology for product, price, and company data.
&lt;br&gt;I hope it could be of some interest to the GetPaid community:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://www.heppnetz.de/projects/goodrelations/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.heppnetz.de/projects/goodrelations/&lt;/a&gt;&lt;br&gt;&lt;br&gt;And here you can find some import/export plugins for some cms/ecommerce
&lt;br&gt;systems...
&lt;br&gt;&lt;a href=&quot;http://www.ebusiness-unibw.org/wiki/GoodRelations#Applications&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.ebusiness-unibw.org/wiki/GoodRelations#Applications&lt;/a&gt;&lt;br&gt;&lt;br&gt;It would be nice to see something similar for GetPaid... and yes, I know hot
&lt;br&gt;open source works but until I can sponsor this kind of development, I guess
&lt;br&gt;that report that is better than nothing :)
&lt;br&gt;&lt;br&gt;Best regards,
&lt;br&gt;&amp;nbsp;Enzo Cesanelli
&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26562028&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26562028&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/A-web-ontology-for-the-ecommerce-tp26562028p26562028.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26493206</id>
	<title>Currency Configuration</title>
	<published>2009-11-24T01:57:01Z</published>
	<updated>2009-11-24T01:57:01Z</updated>
	<author>
		<name>Hannes Calitz</name>
	</author>
	<content type="html">Hey guys&lt;br&gt;&lt;br&gt;I have been working on getting the currency configuration working on GetPaid (&lt;a href=&quot;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/hannesc/trunk/&lt;/a&gt;). As some of you know (well those of you who were at PloneConf2009 anyway) this has been a thorn in my side for a while now. I am glad to say that I have got a branch going with currency configuration working 100%.&lt;br&gt;
&lt;br&gt;From the discussions at the PloneConf2009 Sprint, I found that there are basically only two options that are truly needed in the configuration. This allowed me to simplify the configuration considerably. I have removed all the options in the original interfaces.py except for the currency symbol. Well, seeing as the currency configuration was never fully implemented, you could say that this option was &amp;#39;added&amp;#39;. Once this was completely working, I added the ability to set whether the currency symbol should appear in front or behind the price. The template code is a bit messy, so if someone feels like cleaning that up, I would appreciate it.&lt;br&gt;
&lt;br&gt;I have tested the workings of it and everything seems to work fine. Because of the fact that I simplified the original interface so much, I don&amp;#39;t know if this should be merged with the trunk. I leave that up to the community.&lt;br&gt;
&lt;br&gt;On a side note, this is not meant to do conversion. It is merely to allow people from different countries to use their local currencies instead of the originally hard-coded $.&lt;br&gt;&lt;br&gt;Anyhow, any feedback will be greatly appreciated.&lt;br&gt;
&lt;br&gt;Thanks&lt;br&gt;Hannes&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26493206&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26493206&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Currency-Configuration-tp26493206p26493206.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26488768</id>
	<title>Re: Reviewed Brandon's work: some suggestions</title>
	<published>2009-11-23T16:45:15Z</published>
	<updated>2009-11-23T16:45:15Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">&amp;gt;
&lt;br&gt;&amp;gt; I'm just trying out multiplepaymentprocessors branch, which offsite
&lt;br&gt;&amp;gt; payment processors should I test with? Currently only see the onsite
&lt;br&gt;&amp;gt; nullpayment.
&lt;br&gt;&lt;br&gt;Currently there should be
&lt;br&gt;&lt;br&gt;* PayPal (not sure which branch was correct)
&lt;br&gt;&lt;br&gt;* Luottokunta (Finnish credit card processing)
&lt;br&gt;&lt;br&gt;* Verkkomaksut (Again, Finnish generic payment processor)
&lt;br&gt;&lt;br&gt;Also I think there is one special processor for making real purchases
&lt;br&gt;without doing the actual payment, for internal purchases of the store
&lt;br&gt;owner.
&lt;br&gt;&lt;br&gt;Cheers,
&lt;br&gt;-Mikko
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I am willing to help to merge multiplepaymentprocessor branch with
&lt;br&gt;&amp;gt;&amp;gt; brandon and brandon branch with trunk if
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; 1) Community &amp;quot;decision making process&amp;quot; sees this as a necessary
&lt;br&gt;&amp;gt;&amp;gt; requirement for the future
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; 2) There is someone else willing to put hours on the issue
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; +1
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; -Mikko
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Cheers,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  Marton
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;&amp;gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;&amp;gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26488768&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;&amp;gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26488768&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; For more options, visit this group at
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Mikko Ohtamaa
&lt;br&gt;Managing director, Red Innovation Ltd.
&lt;br&gt;+358 40 743 9707
&lt;br&gt;www.redinnovation.com
&lt;br&gt;Every problem is solvable if you can throw enough energy drinks at it
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26488768&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26488768&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Reviewed-Brandon%27s-work%3A-some-suggestions-tp26355777p26488768.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26487469</id>
	<title>Re: Reviewed Brandon's work: some suggestions</title>
	<published>2009-11-23T14:43:07Z</published>
	<updated>2009-11-23T14:43:07Z</updated>
	<author>
		<name>Marton Schimcsig</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;On Nov 15, 2:59 am, Moo &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26487469&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mi...@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I just went through Brandon's work. Looks nice to me, though there are
&lt;br&gt;&amp;gt; some show stopping issues.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The offsite payment processor interface was empty. It is very
&lt;br&gt;&amp;gt; difficult for third parties to implement payment processor unless
&lt;br&gt;&amp;gt; interfaces are documented with the required precision.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; If I read the core correctly there can be just one on-site payment
&lt;br&gt;&amp;gt; processor. Also, the wizard step to choose payment processor is
&lt;br&gt;&amp;gt; missing.
&lt;/div&gt;&lt;br&gt;&lt;br&gt;The wizard step is not needed here.
&lt;br&gt;The checkout process should be done with as few click from the buyer
&lt;br&gt;as possible. This is important point for the shop owners.
&lt;br&gt;With paypal standard, you get a checkout button from the payment
&lt;br&gt;provider and put it on your site anywhere, allowing the customer the
&lt;br&gt;start the payment immediately. Later the payment processor can be
&lt;br&gt;asked and/or will notify the shop about the transaction.
&lt;br&gt;&lt;br&gt;With paypal express checkout, you have to ask the paypal server for a
&lt;br&gt;token, before you can generate the checkout button, so the extra step
&lt;br&gt;in checkout process after selecting paypal is needed.
&lt;br&gt;The current paypal module in trunk works with paypal standard.
&lt;br&gt;&lt;br&gt;&amp;gt; As is, this work is useless for many use cases, like
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; * Having a wire payment processor
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; * Choose between credit card and wire payment
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; * Choose between different on-sites processors (imagine different
&lt;br&gt;&amp;gt; processor for different credit cards)
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;In Brandon's branch you can use offsite processors and onsite
&lt;br&gt;processor together, the buyer can choose between them during the
&lt;br&gt;checkout.
&lt;br&gt;However the offsite button rendering is done with black magic, a
&lt;br&gt;refactoring would be nice.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt; What's the status of the future of Brandon's work? In
&lt;br&gt;&amp;gt; multiplepaymentprocessor support for these use cases exist.
&lt;br&gt;&lt;br&gt;&lt;br&gt;I'm just trying out multiplepaymentprocessors branch, which offsite
&lt;br&gt;payment processors should I test with? Currently only see the onsite
&lt;br&gt;nullpayment.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt; I am willing to help to merge multiplepaymentprocessor branch with
&lt;br&gt;&amp;gt; brandon and brandon branch with trunk if
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 1) Community &amp;quot;decision making process&amp;quot; sees this as a necessary
&lt;br&gt;&amp;gt; requirement for the future
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 2) There is someone else willing to put hours on the issue
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;+1
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt; -Mikko
&lt;br&gt;&lt;br&gt;Cheers,
&lt;br&gt;&lt;br&gt;&amp;nbsp;Marton
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26487469&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26487469&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Reviewed-Brandon%27s-work%3A-some-suggestions-tp26355777p26487469.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26382321</id>
	<title>Re: Reviewed Brandon's work: some suggestions</title>
	<published>2009-11-16T16:19:33Z</published>
	<updated>2009-11-16T16:19:33Z</updated>
	<author>
		<name>Christopher Johnson-7</name>
	</author>
	<content type="html">Hi Mikko,&lt;br&gt;&lt;br&gt;Thanks for helping us understand the differences between the multisite branch and the no overrides branch. My understanding is we really just need some more feedback on how it is set up, feedback on how clear the documentation for creating a payment processor is, and the design that was used. We&amp;#39;ve had little other testing that I know of, so thanks for your comments. I&amp;#39;m testing on a site with one onsite and one offsite. We have implemented 2 processors with the offsite interfaces based on Brandon&amp;#39;s branch (NMI and &lt;a href=&quot;http://authorize.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;authorize.net&lt;/a&gt;). &lt;br&gt;
&lt;br&gt;In discussing the use cases, we didn&amp;#39;t know of any that would require multiple onsite payment processors. In my experience, the kinds of providers that let you do onsite usually involve a monthly fee, so site owners are unlikely to subscribe to more than one (cheaper to pay one to add a particular credit card service, like American Express or Discover, than to have an entire different service). However, I see how this could raise an issue if a Purchase Order or Bank Order implementation is made using the same infrastructure. It would probably behave like an onsite processor, and then it may not be possible for a merchant to have both a onsite payment and offline payment. &lt;br&gt;
&lt;br&gt;Hopefully what is there can be modified to account for this potential use case. Also, the button alignment needs some work on the cart screen and portlet :)&lt;br&gt;&lt;br&gt;-chris&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Sun, Nov 15, 2009 at 6:24 AM, Moo &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26382321&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mikko@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;
&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;More issues:&lt;br&gt;
&lt;br&gt;
One cannot present paymeny processor options as a schema reference&lt;br&gt;
(options_interface). They payment processor must be able to customize&lt;br&gt;
its own form view as zope.schema cannot be used to express all form&lt;br&gt;
use cases (custom widgets and so on...).&lt;br&gt;
&lt;br&gt;
-Mikko&lt;br&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;h5&quot;&gt;&lt;br&gt;
&amp;gt; I just went through Brandon&amp;#39;s work. Looks nice to me, though there are&lt;br&gt;
&amp;gt; some show stopping issues.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; The offsite payment processor interface was empty. It is very&lt;br&gt;
&amp;gt; difficult for third parties to implement payment processor unless&lt;br&gt;
&amp;gt; interfaces are documented with the required precision.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; If I read the core correctly there can be just one on-site payment&lt;br&gt;
&amp;gt; processor. Also, the wizard step to choose payment processor is&lt;br&gt;
&amp;gt; missing.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; As is, this work is useless for many use cases, like&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; * Having a wire payment processor&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; * Choose between credit card and wire payment&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; * Choose between different on-sites processors (imagine different&lt;br&gt;
&amp;gt; processor for different credit cards)&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; What&amp;#39;s the status of the future of Brandon&amp;#39;s work? In&lt;br&gt;
&amp;gt; multiplepaymentprocessor support for these use cases exist.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I am willing to help to merge multiplepaymentprocessor branch with&lt;br&gt;
&amp;gt; brandon and brandon branch with trunk if&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; 1) Community &amp;quot;decision making process&amp;quot; sees this as a necessary&lt;br&gt;
&amp;gt; requirement for the future&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; 2) There is someone else willing to put hours on the issue&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; -Mikko&lt;br&gt;
&lt;br&gt;
--&lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26382321&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26382321&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;
ifPeople - Innovation for People&lt;br&gt;&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26382321&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26382321&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Reviewed-Brandon%27s-work%3A-some-suggestions-tp26355777p26382321.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26379755</id>
	<title>Re: The future of GetPaid?</title>
	<published>2009-11-16T13:25:20Z</published>
	<updated>2009-11-16T13:25:20Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">Hi,&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;&lt;br&gt;Thanks for sharing your notes after the conference and sprint. Certainly some of the points you mention are an accurate description of the current state of GetPaid (ie there is no product manager now), but I think your characterization of GetPaid&amp;#39;s viable underestimates both the product and the people in the community and I wanted to respond and provide some of the information that was shared in the conference presentation as well. &lt;br&gt;
&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Thanks for very good response Chris. I hope I was not over-critical with some of my points, I must some I love getpaid very much though feeling the frustration now and then, like many of us do. It&amp;#39;s almost there that you could use it for Plone commercing needs, but it gives some problems which would be solved if you used external shopping system. I was hoping that my email would inspire some discussion so people, even ones who didn&amp;#39;t go to conference, could see that the train is still going :)&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;&lt;br&gt;There are several sites that have been launched with GetPaid already. About two dozen are listed at &lt;a href=&quot;http://www.plonegetpaid.com/why/sites-using-getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com/why/sites-using-getpaid&lt;/a&gt; .  Some are just &amp;quot;out of the box&amp;quot; GetPaid and work well for the client as is, some are customized (and many of the docs about how to achieve the customizations shown are linked to in the presentation I gave at the ploneconf2009: &lt;a href=&quot;http://snurl.com/getpaid-slides&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://snurl.com/getpaid-slides&lt;/a&gt; ). &lt;/blockquote&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I think the barrier comes when you need to have some &amp;quot;deeper&amp;quot; customizations. Like having a new field on Order. You basically need to go to hand-edit getpaid.core or override various, various, adapters and templates. Which makes it difficult as it is not very clear how things are connected. Getpaid architecture, nice as it is, tries very hard to keep &amp;quot;architecture&amp;quot; (getpaid.core) and &amp;quot;implementation&amp;quot; (Products.PloneGetPaid) separate from each other. For example, payment processor contain both architectural and UI drop ins. The problem comes with latter when people create plug-ins which need to use overrides.zcml to get things done. However these problems are just technical, and they can be solved when community knows what they are aiming at and have time do the work. This issue has been already discussed partially with&amp;#39;s Brandon&amp;#39;s work on payment processors.&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;&lt;br&gt;Regarding people who are playing roles to maintain the product, GetPaid has gone through a period of activity and evolution, several releases. Unfortunately, I left some of this story out of the presentation in Budapest. Perrito (Horacio Duran) has managed a release (0.6.2, I believe) and Lucie at SIx Feet Up has managed releases over the 0.7 series of PloneGetPaid, and David Glick from Groundwire has been involved since ~0.8. These are all people in the Plone community who are/were involved over a period when they were using GetPaid and were working to make it better for their needs. I&amp;#39;m hoping that is what we are starting again as a community. &lt;br&gt;
&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Great :) The problem is that no one really knows when to commit trunk. Lots of patches end up being in the bug reports and email attachment (like the late issues with inter-database references), when there is no a single point of contact who would help to maintain the trunk. As already discussed, some nice ideas come up.&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;The project is now in a period where we need new people with interest in ecommerce in Plone to step up and lead in various aspects of the project. That&amp;#39;s an invitation I extended during the presentation at the conference. There are &amp;gt;several people interested in getting the remaining needed functionalities (downloadable files, premium content, others), and the model we took in organizing this project originally (see Social Sourcing presentation, &amp;gt;&lt;a href=&quot;http://www.ifpeople.net/solutions/social-sourcing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net/solutions/social-sourcing&lt;/a&gt; ) was about getting people involved upfront in a round of changes. So yes, as you point out, there was an original architect who is no longer active in the project. But, of the other sponsors, &amp;gt;supporters and contributors at the very outset of the project, about 3/4 are still involved in the project in one way or another, which gives us a solid basis of community around GetPaid. Now it&amp;#39;s time to get the community involved in &amp;gt;actively shaping the future again. &lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Here we are!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Cheers,&lt;/div&gt;&lt;div&gt; Mikko&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379755&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379755&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/The-future-of-GetPaid--tp26355889p26379755.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26379381</id>
	<title>Re: The future of GetPaid?</title>
	<published>2009-11-16T13:00:12Z</published>
	<updated>2009-11-16T13:00:12Z</updated>
	<author>
		<name>Matt Halstead-3</name>
	</author>
	<content type="html">I agree with Chris here. I would see the following would help:
&lt;br&gt;&lt;br&gt;- some life breathed into &lt;a href=&quot;http://plone.org/products/getpaid/roadmap&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://plone.org/products/getpaid/roadmap&lt;/a&gt;&lt;br&gt;... there are many features and core fixes that people are
&lt;br&gt;contributing to, it would be useful to list these and bring them
&lt;br&gt;together as proposals that could be discussed and timelined
&lt;br&gt;&lt;br&gt;- a set of rotating release managers, with each release manager
&lt;br&gt;delegating responsibility for certain proposals in the timeline which
&lt;br&gt;are coming up for release and ensuring the release goes ahead.
&lt;br&gt;&lt;br&gt;- it is quite difficult to get a sense of what testing is required
&lt;br&gt;when a new feature or fix is added and I think this may stop a lot of
&lt;br&gt;individuals contributing to the code where their local need requires
&lt;br&gt;some changes. The number of combinations of getpaid packages and plone
&lt;br&gt;versions is quite high (I'm including all the different payment
&lt;br&gt;processors in there) and it feels like quite a large task to test
&lt;br&gt;these in relation to a change that you want to make. It would be nice
&lt;br&gt;to have a recipe and some kind of delegation for testing too. I would
&lt;br&gt;like to at least see each payment processor having a 'current' owner
&lt;br&gt;whose responsibility it is to test their processor for a given release
&lt;br&gt;candidate.
&lt;br&gt;&lt;br&gt;One of the most difficult aspects of helping to maintain this code is
&lt;br&gt;that as a developer you are seldom using it each day (unlike core
&lt;br&gt;plone components and addons that you rely on for perhaps most of your
&lt;br&gt;site's function). So contribution seems to be adhoc on a need to fix
&lt;br&gt;something basis, which makes momentum difficult to maintain. Finding
&lt;br&gt;some funding to maintain some continued part-time contribution for a
&lt;br&gt;number of people (which could rotate over time) would probably help. I
&lt;br&gt;don't think many people would have to contribute much per month for
&lt;br&gt;the right momentum to be achieved.
&lt;br&gt;&lt;br&gt;cheers
&lt;br&gt;Matt
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Nov 17, 7:32 am, Christopher Johnson &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;cjj.ifpeo...@...&lt;/a&gt;&amp;gt;
&lt;br&gt;wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi Mikko,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thanks for sharing your notes after the conference and sprint. Certainly
&lt;br&gt;&amp;gt; some of the points you mention are an accurate description of the current
&lt;br&gt;&amp;gt; state of GetPaid (ie there is no product manager now), but I think your
&lt;br&gt;&amp;gt; characterization of GetPaid's viable underestimates both the product and the
&lt;br&gt;&amp;gt; people in the community and I wanted to respond and provide some of the
&lt;br&gt;&amp;gt; information that was shared in the conference presentation as well.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; One thing to clarify though about the purpose of the project - GetPaid isn't
&lt;br&gt;&amp;gt; meant to attract ecommerce people to using Plone. It's meant to keep people
&lt;br&gt;&amp;gt; from leaving Plone because they have ecommerce needs. This was what drove
&lt;br&gt;&amp;gt; the origin of the project and I think today is still relevant. If people
&lt;br&gt;&amp;gt; want only ecommerce and don't care about all the power Plone brings, there's
&lt;br&gt;&amp;gt; little reason they should use GetPaid.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The architecture does have a fairly high barrier to entry for developers. In
&lt;br&gt;&amp;gt; part, because it was created as a zope3 product in the very early days of
&lt;br&gt;&amp;gt; zope3 products for Plone. So a python programmer with no Plone knowledge
&lt;br&gt;&amp;gt; will have to ramp up on some technologies before being able to customize it.
&lt;br&gt;&amp;gt; I think this can be said about Plone in general these days also.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; But, that depends on how you want to customize it...there are many things
&lt;br&gt;&amp;gt; that are fairly straight forward to do. If that weren't the case, we
&lt;br&gt;&amp;gt; wouldn't have had such huge growth in add ons for the product and payment
&lt;br&gt;&amp;gt; processors over the last year (over twice as much code overall and over
&lt;br&gt;&amp;gt; twice as many payment processors). And most of the time, that's what someone
&lt;br&gt;&amp;gt; implementing a site needs to do.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; There are several sites that have been launched with GetPaid already. About
&lt;br&gt;&amp;gt; two dozen are listed athttp://www.plonegetpaid.com/why/sites-using-getpaid.  Some are just
&lt;br&gt;&amp;gt; &amp;quot;out of the box&amp;quot; GetPaid and work well for the client as
&lt;br&gt;&amp;gt; is, some are customized (and many of the docs about how to achieve the
&lt;br&gt;&amp;gt; customizations shown are linked to in the presentation I gave at the
&lt;br&gt;&amp;gt; ploneconf2009:&lt;a href=&quot;http://snurl.com/getpaid-slides&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://snurl.com/getpaid-slides&lt;/a&gt;).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Regarding people who are playing roles to maintain the product, GetPaid has
&lt;br&gt;&amp;gt; gone through a period of activity and evolution, several releases.
&lt;br&gt;&amp;gt; Unfortunately, I left some of this story out of the presentation in
&lt;br&gt;&amp;gt; Budapest. Perrito (Horacio Duran) has managed a release (0.6.2, I believe)
&lt;br&gt;&amp;gt; and Lucie at SIx Feet Up has managed releases over the 0.7 series of
&lt;br&gt;&amp;gt; PloneGetPaid, and David Glick from Groundwire has been involved since ~0.8.
&lt;br&gt;&amp;gt; These are all people in the Plone community who are/were involved over a
&lt;br&gt;&amp;gt; period when they were using GetPaid and were working to make it better for
&lt;br&gt;&amp;gt; their needs. I'm hoping that is what we are starting again as a community.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The project is now in a period where we need new people with interest in
&lt;br&gt;&amp;gt; ecommerce in Plone to step up and lead in various aspects of the project.
&lt;br&gt;&amp;gt; That's an invitation I extended during the presentation at the conference.
&lt;br&gt;&amp;gt; There are several people interested in getting the remaining needed
&lt;br&gt;&amp;gt; functionalities (downloadable files, premium content, others), and the model
&lt;br&gt;&amp;gt; we took in organizing this project originally (see Social Sourcing
&lt;br&gt;&amp;gt; presentation,www.ifpeople.net/solutions/social-sourcing) was about getting
&lt;br&gt;&amp;gt; people involved upfront in a round of changes. So yes, as you point out,
&lt;br&gt;&amp;gt; there was an original architect who is no longer active in the project. But,
&lt;br&gt;&amp;gt; of the other sponsors, supporters and contributors at the very outset of the
&lt;br&gt;&amp;gt; project, about 3/4 are still involved in the project in one way or another,
&lt;br&gt;&amp;gt; which gives us a solid basis of community around GetPaid. Now it's time to
&lt;br&gt;&amp;gt; get the community involved in actively shaping the future again.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; In doing this, I'm willing to help transfer knowledge I have about the
&lt;br&gt;&amp;gt; product to those who want to take a role in the community. Also, I think it
&lt;br&gt;&amp;gt; would be great to have a collaborative design process at this point, as we
&lt;br&gt;&amp;gt; did originally, so the new people involved in GetPaid can shape where the
&lt;br&gt;&amp;gt; product is going. I'm willing to help those involved in this also, and if
&lt;br&gt;&amp;gt; needed, to raise additional funds for the buildout of features/refactoring
&lt;br&gt;&amp;gt; for GetPaid.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; With the knowledge of our community, we should be able to unlock the good
&lt;br&gt;&amp;gt; stuff in GetPaid and make it much more accessible for those using the
&lt;br&gt;&amp;gt; system.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Best wishes,
&lt;br&gt;&amp;gt; Chris
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Sat, Nov 14, 2009 at 9:18 PM, Moo &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mi...@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; I participated the GetPaid sprint in Budapest. There were some worries
&lt;br&gt;&amp;gt; &amp;gt; among the participants for which I have ginve thoughts afterwards.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Many people would love to use GetPaid for creating shops, but it won't
&lt;br&gt;&amp;gt; &amp;gt; do it.
&lt;br&gt;&amp;gt; &amp;gt; Currently there are huge gaps within the code (payment processors,
&lt;br&gt;&amp;gt; &amp;gt; taxes, variant items, architecture limitations) which are necessities
&lt;br&gt;&amp;gt; &amp;gt; for a basic shop functionality. If you want to use GetPaid, be
&lt;br&gt;&amp;gt; &amp;gt; prepared to spent countless of hours writing everything from scratch
&lt;br&gt;&amp;gt; &amp;gt; and &amp;quot;fight against the framework&amp;quot;.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Until we have a solid working shop platform I suggest not mentioning
&lt;br&gt;&amp;gt; &amp;gt; &amp;quot;shop&amp;quot; onwww.plonegetpaid.comand actually tell the people to seek
&lt;br&gt;&amp;gt; &amp;gt; help from Python shopping products.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Also, GetPaid future does not look very bright. Since the orignal work
&lt;br&gt;&amp;gt; &amp;gt; was sponsored, the orignal authors have not been very activate with
&lt;br&gt;&amp;gt; &amp;gt; the community. With the current state of the code it is hard to get
&lt;br&gt;&amp;gt; &amp;gt; anything done unless you have years of Plone experience. Most users
&lt;br&gt;&amp;gt; &amp;gt; who would like to use or develop GetPaid don't necessarily have this.
&lt;br&gt;&amp;gt; &amp;gt; They might try and get frustrated after couple of hours.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; There is also lack of release manager or trunk maintainer. There is no
&lt;br&gt;&amp;gt; &amp;gt; one &amp;quot;in control&amp;quot; and people may or may not commit something into
&lt;br&gt;&amp;gt; &amp;gt; trunk. The vision and active maintenance is missing. There is no
&lt;br&gt;&amp;gt; &amp;gt; roadmap. There is no committed maintainers. This kind of organization
&lt;br&gt;&amp;gt; &amp;gt; may fit for small static components like most of those in Plone
&lt;br&gt;&amp;gt; &amp;gt; collective, but it definite doesn't seem to work with GetPaid.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; So, should people looking for shopping products abandon GetPaid in
&lt;br&gt;&amp;gt; &amp;gt; favour of other solutions? There is so much good work in GetPaid, but
&lt;br&gt;&amp;gt; &amp;gt; it is so hard to get anything out of it.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; -Mikko
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; --
&lt;br&gt;&amp;gt; &amp;gt; GetPaid for Plone:&lt;a href=&quot;http://www.plonegetpaid.com(overview&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com(overview&lt;/a&gt;&amp;nbsp;info) |
&lt;br&gt;&amp;gt; &amp;gt;&lt;a href=&quot;http://code.google.com/p/getpaid(code&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid(code&lt;/a&gt;&amp;nbsp;and issue tracker)
&lt;br&gt;&amp;gt; &amp;gt; You received this message because you are subscribed to the Google Groups
&lt;br&gt;&amp;gt; &amp;gt; &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;&amp;gt; &amp;gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &amp;gt; To unsubscribe from this group, send email to
&lt;br&gt;&amp;gt; &amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; For more options, visit this group at
&lt;br&gt;&amp;gt; &amp;gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --
&lt;br&gt;&amp;gt; Cofounder and CEO
&lt;br&gt;&amp;gt; ifPeople - Innovation for Peoplewww.ifpeople.net
&lt;br&gt;&amp;gt; t: 678-608-3408
&lt;br&gt;&amp;gt; 130 Boulevard NE, #6
&lt;br&gt;&amp;gt; Atlanta, GA 30312
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26379381&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/The-future-of-GetPaid--tp26355889p26379381.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26377071</id>
	<title>Re: The future of GetPaid?</title>
	<published>2009-11-16T10:32:56Z</published>
	<updated>2009-11-16T10:32:56Z</updated>
	<author>
		<name>Christopher Johnson-7</name>
	</author>
	<content type="html">Hi Mikko,&lt;br&gt;&lt;br&gt;Thanks for sharing your notes after the conference and sprint. Certainly some of the points you mention are an accurate description of the current state of GetPaid (ie there is no product manager now), but I think your characterization of GetPaid&amp;#39;s viable underestimates both the product and the people in the community and I wanted to respond and provide some of the information that was shared in the conference presentation as well. &lt;br&gt;
&lt;br&gt;One thing to clarify though about the purpose of the project - GetPaid isn&amp;#39;t meant to attract ecommerce people to using Plone. It&amp;#39;s meant to keep people from leaving Plone because they have ecommerce needs. This was what drove the origin of the project and I think today is still relevant. If people want only ecommerce and don&amp;#39;t care about all the power Plone brings, there&amp;#39;s little reason they should use GetPaid. &lt;br&gt;
&lt;br&gt;The architecture does have a fairly high barrier to entry for developers. In part, because it was created as a zope3 product in the very early days of zope3 products for Plone. So a python programmer with no Plone knowledge will have to ramp up on some technologies before being able to customize it. I think this can be said about Plone in general these days also. &lt;br&gt;
&lt;br&gt;But, that depends on how you want to customize it...there are many things that are fairly straight forward to do. If that weren&amp;#39;t the case, we wouldn&amp;#39;t have had such huge growth in add ons for the product and payment processors over the last year (over twice as much code overall and over twice as many payment processors). And most of the time, that&amp;#39;s what someone implementing a site needs to do. &lt;br&gt;
&lt;br&gt;There are several sites that have been launched with GetPaid already. About two dozen are listed at &lt;a href=&quot;http://www.plonegetpaid.com/why/sites-using-getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com/why/sites-using-getpaid&lt;/a&gt; .  Some are just &amp;quot;out of the box&amp;quot; GetPaid and work well for the client as is, some are customized (and many of the docs about how to achieve the customizations shown are linked to in the presentation I gave at the ploneconf2009: &lt;a href=&quot;http://snurl.com/getpaid-slides&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://snurl.com/getpaid-slides&lt;/a&gt; ). &lt;br&gt;
&lt;br&gt;Regarding people who are playing roles to maintain the product, GetPaid has gone through a period of activity and evolution, several releases. Unfortunately, I left some of this story out of the presentation in Budapest. Perrito (Horacio Duran) has managed a release (0.6.2, I believe) and Lucie at SIx Feet Up has managed releases over the 0.7 series of PloneGetPaid, and David Glick from Groundwire has been involved since ~0.8. These are all people in the Plone community who are/were involved over a period when they were using GetPaid and were working to make it better for their needs. I&amp;#39;m hoping that is what we are starting again as a community. &lt;br&gt;
&lt;br&gt;The project is now in a period where we need new people with interest in ecommerce in Plone to step up and lead in various aspects of the project. That&amp;#39;s an invitation I extended during the presentation at the conference. There are several people interested in getting the remaining needed functionalities (downloadable files, premium content, others), and the model we took in organizing this project originally (see Social Sourcing presentation, &lt;a href=&quot;http://www.ifpeople.net/solutions/social-sourcing&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net/solutions/social-sourcing&lt;/a&gt; ) was about getting people involved upfront in a round of changes. So yes, as you point out, there was an original architect who is no longer active in the project. But, of the other sponsors, supporters and contributors at the very outset of the project, about 3/4 are still involved in the project in one way or another, which gives us a solid basis of community around GetPaid. Now it&amp;#39;s time to get the community involved in actively shaping the future again. &lt;br&gt;
&lt;br&gt;In doing this, I&amp;#39;m willing to help transfer knowledge I have about the product to those who want to take a role in the community. Also, I think it would be great to have a collaborative design process at this point, as we did originally, so the new people involved in GetPaid can shape where the product is going. I&amp;#39;m willing to help those involved in this also, and if needed, to raise additional funds for the buildout of features/refactoring for GetPaid. &lt;br&gt;
&lt;br&gt;With the knowledge of our community, we should be able to unlock the good stuff in GetPaid and make it much more accessible for those using the system. &lt;br&gt;&lt;br&gt;Best wishes,&lt;br&gt;Chris&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;
On Sat, Nov 14, 2009 at 9:18 PM, Moo &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26377071&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mikko@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
Hi,&lt;br&gt;
&lt;br&gt;
I participated the GetPaid sprint in Budapest. There were some worries&lt;br&gt;
among the participants for which I have ginve thoughts afterwards.&lt;br&gt;
&lt;br&gt;
Many people would love to use GetPaid for creating shops, but it won&amp;#39;t&lt;br&gt;
do it.&lt;br&gt;
Currently there are huge gaps within the code (payment processors,&lt;br&gt;
taxes, variant items, architecture limitations) which are necessities&lt;br&gt;
for a basic shop functionality. If you want to use GetPaid, be&lt;br&gt;
prepared to spent countless of hours writing everything from scratch&lt;br&gt;
and &amp;quot;fight against the framework&amp;quot;.&lt;br&gt;
&lt;br&gt;
Until we have a solid working shop platform I suggest not mentioning&lt;br&gt;
&amp;quot;shop&amp;quot; on &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;www.plonegetpaid.com&lt;/a&gt; and actually tell the people to seek&lt;br&gt;
help from Python shopping products.&lt;br&gt;
&lt;br&gt;
Also, GetPaid future does not look very bright. Since the orignal work&lt;br&gt;
was sponsored, the orignal authors have not been very activate with&lt;br&gt;
the community. With the current state of the code it is hard to get&lt;br&gt;
anything done unless you have years of Plone experience. Most users&lt;br&gt;
who would like to use or develop GetPaid don&amp;#39;t necessarily have this.&lt;br&gt;
They might try and get frustrated after couple of hours.&lt;br&gt;
&lt;br&gt;
There is also lack of release manager or trunk maintainer. There is no&lt;br&gt;
one &amp;quot;in control&amp;quot; and people may or may not commit something into&lt;br&gt;
trunk. The vision and active maintenance is missing. There is no&lt;br&gt;
roadmap. There is no committed maintainers. This kind of organization&lt;br&gt;
may fit for small static components like most of those in Plone&lt;br&gt;
collective, but it definite doesn&amp;#39;t seem to work with GetPaid.&lt;br&gt;
&lt;br&gt;
So, should people looking for shopping products abandon GetPaid in&lt;br&gt;
favour of other solutions? There is so much good work in GetPaid, but&lt;br&gt;
it is so hard to get anything out of it.&lt;br&gt;
&lt;br&gt;
-Mikko&lt;br&gt;
&lt;font color=&quot;#888888&quot;&gt;&lt;br&gt;
--&lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26377071&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26377071&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;ifPeople - Innovation for People&lt;br&gt;
&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26377071&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26377071&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/The-future-of-GetPaid--tp26355889p26377071.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26376192</id>
	<title>Re: Taxes implementation ready to be merged</title>
	<published>2009-11-16T09:39:17Z</published>
	<updated>2009-11-16T09:39:17Z</updated>
	<author>
		<name>Christopher Johnson-7</name>
	</author>
	<content type="html">Hi Mikko,&lt;br&gt;&lt;br&gt;Thanks for the notes and the work on getting taxes working! &lt;br&gt;&lt;br&gt;I just wanted to get clarification on your email. The subject said the work was ready to merge, but the text said you have not implemented taxes. It looks from your notes that it is ready, so I just wanted to clarify. &lt;br&gt;
&lt;br&gt;With what you have done, how does someone create a new tax configuration (ie for another country, or for a state within a country)? &lt;br&gt;&lt;br&gt;Thanks again,&lt;br&gt;&lt;br&gt;Chris&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Sat, Nov 14, 2009 at 9:43 PM, Moo &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26376192&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;mikko@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;
&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;Hi,&lt;br&gt;
&lt;br&gt;
I have not implemented working salex tax implementation for GetPaid.&lt;br&gt;
It will work in both United States and Europe.&lt;br&gt;
&lt;br&gt;
Below are notes. Updates notes txt available here for the future&lt;br&gt;
readers:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;https://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/miohtama-taxes/Products/PloneGetPaid/docs/taxes_and_prices.txt&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/miohtama-taxes/Products/PloneGetPaid/docs/taxes_and_prices.txt&lt;/a&gt;&lt;br&gt;

&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Taxes and prices&lt;br&gt;
----------------&lt;br&gt;
&lt;br&gt;
Problem: Depending on the country sales taxes may be included in the&lt;br&gt;
store prices or they&lt;br&gt;
may be applied to the total on the checkout.&lt;br&gt;
&lt;br&gt;
* In Scandinavia sales taxes are included in the consumer visible&lt;br&gt;
prices&lt;br&gt;
&lt;br&gt;
* In US sales taxes depend on the state and are applied on the&lt;br&gt;
checkout&lt;br&gt;
&lt;br&gt;
To support both behaviors GetPaid must be sales tax aware&lt;br&gt;
&lt;br&gt;
* How store owner manages taxes internally: are they put in the price&lt;br&gt;
data or should system calculate them afterwards&lt;br&gt;
&lt;br&gt;
* How consumer sees the prices: does the price tag contain taxes or&lt;br&gt;
not&lt;br&gt;
&lt;br&gt;
getpaid.core.interfaces.IPriceValueAdjuster is an utility to tackle&lt;br&gt;
this problem.&lt;br&gt;
It provides methods&lt;br&gt;
&lt;br&gt;
* To get tax and tax free prices&lt;br&gt;
&lt;br&gt;
* To get user visible prices&lt;br&gt;
&lt;br&gt;
* Extendable tax behavior: subclass and override this utility to have&lt;br&gt;
custom tax algorithms&lt;br&gt;
&lt;br&gt;
* Different taxes for different item categories: line item and content&lt;br&gt;
item adapters can be used&lt;br&gt;
  to return item specific tax percent&lt;br&gt;
&lt;br&gt;
Where should be used&lt;br&gt;
--------------------&lt;br&gt;
&lt;br&gt;
* When totals are queried: CartTotals, checkout&lt;br&gt;
&lt;br&gt;
* When item prices are displayed: portlets, page templates&lt;br&gt;
&lt;br&gt;
* When invoice or recipient is generated&lt;br&gt;
&lt;br&gt;
Products.PloneGetPaid.price module contains documentation how to use&lt;br&gt;
IPriceValueAdjuster.&lt;br&gt;
&lt;br&gt;
Backward incompatible changes&lt;br&gt;
-----------------------------&lt;br&gt;
&lt;br&gt;
The following backward incompatible changes have been made:&lt;br&gt;
&lt;br&gt;
* Querying ILineContainerTotals utility needs to have&lt;br&gt;
IPriceValueAdjuster argument&lt;br&gt;
&lt;br&gt;
* Remove of getpaid.core.tax.TaxUtility&lt;br&gt;
&lt;br&gt;
Code migration examples are available in Products.PloneGetPaid.price&lt;br&gt;
module.&lt;br&gt;
&lt;br&gt;
Necessary changes have been made to most of the parts of PloneGetPaid&lt;br&gt;
and getpaid.core.&lt;br&gt;
Some use cases might have slipped under the radar.&lt;br&gt;
&lt;br&gt;
This work deals with sales tax only. getpaid.core support multiple tax&lt;br&gt;
bases somehow.&lt;br&gt;
getpaid.core.tax.TaxUtility and getpaid.core.interfaces.ITaxUtility&lt;br&gt;
have been&lt;br&gt;
removed, since they had no working implementations. getpaid.core.cart&lt;br&gt;
uses now IPriceValueAdjuster directly. If one wants to support various&lt;br&gt;
taxes&lt;br&gt;
with getpaid.core it would need serious changes to user interface and&lt;br&gt;
GetPaid subsystems&lt;br&gt;
in any case.&lt;br&gt;
&lt;br&gt;
Discussion&lt;br&gt;
----------&lt;br&gt;
&lt;br&gt;
The serious problem is that getpaid.core.order.Order class exposes&lt;br&gt;
getTotal()&lt;br&gt;
by directly inhering from CartItemTotals. It should not do this.&lt;br&gt;
&lt;br&gt;
* When using getTotals() etc. functionality the site context is&lt;br&gt;
available and&lt;br&gt;
  you cannot access such values as the current tax settings&lt;br&gt;
&lt;br&gt;
* Currently you need to resort zope.app.component.hooks.getSite hack&lt;br&gt;
to&lt;br&gt;
  have context inside tese functions.&lt;br&gt;
&lt;br&gt;
I suggest deprecating getTotals() and CartItemTotals totally.&lt;br&gt;
They should be replaced with site-aware adapters which can access&lt;br&gt;
context data.&lt;br&gt;
&lt;br&gt;
Also, when the order is create at least the following data&lt;br&gt;
should be copied to the order to make orders future proof&lt;br&gt;
&lt;br&gt;
* Used taxes&lt;br&gt;
&lt;br&gt;
* Item price as taxed, tax free and taxes applied to item&lt;br&gt;
&lt;br&gt;
Work available&lt;br&gt;
--------------&lt;br&gt;
&lt;br&gt;
2009/11: Available in getpaid.core and Products.PloneGetPaid miohtama-&lt;br&gt;
taxes branch.&lt;br&gt;
Branch is based on brandon-no-overrides branch.&lt;br&gt;
&lt;br&gt;
Files touched&lt;br&gt;
&lt;br&gt;
* getpaid.core.interfaces&lt;br&gt;
&lt;br&gt;
* getpaid.core.cart&lt;br&gt;
&lt;br&gt;
* Products.PloneGetPaid.interfaces&lt;br&gt;
&lt;br&gt;
* Products.PloneGetPaid.price&lt;br&gt;
&lt;br&gt;
* Products.PloneGetPaid.tests.base&lt;br&gt;
&lt;br&gt;
* Products.PloneGetPaid.tests.test_taxes_and_prices&lt;br&gt;
&lt;br&gt;
* Products.PloneGetPaid.browser.cart&lt;br&gt;
&lt;br&gt;
*&lt;br&gt;
&lt;font color=&quot;#888888&quot;&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
--&lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26376192&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26376192&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;ifPeople - Innovation for People&lt;br&gt;
&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26376192&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26376192&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Taxes-implementation-ready-to-be-merged-tp26355990p26376192.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26358279</id>
	<title>Re: Reviewed Brandon's work: some suggestions</title>
	<published>2009-11-15T03:24:25Z</published>
	<updated>2009-11-15T03:24:25Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">More issues:
&lt;br&gt;&lt;br&gt;One cannot present paymeny processor options as a schema reference
&lt;br&gt;(options_interface). They payment processor must be able to customize
&lt;br&gt;its own form view as zope.schema cannot be used to express all form
&lt;br&gt;use cases (custom widgets and so on...).
&lt;br&gt;&lt;br&gt;-Mikko
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; I just went through Brandon's work. Looks nice to me, though there are
&lt;br&gt;&amp;gt; some show stopping issues.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The offsite payment processor interface was empty. It is very
&lt;br&gt;&amp;gt; difficult for third parties to implement payment processor unless
&lt;br&gt;&amp;gt; interfaces are documented with the required precision.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; If I read the core correctly there can be just one on-site payment
&lt;br&gt;&amp;gt; processor. Also, the wizard step to choose payment processor is
&lt;br&gt;&amp;gt; missing.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; As is, this work is useless for many use cases, like
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; * Having a wire payment processor
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; * Choose between credit card and wire payment
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; * Choose between different on-sites processors (imagine different
&lt;br&gt;&amp;gt; processor for different credit cards)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; What's the status of the future of Brandon's work? In
&lt;br&gt;&amp;gt; multiplepaymentprocessor support for these use cases exist.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I am willing to help to merge multiplepaymentprocessor branch with
&lt;br&gt;&amp;gt; brandon and brandon branch with trunk if
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 1) Community &amp;quot;decision making process&amp;quot; sees this as a necessary
&lt;br&gt;&amp;gt; requirement for the future
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 2) There is someone else willing to put hours on the issue
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; -Mikko
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26358279&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26358279&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Reviewed-Brandon%27s-work%3A-some-suggestions-tp26355777p26358279.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26355990</id>
	<title>Taxes implementation ready to be merged</title>
	<published>2009-11-14T18:43:12Z</published>
	<updated>2009-11-14T18:43:12Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I have not implemented working salex tax implementation for GetPaid.
&lt;br&gt;It will work in both United States and Europe.
&lt;br&gt;&lt;br&gt;Below are notes. Updates notes txt available here for the future
&lt;br&gt;readers:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/miohtama-taxes/Products/PloneGetPaid/docs/taxes_and_prices.txt&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://getpaid.googlecode.com/svn/Products.PloneGetPaid/branches/miohtama-taxes/Products/PloneGetPaid/docs/taxes_and_prices.txt&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Taxes and prices
&lt;br&gt;----------------
&lt;br&gt;&lt;br&gt;Problem: Depending on the country sales taxes may be included in the
&lt;br&gt;store prices or they
&lt;br&gt;may be applied to the total on the checkout.
&lt;br&gt;&lt;br&gt;* In Scandinavia sales taxes are included in the consumer visible
&lt;br&gt;prices
&lt;br&gt;&lt;br&gt;* In US sales taxes depend on the state and are applied on the
&lt;br&gt;checkout
&lt;br&gt;&lt;br&gt;To support both behaviors GetPaid must be sales tax aware
&lt;br&gt;&lt;br&gt;* How store owner manages taxes internally: are they put in the price
&lt;br&gt;data or should system calculate them afterwards
&lt;br&gt;&lt;br&gt;* How consumer sees the prices: does the price tag contain taxes or
&lt;br&gt;not
&lt;br&gt;&lt;br&gt;getpaid.core.interfaces.IPriceValueAdjuster is an utility to tackle
&lt;br&gt;this problem.
&lt;br&gt;It provides methods
&lt;br&gt;&lt;br&gt;* To get tax and tax free prices
&lt;br&gt;&lt;br&gt;* To get user visible prices
&lt;br&gt;&lt;br&gt;* Extendable tax behavior: subclass and override this utility to have
&lt;br&gt;custom tax algorithms
&lt;br&gt;&lt;br&gt;* Different taxes for different item categories: line item and content
&lt;br&gt;item adapters can be used
&lt;br&gt;&amp;nbsp; to return item specific tax percent
&lt;br&gt;&lt;br&gt;Where should be used
&lt;br&gt;--------------------
&lt;br&gt;&lt;br&gt;* When totals are queried: CartTotals, checkout
&lt;br&gt;&lt;br&gt;* When item prices are displayed: portlets, page templates
&lt;br&gt;&lt;br&gt;* When invoice or recipient is generated
&lt;br&gt;&lt;br&gt;Products.PloneGetPaid.price module contains documentation how to use
&lt;br&gt;IPriceValueAdjuster.
&lt;br&gt;&lt;br&gt;Backward incompatible changes
&lt;br&gt;-----------------------------
&lt;br&gt;&lt;br&gt;The following backward incompatible changes have been made:
&lt;br&gt;&lt;br&gt;* Querying ILineContainerTotals utility needs to have
&lt;br&gt;IPriceValueAdjuster argument
&lt;br&gt;&lt;br&gt;* Remove of getpaid.core.tax.TaxUtility
&lt;br&gt;&lt;br&gt;Code migration examples are available in Products.PloneGetPaid.price
&lt;br&gt;module.
&lt;br&gt;&lt;br&gt;Necessary changes have been made to most of the parts of PloneGetPaid
&lt;br&gt;and getpaid.core.
&lt;br&gt;Some use cases might have slipped under the radar.
&lt;br&gt;&lt;br&gt;This work deals with sales tax only. getpaid.core support multiple tax
&lt;br&gt;bases somehow.
&lt;br&gt;getpaid.core.tax.TaxUtility and getpaid.core.interfaces.ITaxUtility
&lt;br&gt;have been
&lt;br&gt;removed, since they had no working implementations. getpaid.core.cart
&lt;br&gt;uses now IPriceValueAdjuster directly. If one wants to support various
&lt;br&gt;taxes
&lt;br&gt;with getpaid.core it would need serious changes to user interface and
&lt;br&gt;GetPaid subsystems
&lt;br&gt;in any case.
&lt;br&gt;&lt;br&gt;Discussion
&lt;br&gt;----------
&lt;br&gt;&lt;br&gt;The serious problem is that getpaid.core.order.Order class exposes
&lt;br&gt;getTotal()
&lt;br&gt;by directly inhering from CartItemTotals. It should not do this.
&lt;br&gt;&lt;br&gt;* When using getTotals() etc. functionality the site context is
&lt;br&gt;available and
&lt;br&gt;&amp;nbsp; you cannot access such values as the current tax settings
&lt;br&gt;&lt;br&gt;* Currently you need to resort zope.app.component.hooks.getSite hack
&lt;br&gt;to
&lt;br&gt;&amp;nbsp; have context inside tese functions.
&lt;br&gt;&lt;br&gt;I suggest deprecating getTotals() and CartItemTotals totally.
&lt;br&gt;They should be replaced with site-aware adapters which can access
&lt;br&gt;context data.
&lt;br&gt;&lt;br&gt;Also, when the order is create at least the following data
&lt;br&gt;should be copied to the order to make orders future proof
&lt;br&gt;&lt;br&gt;* Used taxes
&lt;br&gt;&lt;br&gt;* Item price as taxed, tax free and taxes applied to item
&lt;br&gt;&lt;br&gt;Work available
&lt;br&gt;--------------
&lt;br&gt;&lt;br&gt;2009/11: Available in getpaid.core and Products.PloneGetPaid miohtama-
&lt;br&gt;taxes branch.
&lt;br&gt;Branch is based on brandon-no-overrides branch.
&lt;br&gt;&lt;br&gt;Files touched
&lt;br&gt;&lt;br&gt;* getpaid.core.interfaces
&lt;br&gt;&lt;br&gt;* getpaid.core.cart
&lt;br&gt;&lt;br&gt;* Products.PloneGetPaid.interfaces
&lt;br&gt;&lt;br&gt;* Products.PloneGetPaid.price
&lt;br&gt;&lt;br&gt;* Products.PloneGetPaid.tests.base
&lt;br&gt;&lt;br&gt;* Products.PloneGetPaid.tests.test_taxes_and_prices
&lt;br&gt;&lt;br&gt;* Products.PloneGetPaid.browser.cart
&lt;br&gt;&lt;br&gt;*
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26355990&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26355990&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Taxes-implementation-ready-to-be-merged-tp26355990p26355990.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26355889</id>
	<title>The future of GetPaid?</title>
	<published>2009-11-14T18:18:42Z</published>
	<updated>2009-11-14T18:18:42Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I participated the GetPaid sprint in Budapest. There were some worries
&lt;br&gt;among the participants for which I have ginve thoughts afterwards.
&lt;br&gt;&lt;br&gt;Many people would love to use GetPaid for creating shops, but it won't
&lt;br&gt;do it.
&lt;br&gt;Currently there are huge gaps within the code (payment processors,
&lt;br&gt;taxes, variant items, architecture limitations) which are necessities
&lt;br&gt;for a basic shop functionality. If you want to use GetPaid, be
&lt;br&gt;prepared to spent countless of hours writing everything from scratch
&lt;br&gt;and &amp;quot;fight against the framework&amp;quot;.
&lt;br&gt;&lt;br&gt;Until we have a solid working shop platform I suggest not mentioning
&lt;br&gt;&amp;quot;shop&amp;quot; on www.plonegetpaid.com and actually tell the people to seek
&lt;br&gt;help from Python shopping products.
&lt;br&gt;&lt;br&gt;Also, GetPaid future does not look very bright. Since the orignal work
&lt;br&gt;was sponsored, the orignal authors have not been very activate with
&lt;br&gt;the community. With the current state of the code it is hard to get
&lt;br&gt;anything done unless you have years of Plone experience. Most users
&lt;br&gt;who would like to use or develop GetPaid don't necessarily have this.
&lt;br&gt;They might try and get frustrated after couple of hours.
&lt;br&gt;&lt;br&gt;There is also lack of release manager or trunk maintainer. There is no
&lt;br&gt;one &amp;quot;in control&amp;quot; and people may or may not commit something into
&lt;br&gt;trunk. The vision and active maintenance is missing. There is no
&lt;br&gt;roadmap. There is no committed maintainers. This kind of organization
&lt;br&gt;may fit for small static components like most of those in Plone
&lt;br&gt;collective, but it definite doesn't seem to work with GetPaid.
&lt;br&gt;&lt;br&gt;So, should people looking for shopping products abandon GetPaid in
&lt;br&gt;favour of other solutions? There is so much good work in GetPaid, but
&lt;br&gt;it is so hard to get anything out of it.
&lt;br&gt;&lt;br&gt;-Mikko
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26355889&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26355889&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/The-future-of-GetPaid--tp26355889p26355889.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26355777</id>
	<title>Reviewed Brandon's work: some suggestions</title>
	<published>2009-11-14T17:59:41Z</published>
	<updated>2009-11-14T17:59:41Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I just went through Brandon's work. Looks nice to me, though there are
&lt;br&gt;some show stopping issues.
&lt;br&gt;&lt;br&gt;The offsite payment processor interface was empty. It is very
&lt;br&gt;difficult for third parties to implement payment processor unless
&lt;br&gt;interfaces are documented with the required precision.
&lt;br&gt;&lt;br&gt;If I read the core correctly there can be just one on-site payment
&lt;br&gt;processor. Also, the wizard step to choose payment processor is
&lt;br&gt;missing.
&lt;br&gt;&lt;br&gt;As is, this work is useless for many use cases, like
&lt;br&gt;&lt;br&gt;* Having a wire payment processor
&lt;br&gt;&lt;br&gt;* Choose between credit card and wire payment
&lt;br&gt;&lt;br&gt;* Choose between different on-sites processors (imagine different
&lt;br&gt;processor for different credit cards)
&lt;br&gt;&lt;br&gt;What's the status of the future of Brandon's work? In
&lt;br&gt;multiplepaymentprocessor support for these use cases exist.
&lt;br&gt;&lt;br&gt;I am willing to help to merge multiplepaymentprocessor branch with
&lt;br&gt;brandon and brandon branch with trunk if
&lt;br&gt;&lt;br&gt;1) Community &amp;quot;decision making process&amp;quot; sees this as a necessary
&lt;br&gt;requirement for the future
&lt;br&gt;&lt;br&gt;2) There is someone else willing to put hours on the issue
&lt;br&gt;&lt;br&gt;-Mikko
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26355777&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26355777&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Reviewed-Brandon%27s-work%3A-some-suggestions-tp26355777p26355777.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26346919</id>
	<title>Re: Alternative Session Implementation</title>
	<published>2009-11-13T19:48:43Z</published>
	<updated>2009-11-13T19:48:43Z</updated>
	<author>
		<name>Matt Halstead-3</name>
	</author>
	<content type="html">&lt;br&gt;&lt;br&gt;On Nov 13, 9:45 pm, Silvio &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26346919&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;silv...@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Fri, Nov 13, 2009 at 8:24 AM, Matt Halstead &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26346919&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;matt.halst...@...&lt;/a&gt;&amp;gt;wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;  &amp;gt; But it should be possible replace the local persistent utility with
&lt;br&gt;&amp;gt; &amp;gt; another
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; implementation that does the loads/dumps dance internaly and saves the
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; data somewhere else.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Can you elaborate on why session storage needed to be reimplemented?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I can help about this. I had a conversation with Carsten and other people at
&lt;br&gt;&amp;gt; the sprint in Budapest. My point about issue 209 is that, even if it is now
&lt;br&gt;&amp;gt; resolved, it was initially caused by a bad design decision: storing carts in
&lt;br&gt;&amp;gt; a non persistent database. This decision makes anonymous customers lose
&lt;br&gt;&amp;gt; their carts when Zope (or zeo in a zeo cluster) is restarted; site owners
&lt;br&gt;&amp;gt; never want customers to lose their carts.
&lt;/div&gt;&lt;br&gt;I'd agree with that. They will lose their carts after the session time
&lt;br&gt;out, but at least that's a constant. I have a couple of questions
&lt;br&gt;about the proposed implementation:
&lt;br&gt;&lt;br&gt;should the session data container be configured with an explicit
&lt;br&gt;pkg_id so that we can control its settings just for the shop and not
&lt;br&gt;any other use of sessions?
&lt;br&gt;&lt;br&gt;should timeout and resolution be configurable through the web?
&lt;br&gt;&lt;br&gt;we should also create an upgrade step that:
&lt;br&gt;&lt;br&gt;1) calls register_session_data_utility( self ) from the Install.py so
&lt;br&gt;people don't have to do a full product reinstall to update the session
&lt;br&gt;management
&lt;br&gt;&lt;br&gt;2) identifies unusable carts in the _sessions persistent storage and
&lt;br&gt;removes them since these will still cause problems.
&lt;br&gt;&lt;br&gt;If this is the direction people want to head, I'd be quite keen to see
&lt;br&gt;this in action in the next few weeks. I don't mind making a test
&lt;br&gt;branch if you or Carsten don't have time.
&lt;br&gt;&lt;br&gt;&amp;gt; And the storage of carts in the
&lt;br&gt;&amp;gt; temporary zodb requires the loads/dumps dance that seems to be very
&lt;br&gt;&amp;gt; error-prone and leads to hard-to-trace bugs.
&lt;br&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;           Silvio
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26346919&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26346919&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202777p26346919.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26344696</id>
	<title>Re: Alternative Session Implementation</title>
	<published>2009-11-13T14:41:43Z</published>
	<updated>2009-11-13T14:41:43Z</updated>
	<author>
		<name>Mikko Ohtamaa</name>
	</author>
	<content type="html">&lt;br&gt;
&lt;div class=&quot;gmail_quote&quot;&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;FWIW - independent of the functional use case in discussion here -&lt;br&gt;
ZODB 3.9 has an option which can be used to prevent cross database&lt;br&gt;
references from being created in the first place.&lt;br&gt;
allow-implicit-cross-references. So that these kinds of bugs become&lt;br&gt;
trivial to trace.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In the other news Plone 3 won&amp;#39;t be running on ZODB 3.9 because ZODB has been changed too much between versions. So monkey-patch is way to go.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;

&lt;br&gt;
Here is patch that enables the same functionality for ZODB 3.8&lt;br&gt;
&lt;a href=&quot;http://code.google.com/p/getpaid/issues/detail?id=209#c52&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid/issues/detail?id=209#c52&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
--&lt;br&gt;
&lt;font color=&quot;#888888&quot;&gt;Michael Dunstan&lt;br&gt;
&lt;/font&gt;&lt;div&gt;&lt;div class=&quot;h5&quot;&gt;&lt;br&gt;
--&lt;br&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br&gt;

You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26344696&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26344696&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev%2Bunsubscribe@...&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
For more options, visit this group at&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Mikko Ohtamaa&lt;br&gt;Managing director, Red Innovation Ltd.&lt;br&gt;+358 40 743 9707&lt;br&gt;&lt;a href=&quot;http://www.redinnovation.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.redinnovation.com&lt;/a&gt;&lt;br&gt;Every problem is solvable if you can throw enough energy drinks at it&lt;br&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26344696&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26344696&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202777p26344696.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26343538</id>
	<title>Re: Alternative Session Implementation</title>
	<published>2009-11-13T13:05:25Z</published>
	<updated>2009-11-13T13:05:25Z</updated>
	<author>
		<name>Michael Dunstan</name>
	</author>
	<content type="html">On Fri, Nov 13, 2009 at 9:45 PM, Silvio &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26343538&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;silviot@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; And the storage of carts in the
&lt;br&gt;&amp;gt; temporary zodb requires the loads/dumps dance that seems to be very
&lt;br&gt;&amp;gt; error-prone and leads to hard-to-trace bugs.
&lt;br&gt;&lt;br&gt;FWIW - independent of the functional use case in discussion here -
&lt;br&gt;ZODB 3.9 has an option which can be used to prevent cross database
&lt;br&gt;references from being created in the first place.
&lt;br&gt;allow-implicit-cross-references. So that these kinds of bugs become
&lt;br&gt;trivial to trace.
&lt;br&gt;&lt;br&gt;Here is patch that enables the same functionality for ZODB 3.8
&lt;br&gt;&lt;a href=&quot;http://code.google.com/p/getpaid/issues/detail?id=209#c52&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid/issues/detail?id=209#c52&lt;/a&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Michael Dunstan
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26343538&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26343538&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202777p26343538.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26333194</id>
	<title>Re: Alternative Session Implementation</title>
	<published>2009-11-13T00:45:54Z</published>
	<updated>2009-11-13T00:45:54Z</updated>
	<author>
		<name>silviot</name>
	</author>
	<content type="html">&lt;div class=&quot;gmail_quote&quot;&gt;On Fri, Nov 13, 2009 at 8:24 AM, Matt Halstead &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26333194&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;matt.halstead@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex&quot;&gt;


&lt;div&gt;
&amp;gt; But it should be possible replace the local persistent utility with another&lt;br&gt;
&amp;gt; implementation that does the loads/dumps dance internaly and saves the&lt;br&gt;
&amp;gt; data somewhere else.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;Can you elaborate on why session storage needed to be reimplemented?&lt;/blockquote&gt;&lt;div&gt;I can help about this. I had a conversation with Carsten and other people at the sprint in Budapest. My point about issue 209 is that, even if it is now resolved, it was initially caused by a bad design decision: storing carts in a non persistent database. This decision makes anonymous customers lose their carts when Zope (or zeo in a zeo cluster) is restarted; site owners never want customers to lose their carts. And the storage of carts in the temporary zodb requires the loads/dumps dance that seems to be very error-prone and leads to hard-to-trace bugs. &lt;/div&gt;

&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;          Silvio&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

-- &lt;br /&gt;
GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt; (overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt; (code and issue tracker)&lt;br /&gt;
You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.&lt;br /&gt;
To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26333194&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;&lt;br /&gt;
To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26333194&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
For more options, visit this group at&lt;br /&gt;
&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202777p26333194.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26332410</id>
	<title>Re: Alternative Session Implementation</title>
	<published>2009-11-12T23:24:00Z</published>
	<updated>2009-11-12T23:24:00Z</updated>
	<author>
		<name>Matt Halstead-3</name>
	</author>
	<content type="html">Hi Carsten,
&lt;br&gt;&lt;br&gt;On Nov 4, 12:22 pm, Carsten Senger &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26332410&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;sen...@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; Hi all,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I had been joining the GetPaid sprint at the Plone conference in Budapest
&lt;br&gt;&amp;gt; for one day and we shortly discussed the session implementation. If I see
&lt;br&gt;&amp;gt; it correctly the problems of ticket 209 are resolved (except of broken
&lt;br&gt;&amp;gt; ZODBs maybe).
&lt;br&gt;&lt;br&gt;I just committed the patch the michael dunstan provided - it was
&lt;br&gt;previously not committed, that does seem to resolve the source of the
&lt;br&gt;issue for non-broken _session storages.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; We could not come up with a completely sessionless cart implementation, I
&lt;br&gt;&amp;gt; think mainly because nobody knew the GetPaid design well enough. Anyway I
&lt;br&gt;&amp;gt; have implemented the session based approach using zope.app.session. It
&lt;br&gt;&amp;gt; consists of an ISession utility and an ISessionData local persistent
&lt;br&gt;&amp;gt; utility to store the data. This means that sessions (in our case those of
&lt;br&gt;&amp;gt; anonymous users) are written to the ZODB the portal is saved in. This can
&lt;br&gt;&amp;gt; give you performance problems, depending on the number of anonymous
&lt;br&gt;&amp;gt; shopping cart users. I don't know if there are bigger GetPaid installations.
&lt;br&gt;&amp;gt; But it should be possible replace the local persistent utility with another
&lt;br&gt;&amp;gt; implementation that does the loads/dumps dance internaly and saves the
&lt;br&gt;&amp;gt; data somewhere else.
&lt;/div&gt;&lt;br&gt;Can you elaborate on why session storage needed to be reimplemented?
&lt;br&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Attached you find a patch converting the implementation and the tests to
&lt;br&gt;&amp;gt; use zope.app.session. The functional anon cart tests are failing atm, but I
&lt;br&gt;&amp;gt; did not have time to look at them nor do I know if they failed before
&lt;br&gt;&amp;gt; already.
&lt;br&gt;&lt;br&gt;It would be great if you could create a branch with your changes and
&lt;br&gt;fix the tests to work.
&lt;br&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ..Carsten
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;  Products.PloneGetPaid.session.patch
&lt;br&gt;&amp;gt; 13KViewDownload
&lt;br&gt;&lt;br&gt;cheers
&lt;br&gt;Matt
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26332410&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26332410&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202777p26332410.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26236494</id>
	<title>Re: pcommerce.core</title>
	<published>2009-11-06T10:28:48Z</published>
	<updated>2009-11-06T10:28:48Z</updated>
	<author>
		<name>rafael-54</name>
	</author>
	<content type="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta content=&quot;text/html;charset=ISO-8859-1&quot; http-equiv=&quot;Content-Type&quot;&gt;
&lt;/head&gt;
&lt;body bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
Hi,&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp; I hadn't time yet to take a deep look at the code. It is much lighter
than getpaid's. It seems only to implement cart, checkout and product
variations. No reports, inventory management, UPS. (features I think
not many people use...)&lt;br&gt;
&amp;nbsp; I am not also a very skilled coder, but I could help trying to
implement in Getpaid the idea of product variations presented there..&lt;br&gt;
&amp;nbsp; The project owner is Simon Kaeser and theirs homepage is
&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://endlessx.com/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://endlessx.com/&lt;/a&gt; .&lt;br&gt;
&amp;nbsp; I cannot speak in the name of getpaid community, but maybe someone
more representative could get in touch with them and see how we could
maybe join forces for interoperability..&lt;br&gt;
&lt;br&gt;
Cheers,&lt;br&gt;
Rafael&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Christopher Johnson escreveu:
&lt;blockquote cite=&quot;mid:7393c80911051712o5160f4a6lc0dca177d2381ddb@mail.gmail.com&quot; type=&quot;cite&quot;&gt;Hi Rafael,&lt;br&gt;
  &lt;br&gt;
Thanks for pointing that out! I heard something mentioned of it at the
conference, but wasn't at the open space on broader ecommerce to learn
more. Have you checked it out?&amp;nbsp; Do you know who developed it?&lt;br&gt;
  &lt;br&gt;
Also, are any of their interfaces able to work with GetPaid packages?
Would be great to evolve towards shareable code (payment processors and
other functionality). &lt;br&gt;
  &lt;br&gt;
Cheers,&lt;br&gt;
Chris&lt;br&gt;
  &lt;br&gt;
  &lt;div class=&quot;gmail_quote&quot;&gt;On Thu, Nov 5, 2009 at 11:04 AM, rafael &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26236494&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;rafaelcrocha@...&lt;/a&gt;&amp;gt;&lt;/span&gt;
wrote:&lt;br&gt;
  &lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
    &lt;div bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;&lt;br&gt;
    &lt;div style=&quot;font-family: -moz-fixed; font-size: 12px;&quot; lang=&quot;x-western&quot;&gt;
    &lt;pre&gt;Hi,

  I see it was recently released a new product for commerce in Plone,
pcommerce.core .

   Has anyone taken a look in the code? I saw there is a functionality
for product variation, something there should also exist in getpaid.
Maybe we could use some ideas from there?

Rafael
    &lt;/pre&gt;
    &lt;/div&gt;
    &lt;br&gt;
    &lt;/div&gt;
    &lt;br&gt;
  &lt;/blockquote&gt;
  &lt;/div&gt;
  &lt;br&gt;
  &lt;br clear=&quot;all&quot;&gt;
  &lt;br&gt;
-- &lt;br&gt;
Cofounder and CEO&lt;br&gt;
ifPeople - Innovation for People&lt;br&gt;
  &lt;a moz-do-not-send=&quot;true&quot; href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;
t: 678-608-3408&lt;br&gt;
130 Boulevard NE, #6&lt;br&gt;
Atlanta, GA 30312&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26236494&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26236494&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/pcommerce.core-tp26217492p26236494.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26225302</id>
	<title>Re: pcommerce.core</title>
	<published>2009-11-05T17:12:45Z</published>
	<updated>2009-11-05T17:12:45Z</updated>
	<author>
		<name>Christopher Johnson-7</name>
	</author>
	<content type="html">Hi Rafael,&lt;br&gt;&lt;br&gt;Thanks for pointing that out! I heard something mentioned of it at the conference, but wasn&amp;#39;t at the open space on broader ecommerce to learn more. Have you checked it out?  Do you know who developed it?&lt;br&gt;
&lt;br&gt;Also, are any of their interfaces able to work with GetPaid packages? Would be great to evolve towards shareable code (payment processors and other functionality). &lt;br&gt;&lt;br&gt;Cheers,&lt;br&gt;Chris&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;
On Thu, Nov 5, 2009 at 11:04 AM, rafael &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26225302&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;rafaelcrocha@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;




&lt;div bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
&lt;br&gt;
&lt;div style=&quot;font-family: -moz-fixed; font-size: 12px;&quot; lang=&quot;x-western&quot;&gt;
&lt;pre&gt;Hi,

  I see it was recently released a new product for commerce in Plone,
pcommerce.core .

   Has anyone taken a look in the code? I saw there is a functionality
for product variation, something there should also exist in getpaid.
Maybe we could use some ideas from there?

Rafael
&lt;/pre&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;/p&gt;&lt;/div&gt;

&lt;br&gt;
&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;Cofounder and CEO&lt;br&gt;ifPeople - Innovation for People&lt;br&gt;&lt;a href=&quot;http://www.ifpeople.net&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;www.ifpeople.net&lt;/a&gt;&lt;br&gt;t: 678-608-3408&lt;br&gt;130 Boulevard NE, #6&lt;br&gt;Atlanta, GA 30312&lt;br&gt;

&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26225302&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26225302&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/pcommerce.core-tp26217492p26225302.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26217492</id>
	<title>pcommerce.core</title>
	<published>2009-11-05T08:04:22Z</published>
	<updated>2009-11-05T08:04:22Z</updated>
	<author>
		<name>rafael-54</name>
	</author>
	<content type="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body bgcolor=&quot;#ffffff&quot; text=&quot;#000000&quot;&gt;
&lt;br&gt;
&lt;div class=&quot;moz-text-plain&quot; wrap=&quot;true&quot; graphical-quote=&quot;true&quot; style=&quot;font-family: -moz-fixed; font-size: 12px;&quot; lang=&quot;x-western&quot;&gt;
&lt;pre wrap=&quot;&quot;&gt;Hi,

  I see it was recently released a new product for commerce in Plone,
pcommerce.core .

   Has anyone taken a look in the code? I saw there is a functionality
for product variation, something there should also exist in getpaid.
Maybe we could use some ideas from there?

Rafael
&lt;/pre&gt;
&lt;/div&gt;
&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26217492&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26217492&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/pcommerce.core-tp26217492p26217492.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26204293</id>
	<title>Re: Alternative Session Implementation</title>
	<published>2009-11-04T12:42:27Z</published>
	<updated>2009-11-04T12:42:27Z</updated>
	<author>
		<name>rafael-54</name>
	</author>
	<content type="html">&lt;br&gt;&lt;br&gt;&amp;gt; Hi all,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I had been joining the GetPaid sprint at the Plone conference in Budapest
&lt;br&gt;&amp;gt; for one day and we shortly discussed the session implementation. If I see
&lt;br&gt;&amp;gt; it correctly the problems of ticket 209 are resolved (except of broken
&lt;br&gt;&amp;gt; ZODBs maybe).
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;Hi,
&lt;br&gt;I still get this bug triggered every 2 days. Maybe my zodb is corrupted,
&lt;br&gt;but my workaround for that bug is reinstalling getpaid... I tried using
&lt;br&gt;the script to fix it, but did not work...
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; We could not come up with a completely sessionless cart implementation, I
&lt;br&gt;&amp;gt; think mainly because nobody knew the GetPaid design well enough. Anyway I
&lt;br&gt;&amp;gt; have implemented the session based approach using zope.app.session. It
&lt;br&gt;&amp;gt; consists of an ISession utility and an ISessionData local persistent
&lt;br&gt;&amp;gt; utility to store the data. This means that sessions (in our case those of
&lt;br&gt;&amp;gt; anonymous users) are written to the ZODB the portal is saved in. This can
&lt;br&gt;&amp;gt; give you performance problems, depending on the number of anonymous
&lt;br&gt;&amp;gt; shopping cart users. I don't know if there are bigger GetPaid installations.
&lt;br&gt;&amp;gt; But it should be possible replace the local persistent utility with another
&lt;br&gt;&amp;gt; implementation that does the loads/dumps dance internaly and saves the
&lt;br&gt;&amp;gt; data somewhere else.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Attached you find a patch converting the implementation and the tests to
&lt;br&gt;&amp;gt; use zope.app.session. The functional anon cart tests are failing atm, but I
&lt;br&gt;&amp;gt; did not have time to look at them nor do I know if they failed before
&lt;br&gt;&amp;gt; already.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ..Carsten
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26204293&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26204293&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202779p26204293.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26202777</id>
	<title>Alternative Session Implementation</title>
	<published>2009-11-03T15:22:07Z</published>
	<updated>2009-11-03T15:22:07Z</updated>
	<author>
		<name>Carsten Senger-3</name>
	</author>
	<content type="html">Hi all,
&lt;br&gt;&lt;br&gt;I had been joining the GetPaid sprint at the Plone conference in Budapest
&lt;br&gt;for one day and we shortly discussed the session implementation. If I see
&lt;br&gt;it correctly the problems of ticket 209 are resolved (except of broken
&lt;br&gt;ZODBs maybe).
&lt;br&gt;We could not come up with a completely sessionless cart implementation, I
&lt;br&gt;think mainly because nobody knew the GetPaid design well enough. Anyway I
&lt;br&gt;have implemented the session based approach using zope.app.session. It
&lt;br&gt;consists of an ISession utility and an ISessionData local persistent
&lt;br&gt;utility to store the data. This means that sessions (in our case those of
&lt;br&gt;anonymous users) are written to the ZODB the portal is saved in. This can
&lt;br&gt;give you performance problems, depending on the number of anonymous
&lt;br&gt;shopping cart users. I don't know if there are bigger GetPaid installations.
&lt;br&gt;But it should be possible replace the local persistent utility with another
&lt;br&gt;implementation that does the loads/dumps dance internaly and saves the
&lt;br&gt;data somewhere else.
&lt;br&gt;&lt;br&gt;Attached you find a patch converting the implementation and the tests to
&lt;br&gt;use zope.app.session. The functional anon cart tests are failing atm, but I
&lt;br&gt;did not have time to look at them nor do I know if they failed before
&lt;br&gt;already.
&lt;br&gt;&lt;br&gt;..Carsten
&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26202777&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26202777&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;Index: Products/PloneGetPaid/configure.zcml
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/configure.zcml	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/configure.zcml	(Arbeitskopie)
&lt;br&gt;@@ -222,11 +222,58 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; /&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+&amp;lt;!-- zope.app.session for shopping carts --&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-&amp;lt;subscriber
&lt;br&gt;- &amp;nbsp; &amp;nbsp;for=&amp;quot;*
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getpaid.core.interfaces.IPayableCreationEvent&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;handler=&amp;quot;.events.payable_created&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;- 
&lt;br&gt;+
&lt;br&gt;+&amp;lt;adapter factory=&amp;quot;.cart.ClientId&amp;quot; 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; permission=&amp;quot;zope.Public&amp;quot; /&amp;gt; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+&amp;lt;configure package=&amp;quot;zope.app.session&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;adapter
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;factory=&amp;quot;.session.Session&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;provides=&amp;quot;zope.app.session.interfaces.ISession&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;permission=&amp;quot;zope.Public&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;adapter
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;factory=&amp;quot;.session.Session&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;provides=&amp;quot;zope.traversing.interfaces.IPathAdapter&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;name=&amp;quot;session&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.Session&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;allow interface=&amp;quot;.interfaces.ISession&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;implements interface=&amp;quot;zope.traversing.interfaces.IPathAdapter&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.PersistentSessionDataContainer&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;require
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;interface=&amp;quot;.interfaces.ISessionDataContainer&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;permission=&amp;quot;zope.Public&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;!-- &amp;nbsp; &amp;nbsp; &amp;lt;require --&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;!-- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set_schema=&amp;quot;.interfaces.ISessionDataContainer&amp;quot; --&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;!-- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; permission=&amp;quot;zope.ManageServices&amp;quot; /&amp;gt; --&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.SessionData&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;allow interface=&amp;quot;.interfaces.ISessionData&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.SessionPkgData&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;allow interface=&amp;quot;.interfaces.ISessionPkgData&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;subscriber
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;for=&amp;quot;zope.app.appsetup.IDatabaseOpenedEvent&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;handler=&amp;quot;.bootstrap.bootStrapSubscriber&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;subscriber
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;for=&amp;quot;zope.publisher.interfaces.http.IHTTPVirtualHostChangedEvent&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;handler=&amp;quot;.http.notifyVirtualHostChanged&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;/configure&amp;gt;
&lt;br&gt;+&amp;lt;/configure&amp;gt;
&lt;br&gt;\ No newline at end of file
&lt;br&gt;Index: Products/PloneGetPaid/config.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/config.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/config.py	(Arbeitskopie)
&lt;br&gt;@@ -4,3 +4,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PLONE3 = True
&lt;br&gt;&amp;nbsp;except ImportError:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PLONE3 = False
&lt;br&gt;+
&lt;br&gt;+SESSION_KEY = 'PloneGetPaid'
&lt;br&gt;+CART_KEY = 'getpaid.cart'
&lt;br&gt;Index: Products/PloneGetPaid/tests/test_cart.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/tests/test_cart.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/tests/test_cart.py	(Arbeitskopie)
&lt;br&gt;@@ -5,6 +5,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from zope.component import getUtility
&lt;br&gt;&amp;nbsp;from Testing.ZopeTestCase import ZopeDocTestSuite
&lt;br&gt;+from Testing.ZopeTestCase.utils import setupCoreSessions
&lt;br&gt;&amp;nbsp;from Products.Five.utilities.marker import mark
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from utils import optionflags
&lt;br&gt;@@ -13,8 +14,24 @@
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid import interfaces
&lt;br&gt;&amp;nbsp;from getpaid.core.interfaces import IShoppingCartUtility
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+class DummySessionAndBrowserIdManager:
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;__test_browser_id__ = 'funkyTestBrowserId'
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def getBrowserIdManager(self):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def getBrowserId(self):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__test_browser_id__
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;class TestCart(PloneGetPaidTestCase):
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def afterSetUp(self):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(TestCart, self).afterSetUp()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setattr(self.app.REQUEST, 'SESSION', DummySessionAndBrowserIdManager())
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def mySetup(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.setRoles(('Manager',))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;id = self.portal.invokeFactory('Document', 'doc')
&lt;br&gt;@@ -161,18 +178,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ValueError: Malformed key: example:malformed:key
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def pauseBrowserSession(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Utility that disables the current session. The session can
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;be resumed using resumeBrowserSession.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._paused_browser_id = self.portal.REQUEST.browser_id_
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.browser_id_ = None
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._paused_browser_id = self.portal.REQUEST.SESSION.__test_browser_id__
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.SESSION.__test_browser_id__ = None
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def resumeBrowserSession(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Utility to restore the previous session.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.browser_id_ = self._paused_browser_id
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.SESSION.__test_browser_id__ = self._paused_browser_id
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;def test_suite():
&lt;br&gt;Index: Products/PloneGetPaid/setuphandlers.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/setuphandlers.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/setuphandlers.py	(Arbeitskopie)
&lt;br&gt;@@ -14,11 +14,11 @@
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import install_plone3_portlets
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_payment_options
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import register_shopping_cart_utility
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_addressbook
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_named_orders
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_settings
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import register_shopping_cart_utility
&lt;br&gt;+from Products.PloneGetPaid.Extensions.install import register_session_data_utility
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.config import PLONE3
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -82,6 +82,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;print &amp;gt;&amp;gt; out, &amp;quot;Registering shopping cart utility&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;register_shopping_cart_utility(site)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;print &amp;gt;&amp;gt; out, &amp;quot;Registering session data utility&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;register_session_data_utility(site)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;print &amp;gt;&amp;gt; out, &amp;quot;Notifying Installation&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;notify_install( site )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;Index: Products/PloneGetPaid/cart.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/cart.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/cart.py	(Arbeitskopie)
&lt;br&gt;@@ -3,16 +3,21 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;$Id$
&lt;br&gt;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;-from zope.component import getUtility
&lt;br&gt;+from zope.app.session.interfaces import IClientId
&lt;br&gt;+from zope.app.session.interfaces import ISession
&lt;br&gt;+from zope.component import adapts, getUtility
&lt;br&gt;&amp;nbsp;from zope.interface import implements
&lt;br&gt;+from zope.publisher.interfaces import IRequest
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from getpaid.core.cart import ShoppingCart
&lt;br&gt;&amp;nbsp;from getpaid.core.interfaces import IShoppingCartUtility
&lt;br&gt;&amp;nbsp;from Products.CMFCore.utils import getToolByName
&lt;br&gt;+from Products.PloneGetPaid.config import CART_KEY, SESSION_KEY
&lt;br&gt;&amp;nbsp;from persistent import Persistent
&lt;br&gt;&amp;nbsp;from BTrees.OOBTree import OOBTree
&lt;br&gt;&amp;nbsp;from AccessControl import getSecurityManager
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;class ShoppingCartUtility(Persistent):
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;implements(IShoppingCartUtility)
&lt;br&gt;@@ -73,40 +78,30 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._sessions[uid] = cart
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return cart
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _getCartForSession(self, context, create=False, browser_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session_manager.hasSessionData() and not create:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionDataByKey(browser_id)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if session is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key('getpaid.cart'):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if create:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session['getpaid.cart'] = cart = ShoppingCart()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return session['getpaid.cart']
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = ISession(context.REQUEST)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is not None:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# we overwrite the client_id that was set during the ISession
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# initialization
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session.client_id = browser_id
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = session[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cart = sessiondata.get(CART_KEY, None)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if create and cart is None:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata[CART_KEY] = cart = ShoppingCart()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return cart
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _getDisposableCart(self, context, browser_id=None):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ShoppingCart()
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _getMultiShotCart(self, context, cart_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = ISession(context.REQUEST)[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;%s.%s&amp;quot; % (CART_KEY, cart_id)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not sessiondata.has_key(key):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata[key] = ShoppingCart()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sessiondata[key]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;getpaid.cart.%s&amp;quot; % cart_id
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key(key):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session[key] = cart = ShoppingCart()
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return session[key]
&lt;br&gt;-
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def destroy(self, context, key=None):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot; Destroy the cart.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;@@ -125,37 +120,26 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self._destroyCartForSession(context)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _destroyCartForUser(self, context, uid):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if self._sessions.has_key(uid):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del self._sessions[uid]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _destroyCartForSession(self, context, browser_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session_manager.hasSessionData(): #nothing to destroy
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionDataByKey(browser_id)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if session is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key('getpaid.cart'):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del session['getpaid.cart']
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = ISession(context.REQUEST)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is not None:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# overwrite the client_id that was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# during initialization
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session.client_id = browser_id
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = session[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if sessiondata.has_key(CART_KEY):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del sessiondata[CART_KEY]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _destroyMultiShotCart(self, context, cart_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = ISession(context.REQUEST)[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;%s.%s&amp;quot; % (CART_KEY, cart_id)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if sessiondata.has_key(key):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del session[key]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;getpaid.cart.%s&amp;quot; % cart_id
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key(key):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del session[key]
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def getKey(self, context):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Return key that can be used to recover the cart for the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current user or session.
&lt;br&gt;@@ -164,15 +148,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if uid is not None:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 'user:%s' % uid
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session_manager.hasSessionData():
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = ISession(context.REQUEST)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = session[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not sessiondata.has_key(CART_KEY):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key('getpaid.cart'):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 'session:%s' % session.token
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 'session:%s' % session.client_id
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _decodeKey(self, key):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name, value = key.split(':', 1)
&lt;br&gt;@@ -185,3 +166,19 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def manage_fixupOwnershipAfterAdd(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pass
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class ClientId(str):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;See zope.app.interfaces.utilities.session.IClientId
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;An IClientId Utility that uses Zope2's browser_id_manager
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;implementation.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;implements(IClientId)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;adapts(IRequest)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def __new__(cls, request):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str.__new__(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cls, request.SESSION.getBrowserIdManager().getBrowserId()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;Index: Products/PloneGetPaid/Extensions/install.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/Extensions/install.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/Extensions/install.py	(Arbeitskopie)
&lt;br&gt;@@ -12,6 +12,9 @@
&lt;br&gt;&amp;nbsp;from zope.event import notify
&lt;br&gt;&amp;nbsp;from zope.app.component.hooks import setSite
&lt;br&gt;&amp;nbsp;from zope.app.component.interfaces import ISite
&lt;br&gt;+from zope.app.session.interfaces import ISessionDataContainer
&lt;br&gt;+from zope.app.session.session import PersistentSessionDataContainer
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid import generations, preferences, addressbook, namedorder
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.interfaces import IGetPaidManagementOptions, IAddressBookUtility, INamedOrderUtility
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.config import PLONE3
&lt;br&gt;@@ -61,6 +64,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# BBB for Zope 2.9
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(interface=IOrderManager, utility=manager)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+def register_session_data_utility( self ):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;portal = getToolByName( self, 'portal_url').getPortalObject()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sm = portal.getSiteManager()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;is_already_registered = [u for u in sm.getUtilitiesFor(ISessionDataContainer)]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if not len(is_already_registered):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_data = PersistentSessionDataContainer()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_data.timeout = 604800 # 7 days
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_data.resolution = 100
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(session_data, ISessionDataContainer)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(component=session_data, provided=ISessionDataContainer)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;except TypeError:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# BBB for Zope 2.9
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(interface=ISessionDataContainer, utility=session_data)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;def setup_intid( self ):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;portal = getToolByName(self, 'portal_url').getPortalObject()
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202777p26202777.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26202779</id>
	<title>Alternative Session Implementation</title>
	<published>2009-11-03T15:17:56Z</published>
	<updated>2009-11-03T15:17:56Z</updated>
	<author>
		<name>Carsten Senger-3</name>
	</author>
	<content type="html">Hi all,
&lt;br&gt;&lt;br&gt;I had been joining the GetPaid sprint at the Plone conference in Budapest
&lt;br&gt;for one day and we shortly discussed the session implementation. If I see
&lt;br&gt;it correctly the problems of ticket 209 are resolved (except of broken
&lt;br&gt;ZODBs maybe).
&lt;br&gt;We could not come up with a completely sessionless cart implementation, I
&lt;br&gt;think mainly because nobody knew the GetPaid design well enough. Anyway I
&lt;br&gt;have implemented the session based approach using zope.app.session. It
&lt;br&gt;consists of an ISession utility and an ISessionData local persistent
&lt;br&gt;utility to store the data. This means that sessions (in our case those of
&lt;br&gt;anonymous users) are written to the ZODB the portal is saved in. This can
&lt;br&gt;give you performance problems, depending on the number of anonymous
&lt;br&gt;shopping cart users. I don't know if there are bigger GetPaid installations.
&lt;br&gt;But it should be possible replace the local persistent utility with another
&lt;br&gt;implementation that does the loads/dumps dance internaly and saves the
&lt;br&gt;data somewhere else.
&lt;br&gt;&lt;br&gt;Attached you find a patch converting the implementation and the tests to
&lt;br&gt;use zope.app.session. The functional anon cart tests are failing atm, but I
&lt;br&gt;did not have time to look at them nor do I know if they failed before
&lt;br&gt;already.
&lt;br&gt;&lt;br&gt;..Carsten
&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26202779&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26202779&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;Index: Products/PloneGetPaid/configure.zcml
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/configure.zcml	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/configure.zcml	(Arbeitskopie)
&lt;br&gt;@@ -222,11 +222,58 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; /&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+&amp;lt;!-- zope.app.session for shopping carts --&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-&amp;lt;subscriber
&lt;br&gt;- &amp;nbsp; &amp;nbsp;for=&amp;quot;*
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getpaid.core.interfaces.IPayableCreationEvent&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;handler=&amp;quot;.events.payable_created&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;- 
&lt;br&gt;+
&lt;br&gt;+&amp;lt;adapter factory=&amp;quot;.cart.ClientId&amp;quot; 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; permission=&amp;quot;zope.Public&amp;quot; /&amp;gt; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+&amp;lt;configure package=&amp;quot;zope.app.session&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;adapter
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;factory=&amp;quot;.session.Session&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;provides=&amp;quot;zope.app.session.interfaces.ISession&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;permission=&amp;quot;zope.Public&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;adapter
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;factory=&amp;quot;.session.Session&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;provides=&amp;quot;zope.traversing.interfaces.IPathAdapter&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;name=&amp;quot;session&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.Session&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;allow interface=&amp;quot;.interfaces.ISession&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;implements interface=&amp;quot;zope.traversing.interfaces.IPathAdapter&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.PersistentSessionDataContainer&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;require
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;interface=&amp;quot;.interfaces.ISessionDataContainer&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;permission=&amp;quot;zope.Public&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;!-- &amp;nbsp; &amp;nbsp; &amp;lt;require --&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;!-- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set_schema=&amp;quot;.interfaces.ISessionDataContainer&amp;quot; --&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;!-- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; permission=&amp;quot;zope.ManageServices&amp;quot; /&amp;gt; --&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.SessionData&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;allow interface=&amp;quot;.interfaces.ISessionData&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;class class=&amp;quot;.session.SessionPkgData&amp;quot;&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;allow interface=&amp;quot;.interfaces.ISessionPkgData&amp;quot; /&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;/class&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;subscriber
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;for=&amp;quot;zope.app.appsetup.IDatabaseOpenedEvent&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;handler=&amp;quot;.bootstrap.bootStrapSubscriber&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;+ &amp;nbsp;
&lt;br&gt;+ &amp;nbsp;&amp;lt;subscriber
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;for=&amp;quot;zope.publisher.interfaces.http.IHTTPVirtualHostChangedEvent&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;handler=&amp;quot;.http.notifyVirtualHostChanged&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;/&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;/configure&amp;gt;
&lt;br&gt;+&amp;lt;/configure&amp;gt;
&lt;br&gt;\ No newline at end of file
&lt;br&gt;Index: Products/PloneGetPaid/config.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/config.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/config.py	(Arbeitskopie)
&lt;br&gt;@@ -4,3 +4,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PLONE3 = True
&lt;br&gt;&amp;nbsp;except ImportError:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;PLONE3 = False
&lt;br&gt;+
&lt;br&gt;+SESSION_KEY = 'PloneGetPaid'
&lt;br&gt;+CART_KEY = 'getpaid.cart'
&lt;br&gt;Index: Products/PloneGetPaid/tests/test_cart.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/tests/test_cart.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/tests/test_cart.py	(Arbeitskopie)
&lt;br&gt;@@ -5,6 +5,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from zope.component import getUtility
&lt;br&gt;&amp;nbsp;from Testing.ZopeTestCase import ZopeDocTestSuite
&lt;br&gt;+from Testing.ZopeTestCase.utils import setupCoreSessions
&lt;br&gt;&amp;nbsp;from Products.Five.utilities.marker import mark
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from utils import optionflags
&lt;br&gt;@@ -13,8 +14,24 @@
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid import interfaces
&lt;br&gt;&amp;nbsp;from getpaid.core.interfaces import IShoppingCartUtility
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+class DummySessionAndBrowserIdManager:
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;__test_browser_id__ = 'funkyTestBrowserId'
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def getBrowserIdManager(self):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def getBrowserId(self):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self.__test_browser_id__
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;class TestCart(PloneGetPaidTestCase):
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def afterSetUp(self):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(TestCart, self).afterSetUp()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setattr(self.app.REQUEST, 'SESSION', DummySessionAndBrowserIdManager())
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def mySetup(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.setRoles(('Manager',))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;id = self.portal.invokeFactory('Document', 'doc')
&lt;br&gt;@@ -161,18 +178,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ValueError: Malformed key: example:malformed:key
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;-
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def pauseBrowserSession(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Utility that disables the current session. The session can
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;be resumed using resumeBrowserSession.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._paused_browser_id = self.portal.REQUEST.browser_id_
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.browser_id_ = None
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._paused_browser_id = self.portal.REQUEST.SESSION.__test_browser_id__
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.SESSION.__test_browser_id__ = None
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def resumeBrowserSession(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Utility to restore the previous session.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.browser_id_ = self._paused_browser_id
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.portal.REQUEST.SESSION.__test_browser_id__ = self._paused_browser_id
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;def test_suite():
&lt;br&gt;Index: Products/PloneGetPaid/setuphandlers.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/setuphandlers.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/setuphandlers.py	(Arbeitskopie)
&lt;br&gt;@@ -14,11 +14,11 @@
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import install_plone3_portlets
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_payment_options
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import register_shopping_cart_utility
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_addressbook
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_named_orders
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import setup_settings
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.Extensions.install import register_shopping_cart_utility
&lt;br&gt;+from Products.PloneGetPaid.Extensions.install import register_session_data_utility
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.config import PLONE3
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -82,6 +82,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;print &amp;gt;&amp;gt; out, &amp;quot;Registering shopping cart utility&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;register_shopping_cart_utility(site)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;print &amp;gt;&amp;gt; out, &amp;quot;Registering session data utility&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;register_session_data_utility(site)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;print &amp;gt;&amp;gt; out, &amp;quot;Notifying Installation&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;notify_install( site )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;Index: Products/PloneGetPaid/cart.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/cart.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/cart.py	(Arbeitskopie)
&lt;br&gt;@@ -3,16 +3,21 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;$Id$
&lt;br&gt;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;-from zope.component import getUtility
&lt;br&gt;+from zope.app.session.interfaces import IClientId
&lt;br&gt;+from zope.app.session.interfaces import ISession
&lt;br&gt;+from zope.component import adapts, getUtility
&lt;br&gt;&amp;nbsp;from zope.interface import implements
&lt;br&gt;+from zope.publisher.interfaces import IRequest
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;from getpaid.core.cart import ShoppingCart
&lt;br&gt;&amp;nbsp;from getpaid.core.interfaces import IShoppingCartUtility
&lt;br&gt;&amp;nbsp;from Products.CMFCore.utils import getToolByName
&lt;br&gt;+from Products.PloneGetPaid.config import CART_KEY, SESSION_KEY
&lt;br&gt;&amp;nbsp;from persistent import Persistent
&lt;br&gt;&amp;nbsp;from BTrees.OOBTree import OOBTree
&lt;br&gt;&amp;nbsp;from AccessControl import getSecurityManager
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;class ShoppingCartUtility(Persistent):
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;implements(IShoppingCartUtility)
&lt;br&gt;@@ -73,40 +78,30 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self._sessions[uid] = cart
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return cart
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _getCartForSession(self, context, create=False, browser_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session_manager.hasSessionData() and not create:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionDataByKey(browser_id)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if session is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key('getpaid.cart'):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if create:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session['getpaid.cart'] = cart = ShoppingCart()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return session['getpaid.cart']
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = ISession(context.REQUEST)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is not None:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# we overwrite the client_id that was set during the ISession
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# initialization
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session.client_id = browser_id
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = session[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cart = sessiondata.get(CART_KEY, None)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if create and cart is None:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata[CART_KEY] = cart = ShoppingCart()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return cart
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _getDisposableCart(self, context, browser_id=None):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ShoppingCart()
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _getMultiShotCart(self, context, cart_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = ISession(context.REQUEST)[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;%s.%s&amp;quot; % (CART_KEY, cart_id)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not sessiondata.has_key(key):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata[key] = ShoppingCart()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sessiondata[key]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;getpaid.cart.%s&amp;quot; % cart_id
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key(key):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session[key] = cart = ShoppingCart()
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return session[key]
&lt;br&gt;-
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def destroy(self, context, key=None):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot; Destroy the cart.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;@@ -125,37 +120,26 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return self._destroyCartForSession(context)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _destroyCartForUser(self, context, uid):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if self._sessions.has_key(uid):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del self._sessions[uid]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _destroyCartForSession(self, context, browser_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session_manager.hasSessionData(): #nothing to destroy
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionDataByKey(browser_id)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if session is None:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key('getpaid.cart'):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del session['getpaid.cart']
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = ISession(context.REQUEST)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if browser_id is not None:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# overwrite the client_id that was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# during initialization
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session.client_id = browser_id
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = session[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if sessiondata.has_key(CART_KEY):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del sessiondata[CART_KEY]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _destroyMultiShotCart(self, context, cart_id=None):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = ISession(context.REQUEST)[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;%s.%s&amp;quot; % (CART_KEY, cart_id)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if sessiondata.has_key(key):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del session[key]
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key = &amp;quot;getpaid.cart.%s&amp;quot; % cart_id
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key(key):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;del session[key]
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def getKey(self, context):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;Return key that can be used to recover the cart for the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current user or session.
&lt;br&gt;@@ -164,15 +148,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if uid is not None:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 'user:%s' % uid
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_manager = getToolByName(context, 'session_data_manager')
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session_manager.hasSessionData():
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = ISession(context.REQUEST)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessiondata = session[SESSION_KEY]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not sessiondata.has_key(CART_KEY):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session = session_manager.getSessionData()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if not session.has_key('getpaid.cart'):
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return None
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 'session:%s' % session.token
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 'session:%s' % session.client_id
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def _decodeKey(self, key):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name, value = key.split(':', 1)
&lt;br&gt;@@ -185,3 +166,19 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;def manage_fixupOwnershipAfterAdd(self):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pass
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+class ClientId(str):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;See zope.app.interfaces.utilities.session.IClientId
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;An IClientId Utility that uses Zope2's browser_id_manager
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;implementation.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;implements(IClientId)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;adapts(IRequest)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;def __new__(cls, request):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str.__new__(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cls, request.SESSION.getBrowserIdManager().getBrowserId()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;Index: Products/PloneGetPaid/Extensions/install.py
&lt;br&gt;===================================================================
&lt;br&gt;--- Products/PloneGetPaid/Extensions/install.py	(Revision 3169)
&lt;br&gt;+++ Products/PloneGetPaid/Extensions/install.py	(Arbeitskopie)
&lt;br&gt;@@ -12,6 +12,9 @@
&lt;br&gt;&amp;nbsp;from zope.event import notify
&lt;br&gt;&amp;nbsp;from zope.app.component.hooks import setSite
&lt;br&gt;&amp;nbsp;from zope.app.component.interfaces import ISite
&lt;br&gt;+from zope.app.session.interfaces import ISessionDataContainer
&lt;br&gt;+from zope.app.session.session import PersistentSessionDataContainer
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid import generations, preferences, addressbook, namedorder
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.interfaces import IGetPaidManagementOptions, IAddressBookUtility, INamedOrderUtility
&lt;br&gt;&amp;nbsp;from Products.PloneGetPaid.config import PLONE3
&lt;br&gt;@@ -61,6 +64,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# BBB for Zope 2.9
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(interface=IOrderManager, utility=manager)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+def register_session_data_utility( self ):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;portal = getToolByName( self, 'portal_url').getPortalObject()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sm = portal.getSiteManager()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;is_already_registered = [u for u in sm.getUtilitiesFor(ISessionDataContainer)]
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if not len(is_already_registered):
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_data = PersistentSessionDataContainer()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_data.timeout = 604800 # 7 days
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;session_data.resolution = 100
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(session_data, ISessionDataContainer)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(component=session_data, provided=ISessionDataContainer)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;except TypeError:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# BBB for Zope 2.9
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sm.registerUtility(interface=ISessionDataContainer, utility=session_data)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;def setup_intid( self ):
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;portal = getToolByName(self, 'portal_url').getPortalObject()
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Alternative-Session-Implementation-tp26202779p26202779.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26157984</id>
	<title>Re: Sprinting on GetPaid: a plan</title>
	<published>2009-11-01T19:31:13Z</published>
	<updated>2009-11-01T19:31:13Z</updated>
	<author>
		<name>Michael Dunstan</name>
	</author>
	<content type="html">&lt;br&gt;On Mon, Nov 2, 2009 at 1:48 AM, Brandon Craig Rhodes
&lt;br&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26157984&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;brandon@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Michael Dunstan &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26157984&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;michael.dunstan@...&lt;/a&gt;&amp;gt; writes:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; The Google Checkout processor tests fabricate the incoming signals
&lt;br&gt;&amp;gt;&amp;gt; from the checkout server...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Well, that's an interesting idea!  At first it sounds like an
&lt;br&gt;&amp;gt; unconvincing test, but I guess if the XML you injected in the test was
&lt;br&gt;&amp;gt; actual real XML from Google that you'd captured during a by-hand test of
&lt;br&gt;&amp;gt; the callback, then you are indeed testing against real data and real
&lt;br&gt;&amp;gt; Google behavior.  I like the approach enough to be comfortable with it!
&lt;br&gt;&amp;gt; If the sprinters want to kick off a callback from PayPal, capture the
&lt;br&gt;&amp;gt; steps, and replay them in their test, I think that will be a huge step
&lt;br&gt;&amp;gt; forward.  Thanks for this simplification!
&lt;/div&gt;&lt;br&gt;Yeah - that's the same XML that would have come from Google Checkout.
&lt;br&gt;&lt;br&gt;Obviously if the XML from Google Checkout changes then the tests would
&lt;br&gt;need to be updated.
&lt;br&gt;&lt;br&gt;There are some traceback supplements in the getpaid.googlecheckout
&lt;br&gt;processor which log the received XML in the case of an error in the
&lt;br&gt;wild. See TracebackSupplement and NotifyTracebackSupplement of
&lt;br&gt;&lt;a href=&quot;http://code.google.com/p/getpaid/source/browse/getpaid.googlecheckout/trunk/src/getpaid/googlecheckout/googlecheckout.py&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid/source/browse/getpaid.googlecheckout/trunk/src/getpaid/googlecheckout/googlecheckout.py&lt;/a&gt;&lt;br&gt;&lt;br&gt;That should help with the process of updating the tests if there is a
&lt;br&gt;significant change in the XML from Google Checkout. Well - needs to be
&lt;br&gt;a fatal enough error to cause an exception to be thrown.
&lt;br&gt;&lt;br&gt;(Unfortunately I don't see any tests for those traceback supplements.)
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Michael Dunstan
&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26157984&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26157984&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Sprinting-on-GetPaid%3A-a-plan-tp26135182p26157984.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26156789</id>
	<title>Re: paypal payment processor</title>
	<published>2009-11-01T16:45:44Z</published>
	<updated>2009-11-01T16:45:44Z</updated>
	<author>
		<name>Juan Pablo Giménez-2</name>
	</author>
	<content type="html">&lt;div class=&quot;gmail_quote&quot;&gt;2009/10/31 Silvio &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26156789&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;silviot@...&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;
Hi,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;while writing tests for the getpaid.paypal module this came to my mind:&lt;/div&gt;&lt;div&gt;the approach currently is that we don&amp;#39;t create an order if it&amp;#39;s not paid, but we instead create it after the paypal process is over and an IPN comes.&lt;/div&gt;


&lt;div&gt;Customer data is also collected on the paypal site.&lt;/div&gt;&lt;div&gt;Some customers are propably going to place an order and for some reasons (computer crash or phone call etc) wait some time before paying it, or lose their browser session.&lt;/div&gt;


&lt;div&gt;I really think we should create the order object and destroy the cart before the customer is sent to paypal, collecting data on the getpaid-enabled site as well.&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;+1, a &amp;quot;review your order&amp;quot; page should be handy to create the order without the need of js, but adds an extra click...&lt;br&gt;
&lt;br&gt;BTW, while implementing getpaid.nmi I faced another orders workflow problem. There is a subcriber to the IWorkflowTransitionEvent than when the workflow triggers to charging state tries to found the processor and call capture to get the transaction result,&lt;br&gt;
&lt;br&gt;        processor = component.getAdapter( context,&lt;br&gt;                                          interfaces.IPaymentProcessor,&lt;br&gt;                                          self.order.processor_id )&lt;br&gt;&lt;br&gt;        result = processor.capture( self.order, self.order.getTotalPrice() )&lt;br&gt;
   &lt;br&gt;        if result == interfaces.keys.results_async:&lt;br&gt;            return&lt;br&gt;        elif result == interfaces.keys.results_success:&lt;br&gt;            self.order.finance_workflow.fireTransition(&amp;#39;charge-charging&amp;#39;)&lt;br&gt;
        else:&lt;br&gt;            self.order.finance_workflow.fireTransition(&amp;#39;decline-charging&amp;#39;, comment=result)&lt;br&gt; &lt;br&gt;But we&amp;#39;re not implementing an IPaymentProcessor, so this fails and we can&amp;#39;t move the order over the wf... a real pain because without it we only have orders in the &amp;quot;REVIEWING&amp;quot; state.&lt;br&gt;
&lt;br&gt;My first fix was a change on payment.DefaultFinanceProcessorIntegration than caused some problems to Brandon.&lt;br&gt;&lt;br&gt;So after some testing I ended up with this solution,&lt;br&gt;&lt;br&gt;First I created a new Orded class inheretied from getpaid one...&lt;br&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;class INMIOrder(interfaces.IOrder):&lt;br&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;br&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;br&gt;    &lt;br&gt;class Order(BaseOrder):&lt;br&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;br&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;br&gt;    implements(INMIOrder)&lt;br&gt;
&lt;/div&gt;&lt;br&gt;Now the processor implements an orderid method,&lt;br&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;    def orderid(self):&lt;br&gt;        cartutil=getUtility(IShoppingCartUtility)&lt;br&gt;        cart=cartutil.get(getSite())&lt;br&gt;        # we&amp;#39;ll get the order_manager, create the new order, and store it.&lt;br&gt;
        order_manager = getUtility(IOrderManager)&lt;br&gt;        new_order_id = order_manager.newOrderId()&lt;br&gt;        order = Order()&lt;br&gt;        &lt;br&gt;        # register the payment processor name to make the workflow handlers happy&lt;br&gt;
        order.processor_id = &amp;#39;getpaid.nmi.processor&amp;#39;&lt;br&gt;&lt;br&gt;        # FIXME: registering an empty contact information list for now - need to populate this from user&lt;br&gt;        # if possible&lt;br&gt;        order.contact_information = payment.ContactInformation()&lt;br&gt;
        order.billing_address = payment.BillingAddress()&lt;br&gt;        order.shipping_address = payment.ShippingAddress()&lt;br&gt;&lt;br&gt;        order.order_id = new_order_id&lt;br&gt;        &lt;br&gt;        # make cart safe for persistence by using pickling&lt;br&gt;
        order.shopping_cart = loads(dumps(cart))&lt;br&gt;        order.user_id = getSecurityManager().getUser().getId()&lt;br&gt;&lt;br&gt;        order.finance_workflow.fireTransition(&amp;#39;create&amp;#39;)&lt;br&gt;        order.finance_workflow.fireTransition(&amp;#39;authorize&amp;#39;)&lt;br&gt;
        &lt;br&gt;        order_manager.store(order)&lt;br&gt;&lt;br&gt;        return order.order_id&lt;br&gt;&lt;/div&gt;&lt;br&gt;To get this working I needed my own FinanceProcessorIntegrator,&lt;br&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;class FinanceProcessorIntegration(payment.DefaultFinanceProcessorIntegration):&lt;br&gt;
&lt;br&gt;    def __call__( self, event ):&lt;br&gt;        # NMI processor is async, so just return&lt;br&gt;        return  &lt;br&gt;&lt;/div&gt;and register it,&lt;br&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;  &amp;lt;adapter&lt;br&gt;     for=&amp;quot;.nmi.INMIOrder&lt;br&gt;          getpaid.core.interfaces.IDefaultFinanceWorkflow&amp;quot;&lt;br&gt;
     provides=&amp;quot;getpaid.core.interfaces.IWorkflowPaymentProcessorIntegration&amp;quot;&lt;br&gt;     factory=&amp;quot;.nmi.FinanceProcessorIntegration&amp;quot;&lt;br&gt;     /&amp;gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;And thats all... now I have a working orders workflow for my offsite processor...&lt;br&gt;
IMHO this could be moved to getpaid.core.processors, so offsite processors don&amp;#39;t need to worry about order creation, wf states and events, only aprove or decline orders based on external response...&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;
Regards,&lt;br&gt;Juan Pablo&lt;br&gt;&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26156789&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26156789&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/paypal-payment-processor-tp26147466p26156789.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26153480</id>
	<title>Re: paypal payment processor</title>
	<published>2009-11-01T10:29:52Z</published>
	<updated>2009-11-01T10:29:52Z</updated>
	<author>
		<name>silviot</name>
	</author>
	<content type="html">Two more things I forgot to mention:&lt;div&gt;The proposed workflow is intended to provide a sane user experience allowing the site manager to mix &lt;/div&gt;&lt;div&gt;cash on delivery, onsite payments as well as offsite payments with a similar process.&lt;/div&gt;

&lt;div&gt;I think they don&amp;#39;t mix well in the current implementation.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;         Silvio&lt;/div&gt;&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153480&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153480&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/paypal-payment-processor-tp26147466p26153480.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26152187</id>
	<title>specifying version of five.intid</title>
	<published>2009-11-01T07:54:30Z</published>
	<updated>2009-11-01T07:54:30Z</updated>
	<author>
		<name>sunew-2</name>
	</author>
	<content type="html">&lt;br&gt;Hey everybody,
&lt;br&gt;&lt;br&gt;Just thought I would share how to override the versions specified in
&lt;br&gt;getpaid.recipe.release. If an egg is specified directly in the part of
&lt;br&gt;the recipe, the version can be overridden/unpinned.
&lt;br&gt;&lt;br&gt;If the recipe is used like this:
&lt;br&gt;&lt;br&gt;[getpaid]
&lt;br&gt;recipe = getpaid.recipe.release
&lt;br&gt;eggs =
&lt;br&gt;&amp;nbsp; &amp;nbsp; five.intid
&lt;br&gt;&lt;br&gt;&lt;br&gt;five.intid will be unpinned.
&lt;br&gt;&lt;br&gt;You can then, if needed, specify another version to pin in the
&lt;br&gt;[versions]-section of your buildout.
&lt;br&gt;&lt;br&gt;Thanks to Maurits van Rees for writing about this in his blog here:
&lt;br&gt;&lt;a href=&quot;http://maurits.vanrees.org/weblog/archive/2008/01/easily-creating-repeatable-buildouts&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://maurits.vanrees.org/weblog/archive/2008/01/easily-creating-repeatable-buildouts&lt;/a&gt;&lt;br&gt;&lt;br&gt;Happy sprinting,
&lt;br&gt;Sune B. Wøller
&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26152187&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26152187&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/specifying-version-of-five.intid-tp26152187p26152187.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26151983</id>
	<title>Re: paypal payment processor</title>
	<published>2009-11-01T07:34:40Z</published>
	<updated>2009-11-01T07:34:40Z</updated>
	<author>
		<name>silviot</name>
	</author>
	<content type="html">&lt;div class=&quot;gmail_quote&quot;&gt;On Sun, Nov 1, 2009 at 2:23 PM, Brandon Craig Rhodes &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26151983&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;brandon@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;

First:&lt;br&gt;
&lt;br&gt;
I am &amp;quot;-1&amp;quot; on destroying the cart. &lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;I probably was not clear enough. This morning Lee Joramo drew a very useful diagram that shows what my proposal looks like.&lt;/div&gt;&lt;div&gt;I just uploaded it to Google wiki, together with the email where I expose my ideas. Check it out at &lt;/div&gt;

&lt;div&gt;&lt;a href=&quot;http://code.google.com/p/getpaid/wiki/NewOrderWorkflowProposal&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid/wiki/NewOrderWorkflowProposal&lt;/a&gt; &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;


So, again, we should not destroy the cart until we know the customer has&lt;br&gt;
succeeded in paying; and, second, when we do get payment notification we&lt;br&gt;
shouldn&amp;#39;t &amp;quot;destroy&amp;quot; the cart, we should just remove from it whichever&lt;br&gt;
items were actually paid for, using the little list of items that PayPal&lt;br&gt;
will send us back in their IPN message.&lt;/blockquote&gt;&lt;div&gt;I&amp;#39;m -1 about this because it doesn&amp;#39;t fit my usecases (but I am aware I&amp;#39;m biased here) and because it seems harder to implement than necessary.&lt;/div&gt;&lt;div&gt;

&lt;br&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt; &lt;/blockquote&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;


Second:&lt;br&gt;
&lt;br&gt;
I have a less strong opinion on creating an Order before they actually&lt;br&gt;
leave the site.  The issues would seem to be:&lt;br&gt;
&lt;br&gt;
Con&lt;br&gt;
&lt;br&gt;
* Orders are designed to hold information, but in this case there&amp;#39;s&lt;br&gt;
  nothing to store except the fact that the user pressed &amp;quot;Checkout&amp;quot; and&lt;br&gt;
  left the site.  You&amp;#39;d have all these orders sitting around with&lt;br&gt;
  nothing but an order number and a copy of a cart inside of them,&lt;br&gt;
  because the user reached PayPal and was annoyed with its interface and&lt;br&gt;
  decided not to check out after all.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;I meant to ask for user info on our site before the payment, and have the paypal forms automatically filled with the data provided to us. &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;


&lt;br&gt; (I don&amp;#39;t know many store owners, I must admit, but rumor has it&lt;br&gt;
  that they tend to like customers to be as few clicks away from&lt;br&gt;
  finishing paying as possible!).&lt;/blockquote&gt;&lt;div&gt;This is why we should trat anonymous (no user/password) checkout as a first class citizen.&lt;/div&gt;&lt;div&gt;In my experience, at least for the Italian users I&amp;#39;m used to and the kind of business I developed for, asking for a username/password is a thing that I need to avoid as much as possible.&lt;/div&gt;

&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;
But, it seems to me that this mechanism uses space, time, and additional&lt;br&gt;
complexity, in order to accomplish something that the off-site service&lt;br&gt;
does anyway.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;It does use space. I think store owners might be happy with the extra space requirements if it translates to a better user experience.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;


But, I&amp;#39;m not an actual Store Owner, so I&amp;#39;m quite open to changing my&lt;br&gt;
opinion here based on actual GetPaid users if they (or you) would like&lt;br&gt;
to share more about how they actually use the service in practice.&lt;/blockquote&gt;&lt;div&gt;I&amp;#39;d like to hear more opinions about this too. What do you all think on this ML?&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;

&lt;div class=&quot;im&quot;&gt;
&amp;gt; We could then provide the &amp;quot;pay with paypal&amp;quot; button on the order&lt;br&gt;
&amp;gt; summary page.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;Ah!  I see!  You are not advocating JavaScript, you&amp;#39;re advocating&lt;br&gt;
two-step checkout process: the person sees their cart and presses&lt;br&gt;
&amp;quot;Checkout&amp;quot;, then is shown their cart *again* and has to press &amp;quot;PayPal&lt;br&gt;
Checkout&amp;quot; to actually go off-site.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;Yes, I&amp;#39;m really positive this is not an issue. I never had the impression any of my users (I use the described approach in production, and it works well) had anything to complain about.  &lt;/div&gt;

&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;&lt;div class=&quot;im&quot;&gt;&amp;gt; BTW, we should also fix the personal details form and separate &amp;quot;first&lt;br&gt;
&amp;gt; name&amp;quot; from &amp;quot;surname&amp;quot;: we can&amp;#39;t programmatically split &amp;quot;Full name&amp;quot; when&lt;br&gt;
&amp;gt; we pass it to paypal.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;I&amp;#39;m certainly not an expert on this area, but two objections immediately&lt;br&gt;
occur to me:&lt;br&gt;
&lt;br&gt;
1. Isn&amp;#39;t the personal details page something that&amp;#39;s a Plone-wide&lt;br&gt;
   standard and that we can&amp;#39;t change?  Surely we don&amp;#39;t want that form to&lt;br&gt;
   change on the day that someone adds GetPaid to a site that&amp;#39;s been&lt;br&gt;
   maybe running for years, and have to go back through and add two&lt;br&gt;
   names to all of their users before proceeding?&lt;br&gt;
&lt;br&gt;
2. The first+last formula doesn&amp;#39;t work everywhere in the world - nor&lt;br&gt;
   even with everyone in a large university.  I think that&amp;#39;s why Plone&lt;br&gt;
   has a free-form field.&lt;br&gt;
&lt;br&gt;
If PayPal needs first and last, I suspect that we will just have to do&lt;br&gt;
our best using .split() and so forth with the normal Plone name field.&lt;br&gt;
But, again, I could easily be wrong here!&lt;/blockquote&gt;&lt;div&gt;-1000: programmatically splitting name and surname can lead to weird results. I would never ever do that. &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;

 &lt;/blockquote&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;&lt;div class=&quot;im&quot;&gt;
&amp;gt; One more issue: anonymous users can&amp;#39;t see their own orders, so they&lt;br&gt;
&amp;gt; wouldn&amp;#39;t be able to pay with the described setup.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;Can they pay with my proposed setup?  They would just click &amp;quot;Check out&lt;br&gt;
with PayPal&amp;quot; and be immediately whisked off-site?&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;I&amp;#39;m actually proposing to change that, and ask for name/address before sending them to paypal. &lt;/div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;&quot;&gt;


&lt;div class=&quot;im&quot;&gt;&lt;br&gt;
&amp;gt; We could solve this providing a token in the emails we send after the&lt;br&gt;
&amp;gt; order is created; the token could be the md5 hash of the date and time&lt;br&gt;
&lt;/div&gt;&amp;gt; of the order. ... What do you think?&lt;br&gt;
&lt;br&gt;
A strongly random UUID, not the date and time, is what is needed here&lt;br&gt;
for each Order; but, aside from that, your idea is a very good one!&lt;br&gt;
It&amp;#39;s just like the Tracking links that lots of sites send out: because&lt;br&gt;
no one else can guess a 30-character random string, the URL is&lt;br&gt;
essentially private to whomever reads the email.  That would be a nice&lt;br&gt;
way for people (at least who type their emails correctly) to have a way&lt;br&gt;
back to their Order.  Plus, on the final Order page itself we could say&lt;br&gt;
&amp;quot;to visit this later, bookmark...&amp;quot; and have the link there too.&lt;br&gt;&lt;/blockquote&gt;&lt;div&gt;Good, that should be some attribute on the order, randomly generated on order creation.&lt;/div&gt;&lt;div&gt;This also leaves room for some improvement: in case we need the order url to expire, we could store an expiration date with the token and let the user ask for a new url in case it&amp;#39;s expired, providing their email address.&lt;/div&gt;

&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;   Silvio&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26151983&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26151983&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/paypal-payment-processor-tp26147466p26151983.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26150829</id>
	<title>Re: paypal payment processor</title>
	<published>2009-11-01T05:23:13Z</published>
	<updated>2009-11-01T05:23:13Z</updated>
	<author>
		<name>Brandon Craig Rhodes</name>
	</author>
	<content type="html">&lt;br&gt;Silvio &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150829&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;silviot@...&lt;/a&gt;&amp;gt; writes:
&lt;br&gt;&lt;br&gt;&amp;gt; I really think we should create the order object and destroy the cart
&lt;br&gt;&amp;gt; before the customer is sent to paypal, collecting data on the
&lt;br&gt;&amp;gt; getpaid-enabled site as well.
&lt;br&gt;&lt;br&gt;First:
&lt;br&gt;&lt;br&gt;I am &amp;quot;-1&amp;quot; on destroying the cart. &amp;nbsp;If the HTTP forwarding to PayPal
&lt;br&gt;fails - if, say, there is a DNS glitch or their Internet connection goes
&lt;br&gt;down for a moment - then the user will have to return to the store to
&lt;br&gt;press &amp;quot;Checkout&amp;quot; again, but all the hard work to fill their cart will be
&lt;br&gt;gone. &amp;nbsp;They'll have to go all over the site again, refilling their cart,
&lt;br&gt;and then maybe find that their link to PayPal is down *again* when they
&lt;br&gt;finish and hit &amp;quot;Checkout&amp;quot; the second time - and now, again, their cart
&lt;br&gt;is destroyed and gone. &amp;nbsp;This is not an acceptable customer experience.
&lt;br&gt;&lt;br&gt;In crafting the customer experience, in fact, I'm going to consistently
&lt;br&gt;argue that we should be acting as much like Amazon as possible, because
&lt;br&gt;I think that their approach works extremely well. &amp;nbsp;It looks like neither
&lt;br&gt;GetPaid nor Satchmo has spent enough time looking at corner cases that
&lt;br&gt;Amazon handles well and trying to emulate them. &amp;nbsp;For example: it is
&lt;br&gt;actually irresponsible to empty the cart upon payment, because the user,
&lt;br&gt;in another browser tab, might have already added new items to their
&lt;br&gt;shopping cart that are not line items in the order they're checking out
&lt;br&gt;with. &amp;nbsp;Amazon handles this entirely correctly: if I put A and B in my
&lt;br&gt;shopping cart, then press &amp;quot;Checkout&amp;quot;, then while waiting for one of the
&lt;br&gt;checkout screens to process I open another tab and put C in my cart - so
&lt;br&gt;that my cart now has A, B, and C, in it - then when the payment goes
&lt;br&gt;through only A and B disappear from my cart and C is still there,
&lt;br&gt;waiting for me to start a new purchase.
&lt;br&gt;&lt;br&gt;So, again, we should not destroy the cart until we know the customer has
&lt;br&gt;succeeded in paying; and, second, when we do get payment notification we
&lt;br&gt;shouldn't &amp;quot;destroy&amp;quot; the cart, we should just remove from it whichever
&lt;br&gt;items were actually paid for, using the little list of items that PayPal
&lt;br&gt;will send us back in their IPN message.
&lt;br&gt;&lt;br&gt;Second:
&lt;br&gt;&lt;br&gt;I have a less strong opinion on creating an Order before they actually
&lt;br&gt;leave the site. &amp;nbsp;The issues would seem to be:
&lt;br&gt;&lt;br&gt;Con
&lt;br&gt;&lt;br&gt;* Orders are designed to hold information, but in this case there's
&lt;br&gt;&amp;nbsp; nothing to store except the fact that the user pressed &amp;quot;Checkout&amp;quot; and
&lt;br&gt;&amp;nbsp; left the site. &amp;nbsp;You'd have all these orders sitting around with
&lt;br&gt;&amp;nbsp; nothing but an order number and a copy of a cart inside of them,
&lt;br&gt;&amp;nbsp; because the user reached PayPal and was annoyed with its interface and
&lt;br&gt;&amp;nbsp; decided not to check out after all.
&lt;br&gt;&lt;br&gt;* It requires a JavaScript trick: the &amp;quot;PayPal&amp;quot; button actually has to
&lt;br&gt;&amp;nbsp; redirect to an internal page that creates the order and then uses
&lt;br&gt;&amp;nbsp; JavaScript to press the &amp;quot;Submit&amp;quot; button on the actual form that POSTs
&lt;br&gt;&amp;nbsp; to PayPal. &amp;nbsp;If the JavaScript doesn't work with their browser, then
&lt;br&gt;&amp;nbsp; the &amp;quot;PayPal checkout&amp;quot; button will just have taken them to a screen
&lt;br&gt;&amp;nbsp; with another PayPal checkout button, and making users click twice to
&lt;br&gt;&amp;nbsp; leave the site is something that lots of store owners might want to
&lt;br&gt;&amp;nbsp; avoid (I don't know many store owners, I must admit, but rumor has it
&lt;br&gt;&amp;nbsp; that they tend to like customers to be as few clicks away from
&lt;br&gt;&amp;nbsp; finishing paying as possible!).
&lt;br&gt;&lt;br&gt;Pro
&lt;br&gt;&lt;br&gt;* Using the user IDs and timestamps on all of those empty Order objects,
&lt;br&gt;&amp;nbsp; you could see how many visitors filled their cart then pressed
&lt;br&gt;&amp;nbsp; &amp;quot;Checkout&amp;quot; without completing the process.
&lt;br&gt;&lt;br&gt;Please add any more Pro and Con here that you can think of!
&lt;br&gt;&lt;br&gt;But, it seems to me that this mechanism uses space, time, and additional
&lt;br&gt;complexity, in order to accomplish something that the off-site service
&lt;br&gt;does anyway. &amp;nbsp;I mean, the off-site service has several steps in its
&lt;br&gt;checkout process, and if you want analytics on checkout process
&lt;br&gt;abandonment you've got to go check out whatever stats PayPal keeps for
&lt;br&gt;you, to see who left the process and quit at which stages in the
&lt;br&gt;checkout. &amp;nbsp;And, since you have to use PayPal to get complete analytics
&lt;br&gt;anyway, why invest in extra complexity on our end just to keep a
&lt;br&gt;duplicate copy of one of the several numbers?
&lt;br&gt;&lt;br&gt;But, I'm not an actual Store Owner, so I'm quite open to changing my
&lt;br&gt;opinion here based on actual GetPaid users if they (or you) would like
&lt;br&gt;to share more about how they actually use the service in practice.
&lt;br&gt;&lt;br&gt;&amp;gt; We could then provide the &amp;quot;pay with paypal&amp;quot; button on the order
&lt;br&gt;&amp;gt; summary page.
&lt;br&gt;&lt;br&gt;Ah! &amp;nbsp;I see! &amp;nbsp;You are not advocating JavaScript, you're advocating
&lt;br&gt;two-step checkout process: the person sees their cart and presses
&lt;br&gt;&amp;quot;Checkout&amp;quot;, then is shown their cart *again* and has to press &amp;quot;PayPal
&lt;br&gt;Checkout&amp;quot; to actually go off-site. &amp;nbsp;
&lt;br&gt;&lt;br&gt;&amp;gt; It would also simplify the solution of a bug with the current
&lt;br&gt;&amp;gt; implementation; the function order_id of the view
&lt;br&gt;&amp;gt; getpaid.paypal.views.PayPalCheckoutButton is:
&lt;br&gt;&amp;gt; &amp;nbsp;30 &amp;nbsp; &amp;nbsp; def order_id(self):
&lt;br&gt;&amp;gt; &amp;nbsp;31 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 'PUT ORDER ID HERE'
&lt;br&gt;&amp;gt; and it would be handy to have the actual order id available when we
&lt;br&gt;&amp;gt; create the button.
&lt;br&gt;&lt;br&gt;My proposal, which I entirely forgot to mention in the sprint docs, is
&lt;br&gt;that every time we generate the &amp;quot;PayPal&amp;quot; form - which might be dozens of
&lt;br&gt;times, at least, during each person's shopping experience - we generate
&lt;br&gt;a fake &amp;quot;Order Id&amp;quot; that embeds the user's Plone ID somewhere secretly
&lt;br&gt;inside of it. &amp;nbsp;That way, when we later get an IPN message for that Order
&lt;br&gt;and see that it doesn't exist yet, we can create it and auto-associate
&lt;br&gt;it with the right cart owner using their embedded Plone Id.
&lt;br&gt;&lt;br&gt;But before coding this I wanted to have everyone else think through
&lt;br&gt;whether this would raise any security concerns (I can't see any myself)
&lt;br&gt;and I wanted opinions on whether it should be explicit, where the user
&lt;br&gt;themselves (if they check) could see that the order number is
&lt;br&gt;&amp;quot;69391959632-brhodes&amp;quot;, or whether we should encode it somehow as part of
&lt;br&gt;the order number so that it looks like numbers or hex codes too.
&lt;br&gt;&lt;br&gt;&amp;gt; BTW, we should also fix the personal details form and separate &amp;quot;first
&lt;br&gt;&amp;gt; name&amp;quot; from &amp;quot;surname&amp;quot;: we can't programmatically split &amp;quot;Full name&amp;quot; when
&lt;br&gt;&amp;gt; we pass it to paypal.
&lt;br&gt;&lt;br&gt;I'm certainly not an expert on this area, but two objections immediately
&lt;br&gt;occur to me:
&lt;br&gt;&lt;br&gt;1. Isn't the personal details page something that's a Plone-wide
&lt;br&gt;&amp;nbsp; &amp;nbsp;standard and that we can't change? &amp;nbsp;Surely we don't want that form to
&lt;br&gt;&amp;nbsp; &amp;nbsp;change on the day that someone adds GetPaid to a site that's been
&lt;br&gt;&amp;nbsp; &amp;nbsp;maybe running for years, and have to go back through and add two
&lt;br&gt;&amp;nbsp; &amp;nbsp;names to all of their users before proceeding?
&lt;br&gt;&lt;br&gt;2. The first+last formula doesn't work everywhere in the world - nor
&lt;br&gt;&amp;nbsp; &amp;nbsp;even with everyone in a large university. &amp;nbsp;I think that's why Plone
&lt;br&gt;&amp;nbsp; &amp;nbsp;has a free-form field.
&lt;br&gt;&lt;br&gt;If PayPal needs first and last, I suspect that we will just have to do
&lt;br&gt;our best using .split() and so forth with the normal Plone name field.
&lt;br&gt;But, again, I could easily be wrong here!
&lt;br&gt;&lt;br&gt;&amp;gt; One more issue: anonymous users can't see their own orders, so they
&lt;br&gt;&amp;gt; wouldn't be able to pay with the described setup.
&lt;br&gt;&lt;br&gt;Can they pay with my proposed setup? &amp;nbsp;They would just click &amp;quot;Check out
&lt;br&gt;with PayPal&amp;quot; and be immediately whisked off-site?
&lt;br&gt;&lt;br&gt;&amp;gt; We could solve this providing a token in the emails we send after the
&lt;br&gt;&amp;gt; order is created; the token could be the md5 hash of the date and time
&lt;br&gt;&amp;gt; of the order. ... What do you think?
&lt;br&gt;&lt;br&gt;A strongly random UUID, not the date and time, is what is needed here
&lt;br&gt;for each Order; but, aside from that, your idea is a very good one!
&lt;br&gt;It's just like the Tracking links that lots of sites send out: because
&lt;br&gt;no one else can guess a 30-character random string, the URL is
&lt;br&gt;essentially private to whomever reads the email. &amp;nbsp;That would be a nice
&lt;br&gt;way for people (at least who type their emails correctly) to have a way
&lt;br&gt;back to their Order. &amp;nbsp;Plus, on the final Order page itself we could say
&lt;br&gt;&amp;quot;to visit this later, bookmark...&amp;quot; and have the link there too.
&lt;br&gt;&lt;br&gt;Anyway, please feel free to provide ideas, thoughts, and counter-objects
&lt;br&gt;to anything above!
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Brandon Craig Rhodes &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150829&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;brandon@...&lt;/a&gt; &amp;nbsp; &lt;a href=&quot;http://rhodesmill.org/brandon&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://rhodesmill.org/brandon&lt;/a&gt;&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150829&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150829&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/paypal-payment-processor-tp26147466p26150829.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26150573</id>
	<title>Re: Sprinting on GetPaid: a plan</title>
	<published>2009-11-01T04:48:21Z</published>
	<updated>2009-11-01T04:48:21Z</updated>
	<author>
		<name>Brandon Craig Rhodes</name>
	</author>
	<content type="html">&lt;br&gt;Michael Dunstan &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150573&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;michael.dunstan@...&lt;/a&gt;&amp;gt; writes:
&lt;br&gt;&lt;br&gt;&amp;gt; The Google Checkout processor tests fabricate the incoming signals
&lt;br&gt;&amp;gt; from the checkout server...
&lt;br&gt;&lt;br&gt;Well, that's an interesting idea! &amp;nbsp;At first it sounds like an
&lt;br&gt;unconvincing test, but I guess if the XML you injected in the test was
&lt;br&gt;actual real XML from Google that you'd captured during a by-hand test of
&lt;br&gt;the callback, then you are indeed testing against real data and real
&lt;br&gt;Google behavior. &amp;nbsp;I like the approach enough to be comfortable with it!
&lt;br&gt;If the sprinters want to kick off a callback from PayPal, capture the
&lt;br&gt;steps, and replay them in their test, I think that will be a huge step
&lt;br&gt;forward. &amp;nbsp;Thanks for this simplification!
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Brandon Craig Rhodes &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150573&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;brandon@...&lt;/a&gt; &amp;nbsp; &lt;a href=&quot;http://rhodesmill.org/brandon&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://rhodesmill.org/brandon&lt;/a&gt;&lt;br&gt;&lt;br&gt;--~--~---------~--~----~------------~-------~--~----~
&lt;br&gt;GetPaid for Plone: &lt;a href=&quot;http://www.plonegetpaid.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.plonegetpaid.com&lt;/a&gt;&amp;nbsp;(overview info) | &lt;a href=&quot;http://code.google.com/p/getpaid&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://code.google.com/p/getpaid&lt;/a&gt;&amp;nbsp;(code and issue tracker)
&lt;br&gt;You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
&lt;br&gt;To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150573&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
&lt;br&gt;To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26150573&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
&lt;br&gt;&lt;br&gt;For more options, visit this group at
&lt;br&gt;&lt;a href=&quot;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;/a&gt;&lt;br&gt;-~----------~----~----~----~------~----~------~--~---
&lt;br&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Sprinting-on-GetPaid%3A-a-plan-tp26135182p26150573.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26147466</id>
	<title>paypal payment processor</title>
	<published>2009-10-31T17:46:49Z</published>
	<updated>2009-10-31T17:46:49Z</updated>
	<author>
		<name>silviot</name>
	</author>
	<content type="html">Hi,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;while writing tests for the getpaid.paypal module this came to my mind:&lt;/div&gt;&lt;div&gt;the approach currently is that we don&amp;#39;t create an order if it&amp;#39;s not paid, but we instead create it after the paypal process is over and an IPN comes.&lt;/div&gt;

&lt;div&gt;Customer data is also collected on the paypal site.&lt;/div&gt;&lt;div&gt;Some customers are propably going to place an order and for some reasons (computer crash or phone call etc) wait some time before paying it, or lose their browser session.&lt;/div&gt;

&lt;div&gt;I really think we should create the order object and destroy the cart before the customer is sent to paypal, collecting data on the getpaid-enabled site as well.&lt;/div&gt;&lt;div&gt;We could then provide the &amp;quot;pay with paypal&amp;quot; button on the order summary page. This would allow orders to be paid after they have been taken.&lt;/div&gt;

&lt;div&gt;It would also simplify the solution of a bug with the current implementation; the function order_id of the view getpaid.paypal.views.PayPalCheckoutButton is:&lt;/div&gt;&lt;div&gt;&lt;div&gt; 30     def order_id(self):&lt;/div&gt;&lt;div&gt; 31         return &amp;#39;PUT ORDER ID HERE&amp;#39;&lt;/div&gt;

&lt;div&gt;and it would be handy to have the actual order id available when we create the button.&lt;/div&gt;&lt;div&gt;BTW, we should also fix the personal details form and separate &amp;quot;first name&amp;quot; from &amp;quot;surname&amp;quot;: we can&amp;#39;t programmatically split &amp;quot;Full name&amp;quot; when we pass it to paypal.&lt;/div&gt;

&lt;div&gt;One more issue: anonymous users can&amp;#39;t see their own orders, so they wouldn&amp;#39;t be able to pay with the described setup.&lt;/div&gt;&lt;div&gt;We could solve this providing a token in the emails we send after the order is created; the token could be the md5 hash of the date and time of the order.&lt;/div&gt;

&lt;div&gt;Would this be secure enough? It would prevent a random person from collecting personal data of users, would it?&lt;/div&gt;&lt;div&gt;I currently use this approach in production and, at least for me, it has worked well; but I&amp;#39;m not sure it&amp;#39;s secure enough. Anyway, users like *a lot* not to be forced to remember username/password pairs. This would also allow them to email the link to the order details page to a friend, and he could see only that particular order. This could be useful for gifts if the recipient wants to check the shipping status.&lt;/div&gt;

&lt;div&gt;What do you think?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;         Silvio&lt;/div&gt;&lt;/div&gt;&lt;br&gt;
--~--~---------~--~----~------------~-------~--~----~&lt;br&gt;
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | http://code.google.com/p/getpaid (code and issue tracker)
 &lt;br&gt; You received this message because you are subscribed to the Google Groups &amp;quot;getpaid-dev&amp;quot; group.
 &lt;br&gt; To post to this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26147466&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev@...&lt;/a&gt;
 &lt;br&gt; To unsubscribe from this group, send email to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26147466&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;getpaid-dev+unsubscribe@...&lt;/a&gt;
 &lt;br&gt; &lt;p&gt;For more options, visit this group at
 &lt;br&gt; http://groups.google.com/group/getpaid-dev?hl=en?hl=en&lt;br&gt;
-~----------~----~----~----~------~----~------~--~---&lt;br&gt;
&lt;br&gt;
&lt;p&gt;From forum: &lt;a href=&quot;http://old.nabble.com/GetPaid-for-Plone---Dev-f27137.html&quot; embed=&quot;fixTarget[27137]&quot; target=&quot;_top&quot; &gt;GetPaid for Plone - Dev&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/paypal-payment-processor-tp26147466p26147466.html" />
</entry>

</feed>
