Subversion Repositories SmartDukaan

Rev

Rev 14815 | Rev 14847 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13774 amit.gupta 1
# coding=utf-8
13569 amit.gupta 2
'''
3
Created on Jan 15, 2015
4
 
5
@author: amit
6
'''
13774 amit.gupta 7
from base64 import encode
8
from bs4 import BeautifulSoup
14650 amit.gupta 9
from datetime import datetime, timedelta
10
from dtr.dao import Order, SubOrder, AmazonAffiliateInfo
14464 amit.gupta 11
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
14624 amit.gupta 12
    ungzipResponse, tprint
14650 amit.gupta 13
from dtr.sources.flipkart import todict, AFF_REPORT_URL
14749 amit.gupta 14
from dtr.utils.utils import fetchResponseUsingProxy
14162 amit.gupta 15
from paramiko import sftp
16
from paramiko.client import SSHClient
17
from paramiko.sftp_client import SFTPClient
14650 amit.gupta 18
import base64
19
import gzip
14624 amit.gupta 20
import mechanize
14285 amit.gupta 21
import os.path
14162 amit.gupta 22
import paramiko
13774 amit.gupta 23
import re
14033 amit.gupta 24
import time
13809 amit.gupta 25
import traceback
14650 amit.gupta 26
import urllib2
13774 amit.gupta 27
 
28
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
13810 amit.gupta 29
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
13823 amit.gupta 30
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
14624 amit.gupta 31
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
14650 amit.gupta 32
AMAZON_AFF_FILE_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/getReport?filename=saholic-21-orders-report-%s.tsv.gz'
13774 amit.gupta 33
class Store(MStore):
13821 amit.gupta 34
 
14032 amit.gupta 35
    orderStatusRegexMap = { MStore.ORDER_PLACED : ['ordered from', 'not yet dispatched','dispatching now', 'preparing for dispatch'],
14064 amit.gupta 36
                            MStore.ORDER_SHIPPED : ['dispatched on','dispatched', 'on the way', 'out for delivery', 'Out for delivery'],
14032 amit.gupta 37
                            MStore.ORDER_CANCELLED : ['return complete', 'refunded', 'cancelled'],
38
                            MStore.ORDER_DELIVERED : ['delivered']
13821 amit.gupta 39
                           }
13774 amit.gupta 40
 
41
    def __init__(self,store_id):
42
        super(Store, self).__init__(store_id)
43
 
44
    def getName(self):
14749 amit.gupta 45
        return "amazon"
13774 amit.gupta 46
 
14202 amit.gupta 47
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl, insert=False):
13796 amit.gupta 48
        resp = {}
14813 amit.gupta 49
        resp['result'] = 'ORDER_NOT_CREATED'
13821 amit.gupta 50
        if ORDER_SUCCESS_URL in orderSuccessUrl or THANKYOU_URL in orderSuccessUrl:
13774 amit.gupta 51
            try:
52
                soup = BeautifulSoup(rawHtml)
14608 amit.gupta 53
                try:
54
                    orderUrl = soup.find('div', {"id":"thank-you-box-wrapper"}).div.findAll('div', recursive=False)[1].a['href']
55
                    merchantOrderId = re.findall(r'.*&oid=(.*)&?.*?', orderUrl)[0]
56
                except:
57
                    merchantOrderId = soup.find(id="orders-list").div.span.b.text
14699 amit.gupta 58
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, True)
14211 amit.gupta 59
                order.orderSuccessUrl = ORDER_REDIRECT_URL % (merchantOrderId)
60
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 61
                order.requireDetail = True
14698 amit.gupta 62
                order.status = 'html_required'
14297 amit.gupta 63
                order.closed = None
14312 amit.gupta 64
                if self._saveToOrder(todict(order)):
65
                    resp['result'] = 'ORDER_CREATED'
66
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
67
                    resp["htmlRequired"] = True
68
                    resp['orderId'] = orderId
69
                else:
70
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
71
 
13774 amit.gupta 72
            except:
