Subversion Repositories SmartDukaan

Rev

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