Subversion Repositories SmartDukaan

Rev

Rev 14698 | Rev 14701 | 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
14699 amit.gupta 56
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, True)
14211 amit.gupta 57
                order.orderSuccessUrl = ORDER_REDIRECT_URL % (merchantOrderId)
58
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 59
                order.requireDetail = True
14698 amit.gupta 60
                order.status = 'html_required'
14297 amit.gupta 61
                order.closed = None
14312 amit.gupta 62
                if self._saveToOrder(todict(order)):
63
                    resp['result'] = 'ORDER_CREATED'
64
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
65
                    resp["htmlRequired"] = True
66
                    resp['orderId'] = orderId
67
                else:
68
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
69
 
13796 amit.gupta 70
                return resp
13774 amit.gupta 71
            except:
14312 amit.gupta 72
                resp["result"] = 'ORDER_NOT_CREATED'
13796 amit.gupta 73
                return resp
13774 amit.gupta 74
 
75
        else:
13781 amit.gupta 76
            try:
14699 amit.gupta 77
                merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
14464 amit.gupta 78
                soup = BeautifulSoup(rawHtml)
79
                try:
80
                    self.parseOldStlye(merchantOrder, soup)
81
                except:
14545 amit.gupta 82
                    try:
14566 amit.gupta 83
                        traceback.print_exc()
14545 amit.gupta 84
                        self.parseNewStlye(merchantOrder, soup)
85
                    except:
14566 amit.gupta 86
                        traceback.print_exc()
14545 amit.gupta 87
                        self.parseCancelled(merchantOrder, soup)
14319 amit.gupta 88
                resp['result'] = 'ORDER_CREATED'
89
                return resp    
13781 amit.gupta 90
            except:
14698 amit.gupta 91
                order = self.db.merchantOrder.findOne({"orderId":orderId})
14682 amit.gupta 92
                if order is not None:
14698 amit.gupta 93
                    self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"parse_failed"}})
13809 amit.gupta 94
                print "Error occurred"
95
                traceback.print_exc()
14312 amit.gupta 96
                resp['result'] = 'ORDER_NOT_CREATED'
13796 amit.gupta 97
                return resp    
13774 amit.gupta 98
 
13868 amit.gupta 99
    #This should be exposed from api for specific sources
100
    def scrapeStoreOrders(self):
14624 amit.gupta 101
        br = getBrowserObject()
102
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}})
103
        for merchantOrder in orders:
104
            try:
105
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
106
                closed = True
107
                map1 = {}
108
                for subOrder in merchantOrder.get("subOrders"):
109
                    if subOrder.get("closed"):
110
                        continue
111
                    elif subOrder.get("trackingUrl") is None:
112
                        closed = False
113
                        continue
114
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
115
                    trackingUrl = subOrder.get("trackingUrl")
116
                    if not map1.has_key(trackingUrl):
117
                        map1[trackingUrl] = self.parseTrackingUrl(br, trackingUrl)
118
                    newOrder = map1.get(trackingUrl)
119
                    newOrder['cashBackStatus'] = subOrder.get('cashBackStatus')
120
                    updateMap = self.getUpdateMap(newOrder)
121
                    print findMap, "\n", updateMap
122
                    bulk.find(findMap).update({'$set' : updateMap})
123
                    closed = closed and newOrder['closed']
14697 amit.gupta 124
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
14624 amit.gupta 125
                result = bulk.execute()
126
                tprint(result)
127
            except:
128
                tprint("Could not update " + str(merchantOrder['orderId']))
14692 amit.gupta 129
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
14624 amit.gupta 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))
14698 amit.gupta 210
        merchantOrder.status='success'
14464 amit.gupta 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)
14698 amit.gupta 284
        merchantOrder.status='success'
14464 amit.gupta 285
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 286
 
287
    def parseCancelled(self, merchantOrder,soup):
288
        fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
289
        if fonts[0].text == "Important Message":
290
            if fonts[1].text=="This order has been cancelled.":
291
                merchantOrder.closed = True
14698 amit.gupta 292
                merchantOrder.status = "cancelled"
14545 amit.gupta 293
                merchantOrder.requireDetail = False
294
                self._updateToOrder(todict(merchantOrder))
295
            else:
296
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14549 amit.gupta 297
        else:
298
            orderDetails = soup.body.find(id="orderDetails")
299
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
300
                merchantOrder.closed = True
14698 amit.gupta 301
                merchantOrder.status = "cancelled"
14549 amit.gupta 302
                merchantOrder.requireDetail = False
303
                self._updateToOrder(todict(merchantOrder))
304
            else:
305
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 306
 
13868 amit.gupta 307
    def getTrackingUrls(self, userId):
14074 amit.gupta 308
 
309
        missingOrderUrls = []