14813 amit.gupta 73
                #Write all cases here for Order Not created Known
14809 amit.gupta 74
                try:
14815 amit.gupta 75
                    if 'Securely redirecting you' in soup.h3.text.strip():
14813 amit.gupta 76
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14809 amit.gupta 77
                    else:
14813 amit.gupta 78
                        raise
14809 amit.gupta 79
                except:
14814 amit.gupta 80
                    try:
14815 amit.gupta 81
                        if soup.h1.text.strip() in ['This is a duplicate order', 'There was a problem with your payment.']:
14814 amit.gupta 82
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
83
                        else:
84
                            raise
85
                    except:
14815 amit.gupta 86
                        if soup.h3.text.strip() == 'Web page not available':
14814 amit.gupta 87
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14813 amit.gupta 88
            return resp
89
 
13774 amit.gupta 90
        else:
13781 amit.gupta 91
            try:
14722 amit.gupta 92
                mo = self.db.merchantOrder.find_one({"orderId":orderId})
93
                if mo is not None:
14749 amit.gupta 94
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
14722 amit.gupta 95
                    merchantOrder.createdOn = mo.get("createdOn")
96
                    merchantOrder.createdOnInt =  mo.get("createdOnInt")
97
                else:
14749 amit.gupta 98
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14464 amit.gupta 99
                soup = BeautifulSoup(rawHtml)
100
                try:
101
                    self.parseOldStlye(merchantOrder, soup)
102
                except:
14545 amit.gupta 103
                    try:
14566 amit.gupta 104
                        traceback.print_exc()
14545 amit.gupta 105
                        self.parseNewStlye(merchantOrder, soup)
106
                    except:
14566 amit.gupta 107
                        traceback.print_exc()
14545 amit.gupta 108
                        self.parseCancelled(merchantOrder, soup)
14813 amit.gupta 109
                resp['result'] = 'DETAIL_CREATED'
14319 amit.gupta 110
                return resp    
13781 amit.gupta 111
            except:
14813 amit.gupta 112
                order = self.db.merchantOrder.find_one({"orderId":orderId})
113
                if order is not None:
114
                    self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"parse_failed"}})
115
                print "Error occurred"
116
                resp['result'] = 'DETAIL_NOT_CREATED'
117
                traceback.print_exc()
118
            return resp    
13774 amit.gupta 119
 
13868 amit.gupta 120
    #This should be exposed from api for specific sources
121
    def scrapeStoreOrders(self):
14624 amit.gupta 122
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}})
123
        for merchantOrder in orders:
124
            try:
125
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
126
                closed = True
127
                map1 = {}
128
                for subOrder in merchantOrder.get("subOrders"):
129
                    if subOrder.get("closed"):
130
                        continue
131
                    elif subOrder.get("trackingUrl") is None:
132
                        closed = False
133
                        continue
134
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
135
                    trackingUrl = subOrder.get("trackingUrl")
136
                    if not map1.has_key(trackingUrl):
14749 amit.gupta 137
                        map1[trackingUrl] = self.parseTrackingUrl(trackingUrl)
14624 amit.gupta 138
                    newOrder = map1.get(trackingUrl)
139
                    newOrder['cashBackStatus'] = subOrder.get('cashBackStatus')
140
                    updateMap = self.getUpdateMap(newOrder)
141
                    print findMap, "\n", updateMap
142
                    bulk.find(findMap).update({'$set' : updateMap})
143
                    closed = closed and newOrder['closed']
14697 amit.gupta 144
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
14624 amit.gupta 145
                result = bulk.execute()
146
                tprint(result)
147
            except:
148
                tprint("Could not update " + str(merchantOrder['orderId']))
14692 amit.gupta 149
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
14624 amit.gupta 150
                traceback.print_exc()
151
 
14608 amit.gupta 152
 
153
 
14771 amit.gupta 154
    def parserest(self, soup):
155
        print "Hi"
156
        if soup.find('h1'):
157
            print "OK"
14608 amit.gupta 158
 
