X-Git-Url: https://svn.cri.ensmp.fr/git/photoprint.git/blobdiff_plain/62d7ffc1ecbda7e9c9b46f6419dc9d74c87f419d..1c64d06aeb63ed19c799e296996d012067b3990e:/order.py?ds=inline diff --git a/order.py b/order.py index 815171b..6966ff3 100755 --- a/order.py +++ b/order.py @@ -30,6 +30,7 @@ from AccessControl import ClassSecurityInfo from AccessControl.requestmethod import postonly from zope.interface import implements from zope.component.factory import Factory +from persistent.list import PersistentList from OFS.SimpleItem import SimpleItem from ZTUtils import make_query from DateTime import DateTime @@ -44,7 +45,11 @@ from price import Price from xml.dom.minidom import Document from tool import COPIES_COUNTERS from App.config import getConfiguration -from paypal.interface import PayPalInterface +try : + from paypal.interface import PayPalInterface + paypalAvailable = True +except ImportError : + paypalAvailable = False from logging import getLogger console = getLogger('Products.photoprint.order') @@ -178,16 +183,18 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : self.id = id self.items = [] self.quantity = 0 + self.discount = 0 # discount ratio in percent self.price = Price(0, 0) # billing and shipping addresses self.billing = PersistentMapping() self.shipping = PersistentMapping() self.shippingFees = Price(0,0) - self._paymentResponse = PersistentMapping() + self._paypalLog = PersistentList() @property def amountWithFees(self) : - return self.price + self.shippingFees + coeff = (100 - self.discount) / 100. + return self.price * coeff + self.shippingFees security.declareProtected(ModifyPortalContent, 'editBilling') @@ -218,6 +225,7 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : pptool = getToolByName(self, 'portal_photo_print') uidh = getToolByName(self, 'portal_uidhandler') mtool = getToolByName(self, 'portal_membership') + utool = getToolByName(self, 'portal_url') items = [] for item in cart : @@ -246,6 +254,9 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : counters.confirm(reference, quantity) self.items = tuple(items) + discount_script = getattr(utool.getPortalObject(), 'photoprint_discount', None) + if discount_script : + self.discount = discount_script(self.price, self.quantity) member = mtool.getAuthenticatedMember() mg = lambda name : member.getProperty(name, '') @@ -310,12 +321,10 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : portal = utool.getPortalObject() member = mtool.getAuthenticatedMember() - options = {#'PAYMENTREQUEST_0_AMT' : '99.55', # todo - 'PAYMENTREQUEST_0_CURRENCYCODE' : 'EUR', + options = {'PAYMENTREQUEST_0_CURRENCYCODE' : 'EUR', 'PAYMENTREQUEST_0_PAYMENTACTION' : 'Sale', 'RETURNURL' : '%s/photoprint_order_confirm' % self.absolute_url(), 'CANCELURL' : '%s/photoprint_order_cancel' % self.absolute_url(), - # 'CALLBACK' : TODO 'ALLOWNOTE' : 0, # The buyer is unable to enter a note to the merchant. 'HDRIMG' : '%s/logo.gif' % portal_url, 'EMAIL' : member.getProperty('email'), @@ -326,8 +335,6 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : 'GIFTRECEIPTENABLE' : 0, 'BUYEREMAILOPTINENABLE' : 0, # Do not enable buyer to provide email address. 'NOSHIPPING' : 1, # PayPal does not display shipping address fields whatsoever. - # 'PAYMENTREQUEST_0_NOTIFYURL' : TODO - 'PAYMENTREQUEST_0_SHIPTONAME' : self.billing['name'], 'PAYMENTREQUEST_0_SHIPTOSTREET' : self.billing['address'], 'PAYMENTREQUEST_0_SHIPTOCITY' : self.billing['city'], @@ -336,26 +343,24 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : } if len(self.items) > 1 : - quantitySum = reduce(lambda a, b : a['quantity'] + b['quantity'], self.items) + quantitySum = reduce(lambda a, b : a + b, [item['quantity'] for item in self.items]) else : quantitySum = self.items[0]['quantity'] total = round(self.amountWithFees.getValues()['taxed'], 2) - options['L_PAYMENTREQUEST_0_NAME0'] = 'Commande realis photo ref. %s' % self.getId() + options['L_PAYMENTREQUEST_0_NAME0'] = 'Commande photo ref. %s' % self.getId() if quantitySum == 1 : options['L_PAYMENTREQUEST_0_DESC0'] = "Commande d'un tirage photographique" else : options['L_PAYMENTREQUEST_0_DESC0'] = 'Commande de %d tirages photographiques' % quantitySum options['L_PAYMENTREQUEST_0_AMT0'] = total options['PAYMENTINFO_0_SHIPPINGAMT'] = round(self.shippingFees.getValues()['taxed'], 2) - # options['L_PAYMENTREQUEST_0_TAXAMT0'] = tax - # options['L_PAYMENTREQUEST_0_QTY%d' % n] = 1 options['PAYMENTREQUEST_0_AMT'] = total ppi = self._initPayPalInterface() response = ppi.set_express_checkout(**options) response = PrintOrder.recordifyPPResp(response) - # self._paypalLog.append(response) + self._paypalLog.append(response) response['url'] = ppi.generate_express_checkout_redirect_url(response['TOKEN']) console.info(options) console.info(response) @@ -366,7 +371,7 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : ppi = self._initPayPalInterface() response = ppi.get_express_checkout_details(TOKEN=token) response = PrintOrder.recordifyPPResp(response) - # self._paypalLog.append(response) + self._paypalLog.append(response) return response security.declarePrivate('ppDoExpressCheckoutPayment') @@ -378,7 +383,7 @@ class PrintOrder(PortalContent, DefaultDublinCoreImpl) : TOKEN=token, PAYERID=payerid) response = PrintOrder.recordifyPPResp(response) - # self._paypalLog.append(response) + self._paypalLog.append(response) return response security.declareProtected(ModifyPortalContent, 'ppPay')