Subversion Repositories SmartDukaan

Rev

Rev 17721 | Rev 18030 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 17721 Rev 18028
Line 6... Line 6...
6
'''
6
'''
7
from base64 import encode
7
from base64 import encode
8
from bs4 import BeautifulSoup
8
from bs4 import BeautifulSoup
9
from datetime import datetime, timedelta, date
9
from datetime import datetime, timedelta, date
10
from dtr.api.Order import process_rejects
10
from dtr.api.Order import process_rejects
11
from dtr.dao import Order, SubOrder, AmazonAffiliateInfo
11
from dtr.dao import Order, SubOrder, AmazonAffiliateInfo, obj
12
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
12
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
13
    ungzipResponse, tprint
13
    ungzipResponse, tprint
14
from dtr.sources.flipkart import todict, AFF_REPORT_URL
14
from dtr.sources.flipkart import todict, AFF_REPORT_URL
15
from dtr.storage.DataService import OrdersRaw, Orders, Order_Parse_Info, \
15
from dtr.storage.DataService import OrdersRaw, Orders, Order_Parse_Info, \
16
    All_user_addresses
16
    All_user_addresses
Line 21... Line 21...
21
import base64
21
import base64
22
import dtr
22
import dtr
23
import gzip
23
import gzip
24
import mechanize
24
import mechanize
25
import os.path
25
import os.path
-
 
26
import pyquery
26
import re
27
import re
27
import time
28
import time
28
import traceback
29
import traceback
29
import urllib2
30
import urllib2
30
import pyquery
-
 
31
 
31
 
32
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
32
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
33
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
33
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
34
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
34
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
35
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
35
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
Line 253... Line 253...
253
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
253
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
254
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
254
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
255
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
255
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
256
                subOrder.productCode = productUrl.split('/')[5]
256
                subOrder.productCode = productUrl.split('/')[5]
257
                subOrder.detailedStatus = detailedStatus
257
                subOrder.detailedStatus = detailedStatus
258
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice*quantity)
258
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice)
259
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
259
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
260
                subOrder.dealRank = dealRank.get('rank')
260
                subOrder.dealRank = dealRank.get('rank')
261
                subOrder.rankDesc = dealRank.get('description')
261
                subOrder.rankDesc = dealRank.get('description')
262
                subOrder.maxNlc = dealRank.get('maxNlc')
262
                subOrder.maxNlc = dealRank.get('maxNlc')
263
                subOrder.minNlc = dealRank.get('minNlc')
263
                subOrder.minNlc = dealRank.get('minNlc')
Line 265... Line 265...
265
                subOrder.itemStatus = dealRank.get('status')
265
                subOrder.itemStatus = dealRank.get('status')
266
                cashbackStatus = Store.CB_PENDING
266
                cashbackStatus = Store.CB_PENDING
267
                if cashbackAmount <= 0:
267
                if cashbackAmount <= 0:
268
                    cashbackStatus = Store.CB_NA
268
                    cashbackStatus = Store.CB_NA
269
                subOrder.cashBackStatus = cashbackStatus
269
                subOrder.cashBackStatus = cashbackStatus
270
                subOrder.cashBackAmount = cashbackAmount
270
                subOrder.cashBackAmount = cashbackAmount*quantity
271
                if percentage > 0:
271
                if percentage > 0:
272
                    subOrder.cashBackPercentage = percentage
272
                    subOrder.cashBackPercentage = percentage
273
                subOrders.append(subOrder)
273
                subOrders.append(subOrder)
274
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
274
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
275
        totalAmount = 0
275
        totalAmount = 0
Line 339... Line 339...
339
            subOrderStatus = statusDiv.div.span.text.strip()
339
            subOrderStatus = statusDiv.div.span.text.strip()
340
            try:
340
            try:
341
                deliverySpanTop = statusDiv.div.div.find_next_sibling('div').span
341
                deliverySpanTop = statusDiv.div.div.find_next_sibling('div').span
342
            except:
342
            except:
343
                pass
343
                pass
-
 
344
            if not deliverySpanTop:
344
            productDivs = innerBoxes[-1].div.div.div.findAll('div', recursive=False)
345
                productDivs = innerBoxes[-1].div.div.findAll('div', recursive=False)
345
            merchantOrder.subOrders = subOrders
346
            merchantOrder.subOrders = subOrders
-
 
347
            j=0
346
            for i, productDiv in enumerate(productDivs):