14464 amit.gupta 159
    def parseOldStlye(self, merchantOrder, soup):
160
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
161
        table = soup.body.findAll("table", recursive=False)[1]
162
        #print table
163
        tables = table.tr.td.findAll("table", recursive=False)
164
        for tr in tables[2].findAll("tr"):
165
            boldElement = tr.td.b
166
            if "Order Placed" in str(boldElement):
167
                merchantOrder.placedOn = boldElement.next_sibling.strip()
168
            if "order number" in str(boldElement):
169
                merchantOrder.merchantOrderId = boldElement.next_sibling.strip()
170
            if "Order Total" in str(boldElement):
171
                merchantOrder.paidAmount = int(float(boldElement.find('span').contents[-1].replace(',','')))
172
        anchors = table.tr.td.findAll("a", recursive=False)
173
        paymentAnchor = anchors.pop(-1)
174
 
175
        count = 0
176
        subOrders = []
177
        merchantOrder.subOrders = subOrders
178
        counter = 0 
179
        for anchor in anchors:
180
            count += 1
181
            tab = anchor.next_sibling
182
            status = MStore.ORDER_PLACED
183
            subStr = "Delivery #" + str(count) + ":"
184
            if subStr in  tab.find("b").text:
185
                detailedStatus = tab.find("b").text.replace(subStr, '').strip()
186
 
187
            tab = tab.next_sibling.next_sibling
188
            trs = tab.find("table").find('tbody').findAll("tr", recursive = False)
189
 
190
            estimatedDelivery = trs[0].td.find("b").next_sibling.strip()
191
 
192
            orderItemTrs = trs[1].findAll("td", recursive=False)[1].table.tbody.findAll("tr", recursive = False)
193
            i = -1
194
            for orderItemTr in orderItemTrs:
195
                i += 1
196
                if i%2 == 0:
197
                    continue
198
                counter += 1
199
                quantity =  int(re.findall(r'\d+', orderItemTr.td.contents[0])[0])
200
 
201
                productUrl = orderItemTr.td.contents[1].a["href"]
202
                productTitle = orderItemTr.td.contents[1].a.text
203
 
204
                unitPrice = int(float(orderItemTr.findAll('td')[1].span.text.replace('Rs. ','').replace(',','')))
205
 
206
 
207
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, unitPrice*quantity, status, quantity)
208
                subOrder.merchantSubOrderId = str(counter) + " of " + merchantOrder.merchantOrderId
209
                subOrder.estimatedDeliveryDate = estimatedDelivery
14722 amit.gupta 210
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
211
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
212
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 213
                subOrder.productCode = productUrl.split('/')[5]
214
                subOrder.detailedStatus = detailedStatus
215
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice*quantity)
216
                cashbackStatus = Store.CB_PENDING
217
                if cashbackAmount <= 0:
218
                    cashbackStatus = Store.CB_NA
219
                subOrder.cashBackStatus = cashbackStatus
220
                subOrder.cashBackAmount = cashbackAmount
221
                if percentage > 0:
222
                    subOrder.cashBackPercentage = percentage
223
                subOrders.append(subOrder)
224
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
225
        totalAmount = 0
226
        grandAmount = 0
227
        for price in priceList:
228
            labelTd = price.td
229
            if 'Subtotal:' in labelTd.text:
230
                totalAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
231
            elif 'Grand Total:' in labelTd.text:
232
                grandAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
233
        if grandAmount < totalAmount:
234
            diff = totalAmount - grandAmount
235
            for subOrder in merchantOrder.subOrders:
236
                subOrder.amountPaid -= int(diff*(1-subOrder.amountPaid/totalAmount))
14698 amit.gupta 237
        merchantOrder.status='success'
14464 amit.gupta 238
        self._updateToOrder(todict(merchantOrder))
239
 
240
    def parseNewStlye(self, merchantOrder, soup):
241
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
242
        orderDetailsContainer = soup.body.find(id="orderDetails")
