Ejemplo n.º 1
0
def create_platform_preferences(user):
    # Create all platform preferences for the user (if not exist)
    preferencesDef = PreferenceDef.objects.all()
    preferencesDef_data = serializers.serialize('python', preferencesDef, ensure_ascii=False)
    for preferenceDef in preferencesDef_data:
        preferenceDef_fields = preferenceDef['fields']
	preferenceDef_obj = get_object_or_404(PreferenceDef, name=preferenceDef['pk'])
        try:
            preference = Preference.objects.get(user=user, preferenceDef=preferenceDef['pk'])
        except Preference.DoesNotExist:
            preference = Preference(user=user, selectedValue=preferenceDef_fields['defaultValue'], preferenceDef=preferenceDef_obj)
            preference.save()
Ejemplo n.º 2
0
 def setUp(self):
     self.owner = User.objects.create_user("owner", "*****@*****.**", "testpw")
     owner_profile = Profile(user=self.owner)
     owner_profile.save()
     self.user = User.objects.create_user("test", "*****@*****.**", "testpw")
     self.user2 = User.objects.create_user("user2", "*****@*****.**", "user2")
     Profile(user=self.user).save()
     Profile(user=self.user2).save()
     
     self.marketplace = MarketPlace(name="greatsomething", title="Great Something", slug="great-something", 
                                    template_prefix="default", base_domain="greatsomething.com")
     self.marketplace.save()
     self.shop = Shop(marketplace=self.marketplace, admin=self.owner, name="test_shop")
     self.shop.save()
     Preference(shop=self.shop).save()
     self.shop.update()
     plan = SubscriptionPlan(plan_id=1,
                      marketplace=self.marketplace, 
                      trial_period=True, 
                      total_store_revenue=1000, 
                      concurrent_store_items=1000)
     plan.save()
     Subscription(owner=owner_profile, plan=plan).save()
     self.category = MarketCategory(marketplace=self.marketplace, name="Category1")
     self.category.save()
     self.subcategory = MarketSubCategory(marketplace=self.marketplace, parent=self.category, name="SubCategory1")
     self.subcategory.save()
     
     self.cart = Cart(shop=self.shop, bidder=self.user)
     self.cart.save()
     
     self.cart2 = Cart(shop=self.shop, bidder=self.user2)
     self.cart2.save()
