Yep, that change looks better.  (although I agree the real issue is still in
the code) I'll check it in and rebundle a new version.  Thanks.

-Rob

2010/1/14 Juan Carlos Coruña <[email protected]>

> Rob, you are right, the patch doesn't work. I remember it worked.
>
> If you change the patch this way it should work. Change the try...except
> clause with:
>
> ship_method_code = self.request.form.get('form.shipping_method_code')
> if type(ship_method_code) == type([]):
>   self.request.form['form.shipping_method_code'] = \
>     self.request.form['form.shipping_method_code'][-1]
>
> I don't like this solution. We should find the place where getpaid appends
> the shipping_method to the existing form attribute
> form.shipping_method_code.
>
> 2010/1/13 Rob LaRubbio <[email protected]>
>
>> Juan,  I added your patch into my local buildout, but it looks like it
>> results in shipping always being free.  Apparently setupShippingOptions
>> in CheckoutSelectShipping (Producst.PloneGetPaid/browser/checkout.py line
>> 738) is called both before the shipping choices are shown, and after it is
>> selected.
>>
>> I've noticed that the shipping plugin is called multiple times.  That is
>> a separate issue, but it really slows down the checkout process, especially
>> if your shipping module makes use of a remote web service (like USPS or
>> UPS).
>>
>> If anyone else has ideas or suggestions I'd love to hear them.  Thanks
>>
>> -Rob
>>
>> On Tue, Jan 12, 2010 at 10:36 AM, Rob LaRubbio <[email protected]>wrote:
>>
>>> I just wanted to start this thread up again.  This issue exists in the
>>> bug tracker as issue #274.  Also since I sent this mail I rolled back my fix
>>> since it actually had the effect of always producing free shipping.
>>>
>>> Juan, I"ll add your patch to my local buildout and test it.  If anyone
>>> has thoughts or ideas for the real fix I'd love to hear them.
>>>
>>> -Rob
>>>
>>> On Wed, Jul 1, 2009 at 8:57 AM, Rob LaRubbio <[email protected]> wrote:
>>>
>>>> Sorry for the slow reply on this.  My gmail stopped forwarding to my
>>>> normal email so I missed this.
>>>>
>>>> After digging into this I came to the same conclusions and an almost
>>>> identical patch.  The problem goes a little deeper then the variable being 
>>>> a
>>>> list since there is code in the checkout process to handle a list:
>>>>
>>>> def getShippingMethod( order, service_code ):
>>>>     """ decode a shipping code, and return the shipping method to be
>>>> used or None """
>>>>     if not service_code:
>>>>         return None
>>>>
>>>>     if isinstance( service_code, list):
>>>>         service_code = service_code[-1]
>>>>
>>>> What I couldn't figure out is why the list is actually getting deleted
>>>> at some point in the processing.  As far as I can tell the request 
>>>> variables
>>>> are held in two places in the request.  Once as key/value pairs directly on
>>>> the request, and in a dictionary called form on the request.  It looks like
>>>> some parts use just request and others use request.form so there is code
>>>> that copies values from request.form to request and that is blanking out 
>>>> the
>>>> value.  What I can't figure out is why the value is blank in one but not 
>>>> the
>>>> other.
>>>>
>>>> So long story short I went with a similar patch to yours:
>>>>
>>>> def make_hidden_input(*args, **kwargs):
>>>>>     '''Construct a set of hidden input elements, with marshalling
>>>>> markup.
>>>>>
>>>>>     If there are positional arguments, they must be dictionaries.
>>>>>     They are combined with the dictionary of keyword arguments to form
>>>>>     a dictionary of query names and values.
>>>>>
>>>>>     Query names (the keys) must be strings.  Values may be strings,
>>>>>     integers, floats, or DateTimes, and they may also be lists or
>>>>>     namespaces containing these types.  All arguments are marshalled
>>>>> with
>>>>>     complex_marshal().
>>>>>     '''
>>>>>
>>>>>     # There has to be a better way, but I haven't found it.
>>>>> Essentially
>>>>>     # Allowing this to be a hidden variable results in an array coming
>>>>>     # back in the request when the user starts to move through the
>>>>> process
>>>>>     # again.  Somewere that populated array is replaced with an empty
>>>>> array
>>>>>     # setting the shipping cost to 0.  This only happens if the site
>>>>> has
>>>>>     # shipping set up and the user hits 'Back' from the review and pay
>>>>> step
>>>>>     if kwargs.has_key('form.shipping_method_code'):
>>>>>         del kwargs['form.shipping_method_code']
>>>>>
>>>>
>>>> I'll be checking in my 'fix' shortly.
>>>>
>>>> However I notice that the Products.PloneGetPaid repository seems to have
>>>> changed.  I'll check my mails to see if it was intentional, but when I did
>>>> an update this morning I got what looks like a new src and trunk directory
>>>> in src/Products.PloneGetPaid.  Both seem to contain the complete set of
>>>> code, so now I seem to have three copies.  (src/Products.PloneGetPaid/src,
>>>> src/Products.PloneGetPaid/trunk & src/Products.PloneGetPaid/Products)
>>>>
>>>> -Rob
>>>>
>>>>
>>>> 2009/6/23 Juan Carlos Coruña <[email protected]>
>>>>
>>>>> Hi,
>>>>>
>>>>> I think I understand the strange behaviour. I'll try to explain it:
>>>>>
>>>>> The first time you select a shipping the
>>>>> request.form['shipping_method_code'] doesn't exist, hence it will be 
>>>>> created
>>>>> with the value you have selected in the wizard
>>>>> (request.form['shipping_method_code'] == 'usps.D-16'). In the next wizard
>>>>> getpaid gets the shipping cost using the value from the request. This time
>>>>> it works. When you go back from this wizard to the previous one (to the 
>>>>> one
>>>>> you selected the shipping) the request.form['shipping_method_code'] exists
>>>>> already with the previous selected value. Now you select the shipping and
>>>>> continue. Getpaid doesn't create the  request.form['shipping_method_code']
>>>>> because it already exists, so it APPENDS (creating a list) the new value
>>>>> (request.form['shipping_method_code'] == ['usps.D-16', 'usps.D-16']). In 
>>>>> the
>>>>> next wizard Getpaid tries to get the shipping cost using the value from 
>>>>> the
>>>>> request, but this time resulting in NO success, because the value is a 
>>>>> list
>>>>> of two strings and doesn't match with any of the shipping methods. So
>>>>> getpaid sets the cost to 0 and the shipping method to none. The next time
>>>>> you go back the request.form hasn't the key shipping_method_code, so it
>>>>> works as in the first time.
>>>>>
>>>>> I don't know where getpaid accomplishes all this, but I have a patch
>>>>> that correct this strange behaviour. I know it's not the perfect solution,
>>>>> but for now it works. Maybe someone that knows getpaid better than me can
>>>>> correct the bug in the origin.
>>>>>
>>>>> Here is the patch:
>>>>>
>>>>> --- Products/PloneGetPaid/checkout.py.orig      2009-06-23
>>>>> 23:42:42.000000000 +0000
>>>>> +++ Products/PloneGetPaid/checkout.py   2009-06-23 23:25:11.000000000
>>>>> +0000
>>>>> @@ -714,6 +714,8 @@
>>>>>          and returns a list of them for the template to display and the
>>>>> user to choose among.
>>>>>
>>>>>          """
>>>>> +        try: del(self.request.form['shipping_method_code'])
>>>>> +        except: pass
>>>>>          siteroot = getToolByName(self.context,
>>>>> "portal_url").getPortalObject()
>>>>>          ship_service_names =
>>>>> IGetPaidManagementOptions(siteroot).shipping_services
>>>>>
>>>>>
>>>>> 2009/6/23 Juan Carlos Coruña <[email protected]>
>>>>>
>>>>> Hi,
>>>>>>
>>>>>> I'm also trying to track down the same bug. It's a strange behaviour
>>>>>> one time it works ok and the next time it fails, and so on...
>>>>>>
>>>>>> I have used the pdb and I followed the code till
>>>>>> PloneGetPaid/_patch.py and there I get lost. I suspect the bug is in
>>>>>> _patch.py, but I cannot assure it. Maybe this can be clue for others 
>>>>>> trying
>>>>>> this. I'll continue to track down this bug. If I make some progress I 
>>>>>> will
>>>>>> inform about it.
>>>>>>
>>>>>> 2009/6/23 Rob LaRubbio <[email protected]>
>>>>>>
>>>>>> I'm trying to track down a bug in getpaid that seems to allow a user
>>>>>>> to get free shipping.  I've been able to get to a point were I can 
>>>>>>> reproduce
>>>>>>> it, now I'm looking for pointers or help on why it is occuring.
>>>>>>>
>>>>>>> I've got a simple setup of Plone 3.1.6 with GetPaid 0.7.9 (I'm using
>>>>>>> the svn checkout of the buildout).  I've marked a couple of items as
>>>>>>> shippable and have written my own shipping addon that talks to USPS.
>>>>>>>
>>>>>>> The free shipping issues happens when a user walks through the
>>>>>>> checkout process up to the 'checkout-review-pay' step.  At this point 
>>>>>>> if the
>>>>>>> user hits the 'Back' button provided on the page (not the browser back),
>>>>>>> they return to the 'checkout-select-shipping' step with a hidden element
>>>>>>> that holds their previous shipping choice.  This input element is the 
>>>>>>> same
>>>>>>> as the input radio select on the page.  This shouldn't be a problem 
>>>>>>> since I
>>>>>>> would expect to get both the hidden value and the radio select in an 
>>>>>>> array,
>>>>>>> and it looks like the code expects that as well since the
>>>>>>> getShippingMethodCode() does this:
>>>>>>>
>>>>>>>     if isinstance( service_code, list):
>>>>>>>>         service_code = service_code[-1]
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>   however it seems I'm getting an empty array instead of an array
>>>>>>> with two values.  For some clarity the checkout-shipping-select html
>>>>>>> essentially looks like this:
>>>>>>>
>>>>>>>     <form action="https://nwei.org/@@getpaid-checkout-wizard";
>>>>>>>>           method="post" enctype="multipart/form-data">
>>>>>>>>          <input type="hidden" name="shipping_method_code"
>>>>>>>> value="usps.D-16"></div>
>>>>>>>
>>>>>>>          <I removed all the other hidden inputs>
>>>>>>>>
>>>>>>>>          <input checked type="radio"
>>>>>>>>                      name="shipping_method_code"
>>>>>>>>                      value="usps.D-16" />
>>>>>>>>
>>>>>>>>           <input type="submit" class="button context"
>>>>>>>>                      id="form.actions.continue"
>>>>>>>>                      name="form.actions.continue" value="Continue"
>>>>>>>> />
>>>>>>>>     </form>
>>>>>>>
>>>>>>>
>>>>>>> As far as I can tell the code should work.  I'm not clear on why
>>>>>>> self.request.get('shipping_method_code') is [] on the second submit 
>>>>>>> instead
>>>>>>> of ['usps.D-16', 'usps.D-16']?  Also if I submit the form, then hit 
>>>>>>> 'back'
>>>>>>> again it works ok since there is no hidden element for an empty array 
>>>>>>> added.
>>>>>>>
>>>>>>> Anyway if anyone has some suggestions on where to look I would really
>>>>>>> appreciate it.  Thanks.
>>>>>>>
>>>>>>> -Rob
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>> --~--~---------~--~----~------------~-------~--~----~
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "getpaid-dev" group.
>>>>> To post to this group, send email to [email protected]
>>>>> To unsubscribe from this group, send email to
>>>>> [email protected]<getpaid-dev%[email protected]>
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/group/getpaid-dev?hl=en
>>>>> -~----------~----~----~----~------~----~------~--~---
>>>>>
>>>>>
>>>>
>>>
>>
>> --
>> GetPaid for Plone: http://www.plonegetpaid.com (overview info) |
>> http://code.google.com/p/getpaid (code and issue tracker)
>>
>> You received this message because you are subscribed to the Google Groups
>> "getpaid-dev" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]<getpaid-dev%[email protected]>
>>
>> For more options, visit this group at
>> http://groups.google.com/group/getpaid-dev?hl=en?hl=en
>>
>
>
> --
> GetPaid for Plone: http://www.plonegetpaid.com (overview info) |
> http://code.google.com/p/getpaid (code and issue tracker)
> You received this message because you are subscribed to the Google Groups
> "getpaid-dev" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]<getpaid-dev%[email protected]>
>
> For more options, visit this group at
> http://groups.google.com/group/getpaid-dev?hl=en?hl=en
>
-- 
GetPaid for Plone: http://www.plonegetpaid.com (overview info) | 
http://code.google.com/p/getpaid (code and issue tracker)
You received this message because you are subscribed to the Google Groups 
"getpaid-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]

For more options, visit this group at
http://groups.google.com/group/getpaid-dev?hl=en?hl=en

Reply via email to