Subversion Repositories SmartDukaan

Rev

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