Ejemplo n.º 3
0
def paynow(request):
    from payments.models import  PayPalShopSettings, PayPalToken
    from preferences.models import Preference
        
    shop = request.shop
    cart = request.cart
    
    try:   
        paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    except PayPalShopSettings.DoesNotExist:
        request.flash['message'] = unicode(_("This shop haven't Paypal as a payment provider, please try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    return_url = request.build_absolute_uri(reverse("paypal_success"))
    cancel_url = request.build_absolute_uri(reverse("paypal_cancel"))
    
    ppgw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                         password=settings.PAYPAL_PASSWORD,
                         sign=settings.PAYPAL_SIGNATURE,
                         debug=settings.PAYPAL_DEBUG)
    

    payment_request = {
        'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
        'PAYMENTREQUEST_0_AMT': total_amount,
        #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
        #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
        #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
        'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
        'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
        'SUBJECT': paypal_settings.email
    }
    
    #for i, cart_item in enumerate(cart.cartitem_set.all()):
    #    payment_request['L_PAYMENTREQUEST_0_NAME%d' % i] = cart_item.product.title.title() 
    #    payment_request['L_PAYMENTREQUEST_0_AMT%d' % i] = "%0.2f" % cart_item.product.price
    #    payment_request['L_PAYMENTREQUEST_0_QTY%d' % i] = cart_item.qty

    success = ppgw.SetExpressCheckout(payment_request, return_url, cancel_url)
    if success:
        """
        token = A timestamped token by which you identify to PayPal that you are processing
        this payment with Express Checkout. The token expires after three hours. 
        If you set the token in the SetExpressCheckout request, the value of the token in the 
        response is identical to the value in the request.
        Character length and limitations: 20 single-byte characters 
        """
        token = ppgw.token
        PayPalToken(cart=cart, token=token).save()
        return HttpResponseRedirect(ppgw.paypal_url())
    
    else:
        logging.critical("SetExpressCheckout failed. RESPONSE = %s" % ppgw.api_response)
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
Ejemplo n.º 4
0
def create_platform_preferences(user):
    # Create all platform preferences for the user (if not exist)
    preferencesDef = PreferenceDef.objects.all()
    preferencesDef_data = serializers.serialize('python',
                                                preferencesDef,
                                                ensure_ascii=False)
    for preferenceDef in preferencesDef_data:
        preferenceDef_fields = preferenceDef['fields']
        preferenceDef_obj = get_object_or_404(PreferenceDef,
                                              name=preferenceDef['pk'])
        try:
            preference = Preference.objects.get(
                user=user, preferenceDef=preferenceDef['pk'])
        except Preference.DoesNotExist:
            preference = Preference(
                user=user,
                selectedValue=preferenceDef_fields['defaultValue'],
                preferenceDef=preferenceDef_obj)
            preference.save()
Ejemplo n.º 5
0
def paynow(request):
    from payments.models import  PayPalShopSettings, PayPalToken
    from preferences.models import Preference
        
    shop = request.shop
    cart = request.cart
    
    try:   
        paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    except PayPalShopSettings.DoesNotExist:
        #TODO: erase after demo!!!!
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    return_url = request.build_absolute_uri(reverse("paypal_success"))
    cancel_url = request.build_absolute_uri(reverse("paypal_cancel"))
    
    ppgw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                         password=settings.PAYPAL_PASSWORD,
                         sign=settings.PAYPAL_SIGNATURE,
                         debug=settings.PAYPAL_DEBUG)
    

    payment_request = {
        'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
        'PAYMENTREQUEST_0_AMT': "%0.2f" % cart.total_with_taxes(),
        #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
        #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
        #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
        'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
        'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
        'SUBJECT': paypal_settings.email
    }
    
    #for i, cart_item in enumerate(cart.cartitem_set.all()):
    #    payment_request['L_PAYMENTREQUEST_0_NAME%d' % i] = cart_item.product.title.title() 
    #    payment_request['L_PAYMENTREQUEST_0_AMT%d' % i] = "%0.2f" % cart_item.product.price
    #    payment_request['L_PAYMENTREQUEST_0_QTY%d' % i] = cart_item.qty

    success = ppgw.SetExpressCheckout(payment_request, return_url, cancel_url)
    if success:
        PayPalToken(cart=cart, token=ppgw.token).save()
        return HttpResponseRedirect(ppgw.paypal_url())
    
    request.flash['message'] = unicode(_("Payment failed, try other method."))
    request.flash['severity'] = "error"
    return HttpResponseRedirect(reverse('my_shopping'))
Ejemplo n.º 6
0
    def setUp(self):
        # create store owner user and profile
        self.owner = User.objects.create_user("test-owner", "*****@*****.**", "test-owner")
        owner_profile = Profile(user=self.owner)
        owner_profile.save()

        # create a marketplace
        self.marketplace = MarketPlace(name="greatcoins", title="greatcoins", slug="greatcoins", 
                                       template_prefix="greatcoins", base_domain="greatcoins.com")
        self.marketplace.save()

        # create a shop
        self.shop = Shop(marketplace=self.marketplace, admin=self.owner, name="test_shop")
        self.shop.save()

        # create a Preference and SubscriptionPlan to shop
        Preference(shop=self.shop).save()
        self.shop.update()
        plan = SubscriptionPlan(plan_id=1,
                         marketplace=self.marketplace,
                         trial_period=True,
                         total_store_revenue=1000,
                         concurrent_store_items=1000)
        plan.save()
        Subscription(owner=owner_profile, plan=plan).save()

        # create marketplace categories and sub-categories
        self.category = MarketCategory(marketplace=self.marketplace, name="Category")
        self.category.save()
        self.subcategory = MarketSubCategory(marketplace=self.marketplace, parent=self.category, name="SubCategory")
        self.subcategory.save()

        # create a user, profile and shipping data
        self.user = User.objects.create_user("test-user", "*****@*****.**", "test-user")
        Profile(user=self.user).save()
        shippingdata = ShippingData(first_name='User',
                                    last_name='Buyer',
                                    street_address="Calle 54",
                                    city="La Plata",
                                    state="Buenos Aires",
                                    zip="1900",
                                    country="AR")
        shippingdata.save()

        # create a shopping cart
        self.cart = Cart(shop=self.shop, bidder=self.user)
        self.cart.shippingdata = shippingdata
        self.cart.save()