348
            for i, productDiv in enumerate(productDivs):
347
                deliverySpan = deliverySpanTop
349
                deliverySpan = deliverySpanTop
348
                j=i+1
-
 
349
                if not deliverySpanTop:
350
                if not deliverySpanTop:
350
                    if i%2==1:
351
                    if i%2==1:
351
                        continue
352
                        continue
352
                    j=i/2 + 1
-
 
353
                    deliverySpan = statusDiv.div.div.span
353
                    deliverySpan = productDiv.div.div.span
354
                imgDiv  = productDiv.div.div
354
                    productDiv = productDivs[i+1]
355
                detailDiv = imgDiv.find_next_sibling('div')
-
 
356
                detailDivs = detailDiv.findAll('div', recursive=False)
355
                for  prodRow in productDiv.findAll('div', recursive=False):
357
                arr = detailDivs[0].a.text.strip().split(" of ", 1)
-
 
358
                (productTitle, quantity) = (arr[-1], (1 if len(arr)==1 else int(arr[0])) )
-
 
359
                try:
356
                    j += 1
360
                    unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
-
 
361
                except:
357
                    imgDiv  = prodRow.div.div
362
                    unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
358
                    detailDiv = imgDiv.find_next_sibling('div')
363
                amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
359
                    detailDivs = detailDiv.findAll('div', recursive=False)
364
                productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
360
                    arr = re.split("^(\d+) of", detailDivs[0].a.text.strip())
365
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
-
 
366
                subOrder.productCode = productUrl.split('/')[5]
-
 
367
                subOrder.unitPrice = unitPrice
-
 
368
                subOrder.merchantSubOrderId = str(j) + " of " + merchantOrder.merchantOrderId
361
                    (productTitle, quantity) = (arr[-1], (1 if len(arr)<2 else int(arr[1])) )
369
                estDlvyTime = datetime.now()
-
 
370
                if deliverySpan is not None:
-
 
371
                    try:
362
                    try:
372
                        subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
363
                        unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
373
                        estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
-
 
374
                        subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
-
 
375
                        estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
-
 
376
                    except:
364
                    except:
-
 
365
                        unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
-
 
366
                    amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
-
 
367
                    productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
-
 
368
                    subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
-
 
369
                    subOrder.productCode = productUrl.split('/')[5]
-
 
370
                    subOrder.unitPrice = unitPrice
-
 
371
                    subOrder.merchantSubOrderId = str(j) + " of " + merchantOrder.merchantOrderId
-
 
372
                    estDlvyTime = datetime.now()
-
 
373
                    if deliverySpan is not None:
-
 
374
                        try:
-
 
375
                            subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
-
 
376
                            estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
-
 
377
                            subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
-
 
378
                            estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
-
 
379
                        except:
377
                        if "Delivered on" in deliverySpan.text:
380
                            if "Delivered on" in deliverySpan.text:
378
                            subOrder.deliveredOn = deliverySpan.text.split(":")[1].strip() 
381
                                subOrder.deliveredOn = deliverySpan.text.split(":")[1].strip() 
379
                        subOrder.estimatedDeliveryDate = "Not available"
382
                            subOrder.estimatedDeliveryDate = "Not available"
380
                        
383
                            
381
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
384
                    createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
382
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
385
                    subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
383
                subOrder.detailedStatus = subOrderStatus
386
                    subOrder.detailedStatus = subOrderStatus
384
                status=MStore.ORDER_PLACED
387
                    status=MStore.ORDER_PLACED
385
                try:
-
 
386
                    status = self._getStatusFromDetailedStatus(subOrderStatus)
-
 
387
                except:
-
 
388
                    try:
388
                    try:
389
                        dateString = subOrderStatus.split("Delivered ")[1].strip()
-
 
390
                        subOrder.status = MStore.ORDER_DELIVERED
-
 
391
                        subOrder.detailedStatus = 'Delivered'
-
 
392
                        dateString = getDateStringDelivered(dateString)
389
                        status = self._getStatusFromDetailedStatus(subOrderStatus)
393
                        if dateString is not None:
-
 
394
                            subOrder.deliveredOn = datetime.strftime(dateString, '%d-%b-%y')
-
 
395
                    except:
390
                    except:
396
                        try:
391
                        try:
397
                            dateString = subOrderStatus.split("Arriving ")[1].split("by")[0].strip()