310
        missingOrders = self._getMissingOrders({'userId':userId})
311
        for missingOrder in missingOrders:
312
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
14683 amit.gupta 313
        orders = self._getActiveOrders({'userId':userId, "subOrders.trackingUrl":{"$exists":False} })
13882 amit.gupta 314
        count = len(orders)
13879 amit.gupta 315
        print "count", count
13868 amit.gupta 316
        if count > 0:
14684 amit.gupta 317
            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 318
        else: 
14074 amit.gupta 319
            return missingOrderUrls
13927 amit.gupta 320
 
321
    def trackOrdersForUser(self, userId, url, rawHtml):
14285 amit.gupta 322
        directory = "/tmp/User" + str(userId)
323
        if not os.path.exists(directory):
324
            os.makedirs(directory)
14298 amit.gupta 325
        filename = directory + "/" + str(datetime.now())
326
        print "filename---", filename
327
        f = open(filename,'w')
14173 amit.gupta 328
        f.write(rawHtml) # python will convert \n to os.linesep
329
        f.close() # you can omit in most cases as the destructor will call if
330
 
13995 amit.gupta 331
        try:
332
            searchMap = {'userId':userId}
333
            collectionMap = {'merchantOrderId':1}
334
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 335
            datetimeNow = datetime.now()
336
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 337
            print "url----------------", url
14008 amit.gupta 338
 
14320 amit.gupta 339
            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 340
                soup = BeautifulSoup(rawHtml)
341
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
342
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
343
                for activeOrder in activeOrders:
344
                    for orderEle in allOrders:
345
                        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'})
346
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
347
                        if merchantOrderId==activeOrder['merchantOrderId']:
348
                            closed = True
349
                            shipments = orderEle.findAll('div',{'class':re.compile('.*?a-box.*?')}, recursive=False)
350
                            shipments.pop(0)
351
                            for shipment in shipments:
352
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 353
                                sdivs = shipment.div.div.findAll('div', recursive=False)
14065 amit.gupta 354
                                orderStatus = sdivs[0].span.text.strip()
14050 amit.gupta 355
                                status = self._getStatusFromDetailedStatus(orderStatus)
356
                                if status == MStore.ORDER_DELIVERED:
14299 amit.gupta 357
                                    deliveredOn = sdivs[0].findAll('span')[-1].text.strip()
14050 amit.gupta 358
                                    deliveredOn = deliveredOn.split(":")[1].strip()
14335 amit.gupta 359
                                deliveryestimatespan = sdivs[0].find('span', {'class':'a-color-success'})
360
                                deliveryEstimate = None
361
                                if deliveryestimatespan is not None:
362
                                    deliveryEstimate = deliveryestimatespan.find('span', {'class':'a-text-bold'}).text.strip()
363
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 364
                                trackingUrl = None
365
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
366
                                    if buttonDiv.find('a').text.strip()=='Track package':
367
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
368
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 369
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 370
                                        break
371
                                for prodDiv in productDivs:
372
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
373
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
374
                                    imgUrl = prodDiv.find("img")["src"]
375
                                    for subOrder in activeOrder['subOrders']:
376
                                        if subOrder['productTitle'] == productTitle:
377
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
378
                                            updateMap = {}
379
                                            closedStatus = False
380
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 381
                                            updateMap['subOrders.$.lastTracked'] = timestamp
13995 amit.gupta 382
                                            updateMap['subOrders.$.detailedStatus'] = orderStatus
383
                                            cashbackStatus = subOrder.get("cashBackStatus")
384
                                            updateMap['subOrders.$.status'] = status 
385
 
386
                                            if status==MStore.ORDER_DELIVERED:                               
14291 amit.gupta 387
                                                updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 388
                                                closedStatus = True
389
                                                updateMap['subOrders.$.closed'] = True
390
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 391
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 392
                                            if status==MStore.ORDER_CANCELLED:     
393
                                                closedStatus = True
394
                                                updateMap['subOrders.$.closed'] = True
395
                                                if cashbackStatus == Store.CB_PENDING:
396
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
397
                                            if status==MStore.ORDER_SHIPPED:   
398
                                                updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
399
                                                if trackingUrl is not None:
400
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
401
                                            if not closedStatus:
402
                                                closed = False
403
                                            bulk.find(findMap).update({'$set' : updateMap})
404
                                            break
405
                            bulk.find({'orderId': activeOrder['orderId']}).update({'$set':{'closed': closed}})            
14080 amit.gupta 406
                bulk.execute()
407
                return 'PARSED_SUCCESS'
408
            else:
14086 amit.gupta 409
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0] 
14085 amit.gupta 410
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14312 amit.gupta 411
                self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, False)['result']
14080 amit.gupta 412
                return 'PARSED_SUCCESS'