14566 amit.gupta 243
        divAfterH1 = orderDetailsContainer.h1.next_sibling.next_sibling
244
        orderLeftDiv = divAfterH1.div
14464 amit.gupta 245
        placedOnSpan = orderLeftDiv.find("span", {'class':'order-date-invoice-item'})
246
        merchantOrder.placedOn =placedOnSpan.text.split('Ordered on')[1].strip()
247
        merchantOrder.merchantOrderId = placedOnSpan.next_sibling.next_sibling.text.split('Order#')[1].strip()
14566 amit.gupta 248
        priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box-inner"}).div.div.findAll('div', recursive=False)[-1]
14464 amit.gupta 249
        priceRows = priceBox.findAll('div', {'class':'a-row'})
250
        subTotal = 0
14566 amit.gupta 251
        shippingPrice = 0   
14464 amit.gupta 252
        promoApplied = 0
253
        for priceRow in priceRows:
254
            if "Item(s) Subtotal:" in str(priceRow):
255
                subTotal = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
256
            elif "Shipping:" in str(priceRow):
257
                shippingPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
258
            elif "Grand Total:" in str(priceRow):
259
                grandPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
260
                merchantOrder.paidAmount = grandPrice
261
            elif "Total:" in str(priceRow):
262
                totalPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
263
            elif "Promotion Applied:" in str(priceRow):
264
                promoApplied  += int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
265
        totalPaid = subTotal        
266
        if promoApplied > 0:
267
            totalPaid -= promoApplied
268
            if shippingPrice <= promoApplied:
269
                totalPaid  += shippingPrice
270
 
271
        shipmentDivs = orderDetailsContainer.find('div', {'class':'a-box shipment'}).findAll('div', recursive = False)
272
        subOrders = []
273
        merchantOrder.subOrders = subOrders
274
        i=1
275
        for shipmentDiv in shipmentDivs:
276
            innerBoxes = shipmentDiv.findAll('div', recursive = False)
277
            statusDiv = innerBoxes[0]
278
            subOrderStatus = statusDiv.div.span.text.strip()
14566 amit.gupta 279
            deliverySpan = statusDiv.div.div.find_next_sibling('div').span
14464 amit.gupta 280
            productDivs = innerBoxes[-1].div.div.div.findAll('div', recursive=False)
281
            subOrders = []
282
            merchantOrder.subOrders = subOrders
283
            for i, productDiv in enumerate(productDivs):
284
                i +=1 
285
                imgDiv  = productDiv.div.div
286
                detailDiv = imgDiv.find_next_sibling('div')
287
                detailDivs = detailDiv.findAll('div', recursive=False)
288
                arr = detailDivs[0].a.text.strip().split(" of ", 1)
14465 amit.gupta 289
                (productTitle, quantity) = (arr[-1], (1 if len(arr)==1 else int(arr[0])) )
14820 amit.gupta 290
                try:
291
                    unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
292
                except:
293
                    unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
14464 amit.gupta 294
                amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
295
                productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
296
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
297
                subOrder.productCode = productUrl.split('/')[5]
298
                subOrder.unitPrice = unitPrice
14566 amit.gupta 299
                subOrder.merchantSubOrderId = str(i) + " of " + merchantOrder.merchantOrderId
14722 amit.gupta 300
                estDlvyTime = datetime.now()
14566 amit.gupta 301
                if deliverySpan is not None:
14756 amit.gupta 302
                    try:
303
                        subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
304
                        estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
305
                        subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
306
                        estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
307
                    except:
308
                        subOrder.estimatedDeliveryDate = "Not available"
14722 amit.gupta 309
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
14756 amit.gupta 310
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 311
                subOrder.detailedStatus = subOrderStatus
312
                subOrder.deliveryCharges = shippingPrice
14466 amit.gupta 313
                subOrder.imgUrl = imgDiv.img["src"]
14464 amit.gupta 314
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid)
315
                cashbackStatus = Store.CB_PENDING
316
                if cashbackAmount <= 0:
317
                    cashbackStatus = Store.CB_NA
318
                subOrder.cashBackStatus = cashbackStatus
319
                subOrder.cashBackAmount = cashbackAmount
320
                if percentage > 0:
321
                    subOrder.cashBackPercentage = percentage
322
                subOrders.append(subOrder)
14698 amit.gupta 323
        merchantOrder.status='success'
14464 amit.gupta 324
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 325
 
326
    def parseCancelled(self, merchantOrder,soup):
14722 amit.gupta 327
        try:
328
            fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
329
            if fonts[0].text == "Important Message":
330
                if fonts[1].text=="This order has been cancelled.":
331
                    merchantOrder.closed = True
332
                    merchantOrder.status = "cancelled"
333
                    merchantOrder.requireDetail = False
334
                    self._updateToOrder(todict(merchantOrder))
335
                    return
336
                else:
337
                    raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14545 amit.gupta 338
            else:
339
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14722 amit.gupta 340
        except:
14549 amit.gupta 341
            orderDetails = soup.body.find(id="orderDetails")
342
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
343
                merchantOrder.closed = True
14698 amit.gupta 344
                merchantOrder.status = "cancelled"
14549 amit.gupta 345
                merchantOrder.requireDetail = False
346
                self._updateToOrder(todict(merchantOrder))
347
            else:
348
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 349
 
13868 amit.gupta 350
    def getTrackingUrls(self, userId):
14074 amit.gupta 351
 
352
        missingOrderUrls = []
353
        missingOrders = self._getMissingOrders({'userId':userId})
354
        for missingOrder in missingOrders:
355
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
14683 amit.gupta 356
        orders = self._getActiveOrders({'userId':userId, "subOrders.trackingUrl":{"$exists":False} })
13882 amit.gupta 357
        count = len(orders)
13879 amit.gupta 358
        print "count", count
13868 amit.gupta 359
        if count > 0:
14684 amit.gupta 360
            return missingOrderUrls + ['https://www.amazon.in/gp/css/order-history', 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled', 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled&startIndex=10']
13959 amit.gupta 361
        else: 
14074 amit.gupta 362
            return missingOrderUrls
13927 amit.gupta 363
 
364
    def trackOrdersForUser(self, userId, url, rawHtml):
14285 amit.gupta 365
        directory = "/tmp/User" + str(userId)
366
        if not os.path.exists(directory):
367
            os.makedirs(directory)
14298 amit.gupta 368
        filename = directory + "/" + str(datetime.now())
369
        print "filename---", filename
370
        f = open(filename,'w')
14173 amit.gupta 371
        f.write(rawHtml) # python will convert \n to os.linesep
372
        f.close() # you can omit in most cases as the destructor will call if
373
 
13995 amit.gupta 374
        try:
375
            searchMap = {'userId':userId}
376
            collectionMap = {'merchantOrderId':1}
377
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 378
            datetimeNow = datetime.now()
379
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 380
            print "url----------------", url
14008 amit.gupta 381
 
14320 amit.gupta 382
            if url == 'https://www.amazon.in/gp/css/order-history' or 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled' in url:
13995 amit.gupta 383
                soup = BeautifulSoup(rawHtml)
384
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
385
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
386
                for activeOrder in activeOrders:
387
                    for orderEle in allOrders:
388
                        orderdiv = orderEle.find('div', {'class':'a-box a-color-offset-background order-info'}).find('div', {'class':'a-fixed-right-grid-col actions a-col-right'})
389
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
390
                        if merchantOrderId==activeOrder['merchantOrderId']:
391
                            closed = True
392
                            shipments = orderEle.findAll('div',{'class':re.compile('.*?a-box.*?')}, recursive=False)
393
                            shipments.pop(0)
394
                            for shipment in shipments:
395
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 396
                                sdivs = shipment.div.div.findAll('div', recursive=False)
14065 amit.gupta 397
                                orderStatus = sdivs[0].span.text.strip()
14050 amit.gupta 398
                                status = self._getStatusFromDetailedStatus(orderStatus)