392
                            dateString = subOrderStatus.split("Delivered ")[1].strip()
398
                            subOrder.status = MStore.ORDER_SHIPPED
393
                            subOrder.status = MStore.ORDER_DELIVERED
-
 
394
                            subOrder.detailedStatus = 'Delivered'
399
                            dateString = getDateStringArriving(dateString)
395
                            dateString = getDateStringDelivered(dateString)
400
                            if dateString is not None:
396
                            if dateString is not None:
401
                                subOrder.deliveryEstimate = datetime.strftime(dateString, '%d-%b-%y')
397
                                subOrder.deliveredOn = datetime.strftime(dateString, '%d-%b-%y')
402
                            else:
-
 
403
                                subOrder.deliveryEstimate = subOrderStatus.split("Arriving ")[1].split("by")[0].strip()
-
 
404
                        except:
398
                        except:
-
 
399
                            try:
-
 
400
                                dateString = subOrderStatus.split("Arriving ")[1].split("by")[0].strip()
-
 
401
                                subOrder.status = MStore.ORDER_SHIPPED
-
 
402
                                dateString = getDateStringArriving(dateString)
-
 
403
                                if dateString is not None:
-
 
404
                                    subOrder.deliveryEstimate = datetime.strftime(dateString, '%d-%b-%y')
-
 
405
                                else:
-
 
406
                                    subOrder.deliveryEstimate = subOrderStatus.split("Arriving ")[1].split("by")[0].strip()
-
 
407
                            except:
405
                            print "Unknown status Alert -", status
408
                                print "Unknown status Alert -", status
406
                
409
                    
407
                subOrder.deliveryCharges = shippingPrice
410
                    subOrder.deliveryCharges = shippingPrice
408
                if trackingUrl:
411
                    if trackingUrl:
409
                    subOrder.tracingkUrl  = trackingUrl
412
                        subOrder.tracingkUrl  = trackingUrl
410
                subOrder.imgUrl = imgDiv.img["src"]
413
                    subOrder.imgUrl = imgDiv.img["src"]
411
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid/unitPrice)
414
                    (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid/quantity)
412
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
415
                    dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
413
                subOrder.dealRank = dealRank.get('rank')
416
                    subOrder.dealRank = dealRank.get('rank')
414
                subOrder.rankDesc = dealRank.get('description')
417
                    subOrder.rankDesc = dealRank.get('description')
415
                cashbackStatus = Store.CB_PENDING
418
                    cashbackStatus = Store.CB_PENDING
416
                if cashbackAmount <= 0:
419
                    if cashbackAmount <= 0:
417
                    cashbackStatus = Store.CB_NA
420
                        cashbackStatus = Store.CB_NA
418
                subOrder.cashBackStatus = cashbackStatus
421
                    subOrder.cashBackStatus = cashbackStatus
419
                subOrder.cashBackAmount = cashbackAmount*quantity
422
                    subOrder.cashBackAmount = cashbackAmount*quantity
420
                if percentage > 0:
423
                    if percentage > 0:
421
                    subOrder.cashBackPercentage = percentage
424
                        subOrder.cashBackPercentage = percentage
422
                if hasattr(subOrder, 'deliveredOn') or subOrder.status==Store.ORDER_DELIVERED:                               
425
                    if hasattr(subOrder, 'deliveredOn') or subOrder.status==Store.ORDER_DELIVERED:                               
423
                    subOrder.status = Store.ORDER_DELIVERED
426
                        subOrder.status = Store.ORDER_DELIVERED
424
                    subOrder.closed = True
427
                        subOrder.closed = True
425
                    if subOrder.cashBackStatus == Store.CB_PENDING:
428
                        if subOrder.cashBackStatus == Store.CB_PENDING:
426
                        subOrder.cashBackStatus = Store.CB_APPROVED
429
                            subOrder.cashBackStatus = Store.CB_APPROVED
427
                elif closedStatus:
430
                    elif closedStatus:
428
                    closedStatus= False
431
                        closedStatus= False
429
                subOrders.append(subOrder)
432
                    subOrders.append(subOrder)
430
        merchantOrder.status='success'
433
        merchantOrder.status='success'
431
        merchantOrder.closed = closedStatus
434
        merchantOrder.closed = closedStatus
432
        self._updateToOrder(todict(merchantOrder))
435
        self._updateToOrder(todict(merchantOrder))
433
        
436
        