Ejemplo n.º 7
0
class ShopManager(models.Manager):
    
    def create(self, marketplace, name, admin, name_store):
        
        from geopy import geocoders
        from themes.models import Theme
        from preferences.models import Preference, DnsShop
        from blog_pages.models import Home, About, Menu, DynamicPageContent
        from themes.models import PAGES
        
        shop = Shop(marketplace=marketplace, name=name, admin=admin)
        
        profile = admin.get_profile()
        try:
            #get the geoposition according to the shop address
            g = geocoders.Google(settings.GOOGLE_KEY)
            place = "%s, %s, %s, %s" % (profile.street_address, profile.city, profile.state, profile.country)
            place, point = g.geocode(place)
            shop.location = "%s,%s" % point
        except Exception, e:
            logging.critical(e)
        
        shop.save()

        Theme.create_default(shop)
        
        """ Create Static Pages for this shop """
        Home(shop=shop).save()
        About(shop=shop).save()
        
        """ Create Content for Dynamic Pages for this shop """        
        for page in PAGES:
            DynamicPageContent(shop=shop, page=page, meta_content=page).save()
            
        """ Create Default MENU """
        Menu.create_default(shop)
            
        """ Create DNS default """
        dns = DnsShop(shop=shop, dns="%s.%s" % (shop.name, settings.DEFAULT_DNS), default=True)
        dns.save()
            
        """ Create preference to shop """
        preference = Preference(shop=shop, name_store=name_store)
        preference.save()
        
        
        return shop
