Subversion Repositories SmartDukaan

Rev

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