434
    def parseCancelled(self, merchantOrder,soup):
437
    def parseCancelled(self, merchantOrder,soup):
Line 769... Line 772...
769
 
772
 
770
 
773
 
771
def main():
774
def main():
772
    store = getStore(1)
775
    store = getStore(1)
773
    #[59433, 59472, 59487, 59503, 59545, 59549, 59573, 59591]
776
    #[59433, 59472, 59487, 59503, 59545, 59549, 59573, 59591]
774
    orders = list(session.query(OrdersRaw).filter_by(status = 'DETAIL_NOT_CREATED_UNKNOWN').filter(OrdersRaw.id > 61071).all())
777
#    orders = list(session.query(OrdersRaw).filter_by(status = 'DETAIL_NOT_CREATED_UNKNOWN').filter(OrdersRaw.id > 61071).all())
775
    session.close()
778
#    session.close()
776
    for o in orders:
779
#    for o in orders:
777
        try:
780
#        try:
778
            store.trackOrdersForUser(o.id, o.order_url, o.rawhtml)
781
#            store.trackOrdersForUser(o.id, o.order_url, o.rawhtml)
779
        finally:
782
#        finally:
780
            session.close()
783
#            session.close()
781
    #store.trackOrdersForUser(10466, 'https://www.amazon.in/gp/css/summary/edit.html?orderID=403-7498756-0837158', readSSh('/AmazonTrack/User10466/403-7498756-0837158'))
784
    #store.trackOrdersForUser(10466, 'https://www.amazon.in/gp/css/summary/edit.html?orderID=403-7498756-0837158', readSSh('/AmazonTrack/User10466/403-7498756-0837158'))
782
    #store.trackOrdersForUser(9031, 'https://www.amazon.in/gp/css/summary/edit.html?orderID=403-0812780-9465164', readSSh('/home/amit/sample.html'))
785
    store.trackOrdersForUser(46195, 'https://www.amazon.in/gp/css/summary/edit.html?orderID=171-4242740-7265932', readSSh('/home/amit/46195.html'))
783
    
786
    
784
def getSummaryFile(directory):
787
def getSummaryFile(directory):
785
    date1 = datetime(2015,1,1)
788
    date1 = datetime(2015,1,1)
786
    finalFile = None
789
    finalFile = None
787
    try:
790
    try:
Line 874... Line 877...
874
                return curDate
877
                return curDate
875
            except:
878
            except:
876
                print "Could not parse"
879
                print "Could not parse"
877
                return None 
880
                return None 
878
 
881
 
-
 
882
def main1():
-
 
883
    store = getStore(1)
-
 
884
    for merchantOrder in store.db.merchantOrder.find({"subOrders":{"$elemMatch":{"cashBackStatus":"Not Applicable", "cashBackPercentage":{"$gt":0}}}}):
-
 
885
        mo = obj(merchantOrder)
-
 
886
        for subOrder in mo.subOrders:
-
 
887
            subOrder.closed=False 
-
 
888
        print "orderId", mo.orderId
-
 
889
        store.populateDerivedFields(mo, False)
-
 
890
        store.db.merchantOrder.update({"orderId":mo.orderId}, {"$set":todict(mo)})
-
 
891
        break
-
 
892
        
-
 
893
 
879
def parseOrderNotCreated():
894
def parseOrderNotCreated():
880
    try:
895
    try:
881
        store=getStore(1)
896
        store=getStore(1)
882
        orders = session.query(OrdersRaw).filter_by(status='ORDER_NOT_CREATED_UNKNOWN').all()
897
        orders = session.query(OrdersRaw).filter_by(status='ORDER_NOT_CREATED_UNKNOWN').all()
883
        session.close()
898
        session.close()
Line 891... Line 906...
891
    
906
    
892
if __name__ == '__main__':
907
if __name__ == '__main__':
893
#    readSSh("/AmazonTrack/User2942/402-2467356-7564367")
908
#    readSSh("/AmazonTrack/User2942/402-2467356-7564367")
894
#    readSSh("/AmazonTrack/User10466/orderSummary18-11:21:32:36")
909
#    readSSh("/AmazonTrack/User10466/orderSummary18-11:21:32:36")
895
    #readSSh("/AmazonTrack/User2482/orderSummary20-11:09:17:47")
910
    #readSSh("/AmazonTrack/User2482/orderSummary20-11:09:17:47")
896
    main()
-
 
897
911
    main()
-
 
912