Ejemplo n.º 8
0
def success(request):    
    from payments.gateways.paypal import PayPalGateway
    from payments.models import PayPalShopSettings, PayPalToken, PayPalTransaction
    from preferences.models import Preference
    from sell.templatetags.sell_tags import money_format

    
    if request.method == 'GET':
        payerid = request.GET.get('PayerID', None)
        token = request.GET.get('token', None)
    else:
        payerid = request.POST.get('PayerID', None)
        token = request.POST.get('token', None)
    
    if None in (token, payerid):
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    shop = request.shop   
    paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    profile = request.user.get_profile()
    
    
    try:
        paypaltoken = PayPalToken.objects.filter(token=token).get()
    except PayPalToken.DoesNotExist:
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))

    if paypaltoken.confirmed == True:
        request.flash['message'] = unicode(_("Payment is already confirmed!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))

    cart = paypaltoken.cart
    #currency = Preference.get_preference(shop).checkout_currency
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    
    if request.method != 'POST':
        
        t = loader.get_template('payments/payment_paypal_confirm.html')
        c = RequestContext(request, {
                                     'payerid': payerid,
                                     'token': token,
                                    })
        block = (t.render(c))
        
        param = {'total_amount': money_format(total_amount, shop),
                 'paypaltoken': paypaltoken,
                 'cart': cart,
                 'cancel_url': reverse('payments_cancel'),
                 'form_paypal_confirm': block,
                }
        
        return HttpResponse(my_render(request, param, 'payment_paypal_confirm'))        
    
    
    action = request.POST.get('action', 'cancel').lower()
    
    if action == 'confirm':
        
        paypal_gw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                                  password=settings.PAYPAL_PASSWORD,
                                  sign=settings.PAYPAL_SIGNATURE,
                                  debug=settings.PAYPAL_DEBUG)
       
        token_data = paypal_gw.GetExpressCheckoutDetails("http://www.google.com", "http://www.google.com", paypaltoken.token)
        ack = paypal_gw.api_response['ACK'][0]
        
        try:
            amount = decimal.Decimal(paypal_gw.api_response['AMT'][0])
        except KeyError:
            logging.critical("Fail when trying to read the payment amount. The API response don't have an AMT key. RESPONSE: %s" % paypal_gw.api_response)    
            request.flash['message'] = unicode(_("We have found an error when trying to validate your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        if ack != "Success":
            request.flash['message'] = unicode(_("Fail when trying to validate your PayPal Token. Please contact admin to complete your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        if amount != cart.total_with_taxes():
            request.flash['message'] = unicode(_("You have authorized us to charge you just $%s, but you want buy $%s! Please contact admin if you think this is a mistake!" % (amount, cart.total_with_taxes())))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
    
        payment_request = {
            'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
            'PAYMENTREQUEST_0_AMT': "%0.2f" % cart.total_with_taxes(), 
            #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
            #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
            #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
            'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
            'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
            'SUBJECT': paypal_settings.email
        }
        success = paypal_gw.DoExpressCheckoutPayment(payment_request, paypaltoken.token, payerid)
        
        
        if success:
            #Close and clean the cart
            sell = cart.close("PayPal")
            #Set the sell payments as paid
            sell.payment.pay()
            paypaltoken.confirmed = True
            paypaltoken.save()
            
            # {'PAYMENTINFO_0_TRANSACTIONTYPE': 'expresscheckout', 'ACK': 'Success', 'PAYMENTINFO_0_PAYMENTTYPE': 'instant', 'PAYMENTINFO_0_REASONCODE': 'None', 'SHIPPINGOPTIONISDEFAULT': 'false', 'INSURANCEOPTIONSELECTED': 'false', 'CORRELATIONID': '8d20dfd3e3575', 'PAYMENTINFO_0_TAXAMT': '0.00', 'PAYMENTINFO_0_TRANSACTIONID': '6MH53467HE876651A', 'PAYMENTINFO_0_PENDINGREASON': 'None', 'PAYMENTINFO_0_AMT': '57.00', 'PAYMENTINFO_0_PROTECTIONELIGIBILITY': 'Ineligible', 'PAYMENTINFO_0_ERRORCODE': '0', 'TOKEN': 'EC-7MR99474WD5992801', 'VERSION': '63.0', 'SUCCESSPAGEREDIRECTREQUESTED': 'false', 'BUILD': '1482946', 'PAYMENTINFO_0_CURRENCYCODE': 'USD', 'PAYMENTINFO_0_FEEAMT': '1.95', 'TIMESTAMP': '2010-09-08T18:03:24Z', 'PAYMENTINFO_0_ACK': 'Success', 'PAYMENTINFO_0_ORDERTIME': '2010-09-08T18:03:23Z', 'PAYMENTINFO_0_PAYMENTSTATUS': 'Completed'}
            txn_id = paypal_gw.api_response['PAYMENTINFO_0_TRANSACTIONID']
            
            transaction = PayPalTransaction()
            transaction.transaction_id = txn_id
            transaction.sell = sell
            transaction.save()
            
            return HttpResponseRedirect(reverse('payments_success'))
        else:
            request.flash['message'] = unicode(_("Payment Failed!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
    else:
        paypaltoken.delete()
        request.flash['message'] = unicode(_("Payment cancel!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))
Ejemplo n.º 9
0
def bulk_create(request, id):
    objs = []
    for i in range(id, id + 1000):
        objs.append(Preference(name=i))
    Preference.objects.bulk_create(objs)
Ejemplo n.º 10
0
def paynow(request):
    from payments.models import  PayPalShopSettings, PayPalToken
    from preferences.models import Preference
        
    shop = request.shop
    cart = request.cart

    #### Verify Products Availability
    if not cart.is_available():
        request.flash['message'] = 'Items not longer available: '
        for item in cart.items_not_availables():
            request.flash['message'] += item.product.title
        cart.remove_not_available_items()
        
        return HttpResponseRedirect(reverse('my_shopping'))

    
    try:   
        paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    except PayPalShopSettings.DoesNotExist:
        request.flash['message'] = unicode(_("This shop haven't Paypal as a payment provider, please try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    return_url = request.build_absolute_uri(reverse("paypal_success"))
    cancel_url = request.build_absolute_uri(reverse("paypal_cancel"))
    
    ppgw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                         password=settings.PAYPAL_PASSWORD,
                         sign=settings.PAYPAL_SIGNATURE,
                         debug=settings.PAYPAL_DEBUG)
    

    payment_request = {
        'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
        'PAYMENTREQUEST_0_AMT': total_amount,
        #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
        #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
        #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
        'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
        'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
        'SUBJECT': paypal_settings.email
    }
    
    #for i, cart_item in enumerate(cart.cartitem_set.all()):
    #    payment_request['L_PAYMENTREQUEST_0_NAME%d' % i] = cart_item.product.title.title() 
    #    payment_request['L_PAYMENTREQUEST_0_AMT%d' % i] = "%0.2f" % cart_item.product.price
    #    payment_request['L_PAYMENTREQUEST_0_QTY%d' % i] = cart_item.qty

    success = ppgw.SetExpressCheckout(payment_request, return_url, cancel_url)
    if success:
        """
        token = A timestamped token by which you identify to PayPal that you are processing
        this payment with Express Checkout. The token expires after three hours. 
        If you set the token in the SetExpressCheckout request, the value of the token in the 
        response is identical to the value in the request.
        Character length and limitations: 20 single-byte characters 
        """
        token = ppgw.token
        PayPalToken(cart=cart, token=token).save()
        return HttpResponseRedirect(ppgw.paypal_url())
    
    else:
        logging.critical("SetExpressCheckout failed. RESPONSE = %s" % ppgw.api_response)
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
Ejemplo n.º 11
0
def success(request):    
    from payments.gateways.paypal import PayPalGateway
    from payments.models import PayPalShopSettings, PayPalToken, PayPalTransaction
    from preferences.models import Preference
    from sell.templatetags.sell_tags import money_format

    cart = request.cart
    
    #### Verify Products Availability
    if not cart.is_available():
        request.flash['message'] = 'Items not longer available: '
        for item in cart.items_not_availables():
            request.flash['message'] += item.product.title
        cart.remove_not_available_items()
        
        return HttpResponseRedirect(reverse('my_shopping'))
    
    if request.method == 'GET':
        payerid = request.GET.get('PayerID', None)
        token = request.GET.get('token', None)
    else:
        payerid = request.POST.get('PayerID', None)
        token = request.POST.get('token', None)
    
    if None in (token, payerid):
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    shop = request.shop   
    paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    
    try:
        paypaltoken = PayPalToken.objects.filter(token=token).get()
    except PayPalToken.DoesNotExist:
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))

    if paypaltoken.confirmed == True:
        request.flash['message'] = unicode(_("Payment is already confirmed!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))

    cart = paypaltoken.cart
    #currency = Preference.get_preference(shop).checkout_currency
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    
    if request.method != 'POST':
        
        t = loader.get_template('payments/payment_paypal_confirm.html')
        c = RequestContext(request, {
                                     'payerid': payerid,
                                     'token': token,
                                     #'api_signature': settings.PAYPAL_SIGNATURE,                                                                   
                                     #'api_user': settings.PAYPAL_USERNAME,
                                     #'api_password': settings.PAYPAL_PASSWORD
                                    })
        block = (t.render(c))
        
        param = {'total_amount': money_format(total_amount, shop),
                 'paypaltoken': paypaltoken,
                 'cart': cart,
                 'cancel_url': reverse('payments_cancel'),
                 'form_paypal_confirm': block,
                }
        
        return HttpResponse(my_render(request, param, 'payment_paypal_confirm'))        
    
    
    action = request.POST.get('action', 'cancel').lower()
    
    if action == 'confirm':
        
        paypal_gw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                                  password=settings.PAYPAL_PASSWORD,
                                  sign=settings.PAYPAL_SIGNATURE,
                                  debug=settings.PAYPAL_DEBUG)
       
        #return_url = request.build_absolute_uri(reverse("paypal_success"))
        #cancel_url = request.build_absolute_uri(reverse("paypal_cancel"))
        is_token_data = paypal_gw.GetExpressCheckoutDetails(paypaltoken.token, subject=paypal_settings.email)
        
        if not is_token_data:
            logging.critical("Error found when trying to do a GetExpressCheckoutDetails api call on Paypal. RESPONSE: %s" % paypal_gw.api_response)
            request.flash['message'] = unicode(_("Could not get transaction data from PayPal. Please contact admin to complete your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        
        ack = paypal_gw.api_response['ACK'][0]            
        
        if ack != "Success":
            logging.critical("Paypal Api Response Failure. RESPONSE: %s" % paypal_gw.api_response)
            request.flash['message'] = unicode(_("There was an error when trying to get data from PayPal. Please contact admin to complete your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        try:
            amount = decimal.Decimal(paypal_gw.api_response['PAYMENTREQUEST_0_AMT'][0])
        except KeyError:
            logging.critical("Fail when trying to read the payment amount. The API response don't have an AMT key. RESPONSE: %s" % paypal_gw.api_response)    
            request.flash['message'] = unicode(_("We have found an error when trying to validate your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        if amount != cart.total_with_taxes():
            request.flash['message'] = unicode(_("You have authorized us to charge you just $%s, but you want buy $%s! Please contact admin if you think this is a mistake!" % (amount, cart.total_with_taxes())))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
    
        payment_request = {
            'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
            'PAYMENTREQUEST_0_AMT': "%0.2f" % cart.total_with_taxes(), 
            #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
            #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
            #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
            'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
            'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
            'SUBJECT': paypal_settings.email
        }
        success = paypal_gw.DoExpressCheckoutPayment(payment_request, paypaltoken.token, payerid)
        
        
        if success:
            #Close and clean the cart
            sell = cart.close("PayPal")
            #Set the sell payments as paid
            sell.payment.pay()
            paypaltoken.confirmed = True
            paypaltoken.save()
            
            # {'PAYMENTINFO_0_TRANSACTIONTYPE': 'expresscheckout', 'ACK': 'Success', 'PAYMENTINFO_0_PAYMENTTYPE': 'instant', 'PAYMENTINFO_0_REASONCODE': 'None', 'SHIPPINGOPTIONISDEFAULT': 'false', 'INSURANCEOPTIONSELECTED': 'false', 'CORRELATIONID': '8d20dfd3e3575', 'PAYMENTINFO_0_TAXAMT': '0.00', 'PAYMENTINFO_0_TRANSACTIONID': '6MH53467HE876651A', 'PAYMENTINFO_0_PENDINGREASON': 'None', 'PAYMENTINFO_0_AMT': '57.00', 'PAYMENTINFO_0_PROTECTIONELIGIBILITY': 'Ineligible', 'PAYMENTINFO_0_ERRORCODE': '0', 'TOKEN': 'EC-7MR99474WD5992801', 'VERSION': '63.0', 'SUCCESSPAGEREDIRECTREQUESTED': 'false', 'BUILD': '1482946', 'PAYMENTINFO_0_CURRENCYCODE': 'USD', 'PAYMENTINFO_0_FEEAMT': '1.95', 'TIMESTAMP': '2010-09-08T18:03:24Z', 'PAYMENTINFO_0_ACK': 'Success', 'PAYMENTINFO_0_ORDERTIME': '2010-09-08T18:03:23Z', 'PAYMENTINFO_0_PAYMENTSTATUS': 'Completed'}
            txn_id = paypal_gw.api_response['PAYMENTINFO_0_TRANSACTIONID']
            
            transaction = PayPalTransaction()
            transaction.transaction_id = txn_id
            transaction.sell = sell
            transaction.save()
            
            return HttpResponseRedirect(reverse('payments_success'))
        else:
            request.flash['message'] = unicode(_("Payment Failed!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
    else:
        paypaltoken.delete()
        request.flash['message'] = unicode(_("Payment cancel!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))