Subversion Repositories SmartDukaan

Rev

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