399
                                if status == MStore.ORDER_DELIVERED:
14299 amit.gupta 400
                                    deliveredOn = sdivs[0].findAll('span')[-1].text.strip()
14050 amit.gupta 401
                                    deliveredOn = deliveredOn.split(":")[1].strip()
14335 amit.gupta 402
                                deliveryestimatespan = sdivs[0].find('span', {'class':'a-color-success'})
403
                                deliveryEstimate = None
404
                                if deliveryestimatespan is not None:
405
                                    deliveryEstimate = deliveryestimatespan.find('span', {'class':'a-text-bold'}).text.strip()
406
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 407
                                trackingUrl = None
408
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
409
                                    if buttonDiv.find('a').text.strip()=='Track package':
410
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
411
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 412
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 413
                                        break
414
                                for prodDiv in productDivs:
415
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
416
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
417
                                    imgUrl = prodDiv.find("img")["src"]
418
                                    for subOrder in activeOrder['subOrders']:
419
                                        if subOrder['productTitle'] == productTitle:
420
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
421
                                            updateMap = {}
422
                                            closedStatus = False
423
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 424
                                            updateMap['subOrders.$.lastTracked'] = timestamp
13995 amit.gupta 425
                                            updateMap['subOrders.$.detailedStatus'] = orderStatus
426
                                            cashbackStatus = subOrder.get("cashBackStatus")
427
                                            updateMap['subOrders.$.status'] = status 
428
 
429
                                            if status==MStore.ORDER_DELIVERED:                               
14291 amit.gupta 430
                                                updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 431
                                                closedStatus = True
432
                                                updateMap['subOrders.$.closed'] = True
433
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 434
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 435
                                            if status==MStore.ORDER_CANCELLED:     
436
                                                closedStatus = True
437
                                                updateMap['subOrders.$.closed'] = True
438
                                                if cashbackStatus == Store.CB_PENDING:
439
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
440
                                            if status==MStore.ORDER_SHIPPED:   
441
                                                updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
442
                                                if trackingUrl is not None:
443
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
444
                                            if not closedStatus:
445
                                                closed = False
446
                                            bulk.find(findMap).update({'$set' : updateMap})
447
                                            break
448
                            bulk.find({'orderId': activeOrder['orderId']}).update({'$set':{'closed': closed}})            
14080 amit.gupta 449
                bulk.execute()
450
                return 'PARSED_SUCCESS'
451
            else:
14086 amit.gupta 452
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0] 
14085 amit.gupta 453
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14312 amit.gupta 454
                self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, False)['result']
14080 amit.gupta 455
                return 'PARSED_SUCCESS'
456
                pass
14008 amit.gupta 457
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 458
        except:
459
            traceback.print_exc()    
460
            return 'PARSED_FAILED'
461
 
462
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 463
        if "ordered from" in detailedStatus.lower():
464
            return MStore.ORDER_PLACED 
465
 
13995 amit.gupta 466
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 467
            if detailedStatus.lower() in value:
13995 amit.gupta 468
                return key
469
 
14676 amit.gupta 470
        print "Detailed Status need to be mapped", "Store:", self.store_id
13995 amit.gupta 471
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 472
    def scrapeAffiliate(self, startDate=None, endDate=None):
14650 amit.gupta 473
        br = getBrowserObject()
474
        br.add_password('https://assoc-datafeeds-eu.amazon.com', 'Saholic', 'Fnubyvp')
475
        url = AMAZON_AFF_URL
476
        response = br.open(url)
477
        #get data for past 40 days and store it to mongo
478
        dt = datetime.now()
14701 amit.gupta 479
        dat = dt - timedelta(days=2)
14651 amit.gupta 480
        url = AMAZON_AFF_FILE_URL%(datetime.strftime(dat, "%Y%m%d"))
481
        response = br.open(url)
482
        page = gzip.GzipFile(fileobj=response, mode='rb').read()
483
        j=-1
484
        for row in page.split("\n"):