413
                pass
14008 amit.gupta 414
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 415
        except:
416
            traceback.print_exc()    
417
            return 'PARSED_FAILED'
418
 
419
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 420
        if "ordered from" in detailedStatus.lower():
421
            return MStore.ORDER_PLACED 
422
 
13995 amit.gupta 423
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 424
            if detailedStatus.lower() in value:
13995 amit.gupta 425
                return key
426
 
14676 amit.gupta 427
        print "Detailed Status need to be mapped", "Store:", self.store_id
13995 amit.gupta 428
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 429
    def scrapeAffiliate(self, startDate=None, endDate=None):
14650 amit.gupta 430
        br = getBrowserObject()
431
        br.add_password('https://assoc-datafeeds-eu.amazon.com', 'Saholic', 'Fnubyvp')
432
        url = AMAZON_AFF_URL
433
        response = br.open(url)
434
        #get data for past 40 days and store it to mongo
435
        dt = datetime.now()
14651 amit.gupta 436
        dat = dt - timedelta(days=3)
437
        url = AMAZON_AFF_FILE_URL%(datetime.strftime(dat, "%Y%m%d"))
438
        response = br.open(url)
439
        page = gzip.GzipFile(fileobj=response, mode='rb').read()
440
        j=-1
441
        for row in page.split("\n"):
442
            j += 1
443
            if j== 0 or j==1:
444
                continue
445
            fields = row.split("\t")
446
            if len(fields)>1:
447
                print fields
448
                amazonAffiliate = AmazonAffiliateInfo(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8], fields[9])
449
                print amazonAffiliate
450
                self.db.amazonAffiliateInfo.insert(todict(amazonAffiliate))
451
            else:
452
                break
14650 amit.gupta 453
 
14608 amit.gupta 454
 
455
    def parseTrackingUrl(self, br, trackingUrl):
14624 amit.gupta 456
        subOrder = {}
14608 amit.gupta 457
        response = br.open(trackingUrl)
458
        page = ungzipResponse(response)
14624 amit.gupta 459
        soup = BeautifulSoup(page)
460
        alertContainer = soup.find("div", {"class":"a-box-inner a-alert-container"})
461
        if alertContainer is not None:
462
            statusText = alertContainer.h4.span.text
463
            detailedStatus = statusText.split(":")[0].strip()
464
            subOrder['detailedStatus'] = detailedStatus
465
            if detailedStatus.lower() == "in transit":
466
                pass
467
            elif detailedStatus.lower() == "undeliverable":
468
                subOrder['status'] = MStore.ORDER_CANCELLED
469
                return subOrder
470
        else:
471
            summaryLeft = soup.find(id="summaryLeft")
472
            statusText = summaryLeft.h2.text
473
            detailedStatus = statusText.split(":")[0].strip()
474
            subOrder['detailedStatus'] = detailedStatus
475
            if detailedStatus.lower() == "delivered":
476
                subOrder['deliveredOn'] = summaryLeft.findAll("span")[-2].text.strip()
477
                subOrder['status'] = MStore.ORDER_DELIVERED
478
                return subOrder
479
            else:
480
                subOrder['expectedDelivery'] = summaryLeft.findAll("span")[-1].text.strip()
481
        return subOrder
482
 
483
 
484
 
14608 amit.gupta 485
 
486
 
13927 amit.gupta 487
 
488
 
13774 amit.gupta 489
def main():
490
    store = getStore(1)
14650 amit.gupta 491
#    br = mechanize.Browser()
492
#    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'),
493
#                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
494
#                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
495
#                     ('Accept-Language', 'en-US,en;q=0.8'),                     
496
#                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
497
#    store.scrapeStoreOrders()
498
    #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 499
    readSSh("/tmp/User211/2015-04-01 15:31:42.250309")
14650 amit.gupta 500
    store.scrapeAffiliate()
14162 amit.gupta 501
def readSSh(fileName):
502
    try:
503
            str1 = open(fileName).read()
504
            return str1
505
    except:
506
        ssh_client = SSHClient()
507
        str1 = ""
508
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
509
        ssh_client.connect('104.200.25.40', 22, 'root', 'ecip$dtrMay2014')
510
        sftp_client = ssh_client.open_sftp()
511
        try:
14299 amit.gupta 512
            if not os.path.exists(os.path.dirname(fileName)):
513
                os.makedirs(os.path.dirname(fileName))
14162 amit.gupta 514
            sftp_client.get(fileName, fileName)
515
            try:
516
                str1 = open(fileName).read()
517
                return str1
518
            finally:
519
                pass
520
        except:
521
            "could not read"
522
        return str1
13774 amit.gupta 523
 
524
 
525
if __name__ == '__main__':
14284 amit.gupta 526
        main()