485
            j += 1
486
            if j== 0 or j==1:
487
                continue
488
            fields = row.split("\t")
489
            if len(fields)>1:
490
                print fields
491
                amazonAffiliate = AmazonAffiliateInfo(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8], fields[9])
492
                print amazonAffiliate
493
                self.db.amazonAffiliateInfo.insert(todict(amazonAffiliate))
494
            else:
495
                break
14650 amit.gupta 496
 
14608 amit.gupta 497
 
14749 amit.gupta 498
    def parseTrackingUrl(self, trackingUrl):
14624 amit.gupta 499
        subOrder = {}
14749 amit.gupta 500
        page = fetchResponseUsingProxy(trackingUrl)
14624 amit.gupta 501
        soup = BeautifulSoup(page)
502
        alertContainer = soup.find("div", {"class":"a-box-inner a-alert-container"})
503
        if alertContainer is not None:
504
            statusText = alertContainer.h4.span.text
505
            detailedStatus = statusText.split(":")[0].strip()
506
            subOrder['detailedStatus'] = detailedStatus
507
            if detailedStatus.lower() == "in transit":
508
                pass
509
            elif detailedStatus.lower() == "undeliverable":
510
                subOrder['status'] = MStore.ORDER_CANCELLED
511
                return subOrder
512
        else:
513
            summaryLeft = soup.find(id="summaryLeft")
514
            statusText = summaryLeft.h2.text
515
            detailedStatus = statusText.split(":")[0].strip()
516
            subOrder['detailedStatus'] = detailedStatus
517
            if detailedStatus.lower() == "delivered":
518
                subOrder['deliveredOn'] = summaryLeft.findAll("span")[-2].text.strip()
519
                subOrder['status'] = MStore.ORDER_DELIVERED
520
                return subOrder
521
            else:
522
                subOrder['expectedDelivery'] = summaryLeft.findAll("span")[-1].text.strip()
523
        return subOrder
524
 
525
 
526
 
14608 amit.gupta 527
 
528
 
13927 amit.gupta 529
 
530
 
13774 amit.gupta 531
def main():
532
    store = getStore(1)
14756 amit.gupta 533
    #store.scrapeStoreOrders()
14650 amit.gupta 534
#    br = mechanize.Browser()
535
#    br.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
536
#                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
537
#                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
538
#                     ('Accept-Language', 'en-US,en;q=0.8'),                     
539
#                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
540
#    store.scrapeStoreOrders()
14813 amit.gupta 541
    store.parseOrderRawHtml(1306, "13232", 14, readSSh("/home/amit/322.html"), "https://www.amazon.in/gp/css/summary/edit.html?orderID=171-5570474-5548341")
14722 amit.gupta 542
    #store.parseOrderRawHtml(2121, "13232", 14, readSSh("/home/amit/f1.html"), "https://www.amazon.in/gp/css/summary/edit.html?orderID=171-5196461-3230730")
14813 amit.gupta 543
    #readSSh("/tmp/User211/2015-04-12 10:32:41.905765")
14703 amit.gupta 544
    #store.scrapeAffiliate()
14162 amit.gupta 545
def readSSh(fileName):
546
    try:
547
            str1 = open(fileName).read()
548
            return str1
549
    except:
550
        ssh_client = SSHClient()
551
        str1 = ""
552
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
553
        ssh_client.connect('104.200.25.40', 22, 'root', 'ecip$dtrMay2014')
554
        sftp_client = ssh_client.open_sftp()
555
        try:
14299 amit.gupta 556
            if not os.path.exists(os.path.dirname(fileName)):
557
                os.makedirs(os.path.dirname(fileName))
14162 amit.gupta 558
            sftp_client.get(fileName, fileName)
559
            try:
560
                str1 = open(fileName).read()
561
                return str1
562
            finally:
563
                pass
564
        except:
565
            "could not read"
566
        return str1
13774 amit.gupta 567
 
568
 
569
if __name__ == '__main__':
14284 amit.gupta 570
        main()